better git format and parsing

This commit is contained in:
kyazdani42
2020-02-19 16:24:49 +01:00
parent 1c4fb795fb
commit 05b5117f75
5 changed files with 72 additions and 50 deletions

BIN
.github/tree.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 82 KiB

View File

@@ -18,8 +18,7 @@
- [x] Mouse support - [x] Mouse support
## TODO ## TODO
- [ ] find a good way to display git info - [ ] handle colorscheme better (right now its based on random global variables that might not be loaded at vim start)
- [ ] better parsing of the git porcelain results
- [ ] handle permissions properly (TODO: display error on Read access denied) - [ ] handle permissions properly (TODO: display error on Read access denied)
- [ ] buffer / window should not disappear when only the tree is opened - [ ] buffer / window should not disappear when only the tree is opened

View File

@@ -71,11 +71,12 @@ local function format_tree(tree)
for i, node in pairs(tree) do for i, node in pairs(tree) do
local padding = get_padding(node.depth) local padding = get_padding(node.depth)
local git = node.git
local icon = "" local icon = ""
if node.icon == true then if node.icon == true then
icon = get_icon(node.path .. node.name, node.dir, node.open) icon = get_icon(node.path .. node.name, node.dir, node.open)
end end
dirs[i] = padding .. icon .. node.name dirs[i] = padding .. icon .. git .. node.name
end end
return dirs return dirs
@@ -109,48 +110,60 @@ local HIGHLIGHT_GROUPS = {
['^.*%.html?$'] = 'HtmlFile'; ['^.*%.html?$'] = 'HtmlFile';
} }
local function highlight_git(highlight, node, line, col_start)
if node.git ~= '' then
highlight('LuaTreeGit'..node.git, line, col_start, -1)
return true
end
return false
end
local function highlight_line(buffer) local function highlight_line(buffer)
local function highlight(group, line, from, to) local function highlight(group, line, from, to)
vim.api.nvim_buf_add_highlight(buffer, -1, group, line, from, to) vim.api.nvim_buf_add_highlight(buffer, -1, group, line, from, to)
end end
return function(line, node) return function(line, node)
local text_start = node.depth * 2 local text_start = node.depth * 2 + 4
if node.dir then local gitlen = string.len(node.git)
if node.name ~= '..' then if node.name == '..' then
highlight('LuaTreeFolderIcon', line, 0, text_start + 4)
if highlight_git(highlight, node, line, text_start + 4) == false then
highlight('LuaTreeFolderName', line, text_start + 4, -1)
end
else
highlight('LuaTreeFolderName', line, 0, -1) highlight('LuaTreeFolderName', line, 0, -1)
end
return elseif node.dir == true then
highlight('LuaTreeFolderIcon', line, 0, text_start)
highlight('LuaTreeFolderName', line, text_start + gitlen, -1)
elseif is_special(node.name) == true then elseif is_special(node.name) == true then
highlight('LuaTreeSpecialFile', line, text_start, -1) text_start = text_start - 4
highlight('LuaTreeSpecialFile', line, text_start + gitlen, -1)
elseif is_executable(node.path .. node.name) then elseif is_executable(node.path .. node.name) then
highlight('LuaTreeExecFile', line, text_start, -1) text_start = text_start - 4
highlight('LuaTreeExecFile', line, text_start + gitlen, -1)
elseif is_pic(node.path .. node.name) then elseif is_pic(node.path .. node.name) then
highlight('LuaTreeImageFile', line, text_start, -1) text_start = text_start - 4
highlight('LuaTreeImageFile', line, text_start + gitlen, -1)
else else
for k, v in pairs(HIGHLIGHT_GROUPS) do for k, v in pairs(HIGHLIGHT_GROUPS) do
if string.match(node.name, k) ~= nil then if string.match(node.name, k) ~= nil then
highlight('LuaTree' .. v, line, 0, text_start + 4) highlight('LuaTree' .. v, line, 0, text_start)
highlight_git(highlight, node, line, text_start + 4) break
return
end end
end end
end end
highlight_git(highlight, node, line, text_start)
if node.git == '' then return end
if node.git == '' then
highlight('LuaTreeGitDirty', line, text_start, text_start + gitlen)
elseif node.git == '' then
highlight('LuaTreeGitStaged', line, text_start, text_start + gitlen)
elseif node.git == '✓★ ' then
highlight('LuaTreeGitStaged', line, text_start, text_start + 3)
highlight('LuaTreeGitNew', line, text_start + 3, text_start + gitlen)
elseif node.git == '✓✗ ' then
highlight('LuaTreeGitStaged', line, text_start, text_start + 3)
highlight('LuaTreeGitDirty', line, text_start + 3, text_start + gitlen)
elseif node.git == '' then
highlight('LuaTreeGitMerge', line, text_start, text_start + gitlen)
elseif node.git == '' then
highlight('LuaTreeGitRenamed', line, text_start, text_start + gitlen)
elseif node.git == '' then
highlight('LuaTreeGitNew', line, text_start, text_start + gitlen)
end
end end
end end

