Files
nvim-tree.lua/lua/nvim-tree/renderer/components/git.lua
kiyan ce2cf7131f refactor(renderer): refactor git handling
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.
2022-04-26 22:59:16 +02:00

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