Concat and apply git highlight inside the builder. This allows to not leak private data from builder to the git component. This will also now allow us to customize git icon placement.
108 lines
2.9 KiB
Lua
108 lines
2.9 KiB
Lua
local log = require "nvim-tree.log"
|
|
local view = require "nvim-tree.view"
|
|
local _padding = require "nvim-tree.renderer.components.padding"
|
|
local icon_component = require "nvim-tree.renderer.components.icons"
|
|
local help = require "nvim-tree.renderer.help"
|
|
local git = require "nvim-tree.renderer.components.git"
|
|
local core = require "nvim-tree.core"
|
|
local Builder = require "nvim-tree.renderer.builder"
|
|
|
|
local api = vim.api
|
|
|
|
local M = {
|
|
last_highlights = {},
|
|
}
|
|
|
|
local namespace_id = api.nvim_create_namespace "NvimTreeHighlights"
|
|
|
|
local function _draw(bufnr, lines, hl)
|
|
api.nvim_buf_set_option(bufnr, "modifiable", true)
|
|
api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
|
|
M.render_hl(bufnr, hl)
|
|
api.nvim_buf_set_option(bufnr, "modifiable", false)
|
|
end
|
|
|
|
function M.render_hl(bufnr, hl)
|
|
if not bufnr or not api.nvim_buf_is_loaded(bufnr) then
|
|
return
|
|
end
|
|
api.nvim_buf_clear_namespace(bufnr, namespace_id, 0, -1)
|
|
for _, data in ipairs(hl or M.last_highlights) do
|
|
api.nvim_buf_add_highlight(bufnr, namespace_id, data[1], data[2], data[3], data[4])
|
|
end
|
|
end
|
|
|
|
local function should_show_arrows()
|
|
return not M.config.indent_markers.enable
|
|
and icon_component.configs.show_folder_icon
|
|
and icon_component.configs.show_folder_arrows
|
|
end
|
|
|
|
local picture_map = {
|
|
jpg = true,
|
|
jpeg = true,
|
|
png = true,
|
|
gif = true,
|
|
}
|
|
|
|
local function get_special_files_map()
|
|
return vim.g.nvim_tree_special_files
|
|
or {
|
|
["Cargo.toml"] = true,
|
|
Makefile = true,
|
|
["README.md"] = true,
|
|
["readme.md"] = true,
|
|
}
|
|
end
|
|
|
|
function M.draw()
|
|
local bufnr = view.get_bufnr()
|
|
if not core.get_explorer() or not bufnr or not api.nvim_buf_is_loaded(bufnr) then
|
|
return
|
|
end
|
|
|
|
local ps = log.profile_start "draw"
|
|
|
|
local cursor = api.nvim_win_get_cursor(view.get_winnr())
|
|
_padding.reload_padding_function()
|
|
icon_component.reset_config(M.config.icons.webdev_colors)
|
|
git.reload()
|
|
|
|
local lines, hl
|
|
if view.is_help_ui() then
|
|
lines, hl = help.compute_lines()
|
|
else
|
|
lines, hl = Builder.new(core.get_cwd())
|
|
:configure_initial_depth(should_show_arrows())
|
|
:configure_root_modifier(vim.g.nvim_tree_root_folder_modifier)
|
|
:configure_trailing_slash(vim.g.nvim_tree_add_trailing == 1)
|
|
:configure_special_map(get_special_files_map())
|
|
:configure_picture_map(picture_map)
|
|
:configure_opened_file_highlighting(vim.g.nvim_tree_highlight_opened_files)
|
|
:configure_git_icons_padding(vim.g.nvim_tree_icon_padding)
|
|
:build_header(view.is_root_folder_visible(core.get_cwd()))
|
|
:build(core.get_explorer())
|
|
:unwrap()
|
|
end
|
|
|
|
_draw(bufnr, lines, hl)
|
|
M.last_highlights = hl
|
|
|
|
if cursor and #lines >= cursor[1] then
|
|
api.nvim_win_set_cursor(view.get_winnr(), cursor)
|
|
end
|
|
|
|
log.profile_end(ps, "draw")
|
|
end
|
|
|
|
function M.setup(opts)
|
|
M.config = {
|
|
indent_markers = opts.renderer.indent_markers,
|
|
icons = opts.renderer.icons,
|
|
}
|
|
|
|
_padding.setup(opts)
|
|
end
|
|
|
|
return M
|