View File

@@ -1,4 +1,5 @@
local function system(v) return vim.api.nvim_call_function('system', { v }) end local function system(v) return vim.api.nvim_call_function('system', { v }) end
local function systemlist(v) return vim.api.nvim_call_function('systemlist', { v }) end
local function is_git_repo() local function is_git_repo()
local is_git = system('git rev-parse') local is_git = system('git rev-parse')
@@ -9,7 +10,7 @@ local IS_GIT_REPO = is_git_repo()
local function set_git_status() local function set_git_status()
if IS_GIT_REPO == false then return '' end if IS_GIT_REPO == false then return '' end
return system('git status --porcelain=v1') return systemlist('git status --porcelain=v1')
end end
local GIT_STATUS = set_git_status() local GIT_STATUS = set_git_status()
@@ -26,31 +27,41 @@ local function force_refresh_git()
end end
local function is_folder_dirty(relpath) local function is_folder_dirty(relpath)
return string.match(GIT_STATUS, relpath) ~= nil for _, status in pairs(GIT_STATUS) do
if string.match(status, relpath) ~= nil then return true end
end
end end
local function create_git_checker(pattern) local function create_git_checker(pattern)
return function(relpath) return function(relpath)
local ret = string.match(GIT_STATUS, '^.*' .. relpath) for _, status in pairs(GIT_STATUS) do
if ret == nil then return false end local ret = string.match(status, '^.. ' .. relpath)
return string.match(ret, pattern) ~= nil if ret ~= nil and string.match(ret, pattern) ~= nil then return true end
end
return false
end end
end end
local is_modified = create_git_checker('^ ?MM?') local unstaged = create_git_checker('^ ')
local is_staged = create_git_checker('^ ?A') local staged = create_git_checker('^M ')
local is_unmerged = create_git_checker('^ ?UU') local staged_new = create_git_checker('^A ')
local is_untracked = create_git_checker('^%?%?') local staged_mod = create_git_checker('^MM')
local unmerged = create_git_checker('^[U ][U ]')
local renamed = create_git_checker('^R')
local untracked = create_git_checker('^%?%?')
local function get_git_attr(path, is_dir) local function get_git_attr(path, is_dir)
if IS_GIT_REPO == false then return '' end if IS_GIT_REPO == false then return '' end
if is_dir then if is_dir then
if is_folder_dirty(path) == true then return 'Dirty' end if is_folder_dirty(path) == true then return '' end
else else
if is_modified(path) then return 'Modified' if unstaged(path) then return ''
elseif is_staged(path) then return 'Staged' elseif staged(path) then return ''
elseif is_unmerged(path) then return 'Unmerged' elseif staged_new(path) then return '✓★ '
elseif is_untracked(path) then return 'Untracked' elseif staged_mod(path) then return '✓✗ '
elseif unmerged(path) then return ''
elseif renamed(path) then return ''
elseif untracked(path) then return ''
end end
end end

View File

@@ -34,12 +34,11 @@ execute 'hi def LuaTreeRustFile guifg='.g:terminal_color_11
execute 'hi def LuaTreeVimFile guifg='.g:terminal_color_10 execute 'hi def LuaTreeVimFile guifg='.g:terminal_color_10
execute 'hi def LuaTreeTypescriptFile guifg='.g:terminal_color_12 execute 'hi def LuaTreeTypescriptFile guifg='.g:terminal_color_12
" TODO: fix those colors to be better or maybe info git with letters instead of colors execute 'hi def LuaTreeGitDirty guifg='.g:terminal_color_9
execute 'hi def LuaTreeGitModified gui=NONE guifg='.g:terminal_color_13 execute 'hi def LuaTreeGitStaged guifg='.g:terminal_color_2
execute 'hi def LuaTreeGitStaged gui=NONE guifg='.g:terminal_color_2 execute 'hi def LuaTreeGitMerge guifg='.g:terminal_color_11
execute 'hi def LuaTreeGitUntracked gui=NONE guifg='.g:terminal_color_6 execute 'hi def LuaTreeGitRenamed guifg='.g:terminal_color_6
execute 'hi def LuaTreeGitUnmerged gui=NONE guifg='.g:terminal_color_3 execute 'hi def LuaTreeGitNew guifg='.g:terminal_color_3
execute 'hi def LuaTreeGitDirty gui=NONE guifg='.g:terminal_color_13
au BufWritePost * lua require'tree'.refresh() au BufWritePost * lua require'tree'.refresh()