better git format and parsing
This commit is contained in:
BIN
.github/tree.png
vendored
BIN
.github/tree.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 82 KiB |
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user