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.
159 lines
4.5 KiB
Lua
159 lines
4.5 KiB
Lua
local _icons = require "nvim-tree.renderer.icon-config"
|
|
local utils = require "nvim-tree.utils"
|
|
|
|
local M = {}
|
|
|
|
local function build_icons_table()
|
|
local i = M.icon_state.icons.git_icons
|
|
return {
|
|
["M "] = { { icon = i.staged, hl = "NvimTreeGitStaged" } },
|
|
[" M"] = { { icon = i.unstaged, hl = "NvimTreeGitDirty" } },
|
|
["C "] = { { icon = i.staged, hl = "NvimTreeGitStaged" } },
|
|
[" C"] = { { icon = i.unstaged, hl = "NvimTreeGitDirty" } },
|
|
["CM"] = { { icon = i.unstaged, hl = "NvimTreeGitDirty" } },
|
|
[" T"] = { { icon = i.unstaged, hl = "NvimTreeGitDirty" } },
|
|
["T "] = { { icon = i.staged, hl = "NvimTreeGitStaged" } },
|
|
["MM"] = {
|
|
{ icon = i.staged, hl = "NvimTreeGitStaged" },
|
|
{ icon = i.unstaged, hl = "NvimTreeGitDirty" },
|
|
},
|
|
["MD"] = {
|
|
{ icon = i.staged, hl = "NvimTreeGitStaged" },
|
|
},
|
|
["A "] = {
|
|
{ icon = i.staged, hl = "NvimTreeGitStaged" },
|
|
},
|
|
["AD"] = {
|
|
{ icon = i.staged, hl = "NvimTreeGitStaged" },
|
|
},
|
|
[" A"] = {
|
|
{ icon = i.untracked, hl = "NvimTreeGitNew" },
|
|
},
|
|
-- not sure about this one
|
|
["AA"] = {
|
|
{ icon = i.unmerged, hl = "NvimTreeGitMerge" },
|
|
{ icon = i.untracked, hl = "NvimTreeGitNew" },
|
|
},
|
|
["AU"] = {
|
|
{ icon = i.unmerged, hl = "NvimTreeGitMerge" },
|
|
{ icon = i.untracked, hl = "NvimTreeGitNew" },
|
|
},
|
|
["AM"] = {
|
|
{ icon = i.staged, hl = "NvimTreeGitStaged" },
|
|
{ icon = i.unstaged, hl = "NvimTreeGitDirty" },
|
|
},
|
|
["??"] = { { icon = i.untracked, hl = "NvimTreeGitNew" } },
|
|
["R "] = { { icon = i.renamed, hl = "NvimTreeGitRenamed" } },
|
|
[" R"] = { { icon = i.renamed, hl = "NvimTreeGitRenamed" } },
|
|
["RM"] = {
|
|
{ icon = i.unstaged, hl = "NvimTreeGitDirty" },
|
|
{ icon = i.renamed, hl = "NvimTreeGitRenamed" },
|
|
},
|
|
["UU"] = { { icon = i.unmerged, hl = "NvimTreeGitMerge" } },
|
|
["UD"] = { { icon = i.unmerged, hl = "NvimTreeGitMerge" } },
|
|
["UA"] = { { icon = i.unmerged, hl = "NvimTreeGitMerge" } },
|
|
[" D"] = { { icon = i.deleted, hl = "NvimTreeGitDeleted" } },
|
|
["D "] = { { icon = i.deleted, hl = "NvimTreeGitDeleted" } },
|
|
["RD"] = { { icon = i.deleted, hl = "NvimTreeGitDeleted" } },
|
|
["DD"] = { { icon = i.deleted, hl = "NvimTreeGitDeleted" } },
|
|
["DU"] = {
|
|
{ icon = i.deleted, hl = "NvimTreeGitDeleted" },
|
|
{ icon = i.unmerged, hl = "NvimTreeGitMerge" },
|
|
},
|
|
["!!"] = { { icon = i.ignored, hl = "NvimTreeGitIgnored" } },
|
|
dirty = { { icon = i.unstaged, hl = "NvimTreeGitDirty" } },
|
|
}
|
|
end
|
|
|
|
local function nil_() end
|
|
|
|
local function warn_status(git_status)
|
|
utils.warn(
|
|
'Unrecognized git state "'
|
|
.. git_status
|
|
.. '". Please open up an issue on https://github.com/kyazdani42/nvim-tree.lua/issues with this message.'
|
|
)
|
|
end
|
|
|
|
local function get_icons_(node)
|
|
local git_status = node.git_status
|
|
if not git_status then
|
|
return nil
|
|
end
|
|
|
|
local icons = M.git_icons[git_status]
|
|
if not icons then
|
|
if vim.g.nvim_tree_git_hl ~= 1 then
|
|
warn_status(git_status)
|
|
end
|
|
return nil
|
|
end
|
|
|
|
return icons
|
|
end
|
|
|
|
local git_hl = {
|
|
["M "] = "NvimTreeFileStaged",
|
|
["C "] = "NvimTreeFileStaged",
|
|
["AA"] = "NvimTreeFileStaged",
|
|
["AD"] = "NvimTreeFileStaged",
|
|
["MD"] = "NvimTreeFileStaged",
|
|
["T "] = "NvimTreeFileStaged",
|
|
[" M"] = "NvimTreeFileDirty",
|
|
["CM"] = "NvimTreeFileDirty",
|
|
[" C"] = "NvimTreeFileDirty",
|
|
[" T"] = "NvimTreeFileDirty",
|
|
["MM"] = "NvimTreeFileDirty",
|
|
["AM"] = "NvimTreeFileDirty",
|
|
dirty = "NvimTreeFileDirty",
|
|
["A "] = "NvimTreeFileNew",
|
|
["??"] = "NvimTreeFileNew",
|
|
["AU"] = "NvimTreeFileMerge",
|
|
["UU"] = "NvimTreeFileMerge",
|
|
["UD"] = "NvimTreeFileMerge",
|
|
["DU"] = "NvimTreeFileMerge",
|
|
["UA"] = "NvimTreeFileMerge",
|
|
[" D"] = "NvimTreeFileDeleted",
|
|
["DD"] = "NvimTreeFileDeleted",
|
|
["RD"] = "NvimTreeFileDeleted",
|
|
["D "] = "NvimTreeFileDeleted",
|
|
["R "] = "NvimTreeFileRenamed",
|
|
["RM"] = "NvimTreeFileRenamed",
|
|
[" R"] = "NvimTreeFileRenamed",
|
|
["!!"] = "NvimTreeGitIgnored",
|
|
[" A"] = "none",
|
|
}
|
|
|
|
local function get_highlight_(node)
|
|
local git_status = node.git_status
|
|
if not git_status then
|
|
return
|
|
end
|
|
|
|
return git_hl[git_status]
|
|
end
|
|
|
|
M.get_icons = nil_
|
|
M.get_highlight = nil_
|
|
|
|
M.icon_state = _icons.get_config()
|
|
M.git_icons = build_icons_table()
|
|
|
|
function M.reload()
|
|
M.icon_state = _icons.get_config()
|
|
M.git_icons = build_icons_table()
|
|
|
|
if M.icon_state.show_git_icon then
|
|
M.get_icons = get_icons_
|
|
else
|
|
M.get_icons = nil_
|
|
end
|
|
if vim.g.nvim_tree_git_hl == 1 then
|
|
M.get_highlight = get_highlight_
|
|
else
|
|
M.get_highlight = nil_
|
|
end
|
|
end
|
|
|
|
return M
|