diff --git a/README.md b/README.md index fde5c9a1..a8dfe47c 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ let g:nvim_tree_disable_netrw = 0 "1 by default, disables netrw let g:nvim_tree_hijack_netrw = 0 "1 by default, prevents netrw from automatically opening when opening directories (but lets you keep its other utilities) let g:nvim_tree_add_trailing = 1 "0 by default, append a trailing slash to folder names let g:nvim_tree_group_empty = 1 " 0 by default, compact folders that only contain a single folder into one node in the file tree +let g:nvim_tree_lsp_diagnostics = 1 "0 by default, will show lsp diagnostics in the tree. See :help nvim_tree_lsp_diagnostics let g:nvim_tree_show_icons = { \ 'git': 1, \ 'folders': 0, @@ -173,6 +174,7 @@ This plugin is very fast because it uses the `libuv` `scandir` and `scandir_next - Change directory with `.` - Add / Rename / delete files - Git integration (icons and file highlight) +- Lsp diagnostics integration (file highlight) - Indent markers - Mouse support - It's fast diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 8ecd5f9e..bdd3372f 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -220,6 +220,12 @@ Can be 0 or 1. When 1, appends a trailing slash to folder names. Can be 0 or 1. When 1, folders that contain only one folder are grouped together. 0 by default. +|g:nvim_tree_lsp_diagnostics| *g:nvim_tree_lsp_diagnostics* + +Can be 0 or 1. When 1, will show nvim-lsp diagnostics in the tree +by highlighting filenames with `NvimTreeLspDiagnostics`. +Code will be executed on `BufWritePost`. 0 by default. + ============================================================================== INFORMATIONS *nvim-tree-info* @@ -360,6 +366,7 @@ NvimTreeSpecialFile NvimTreeImageFile NvimTreeMarkdownFile NvimTreeIndentMarker +NvimTreeLspDiagnostics NvimTreeLicenseIcon NvimTreeYamlIcon diff --git a/lua/nvim-tree/colors.lua b/lua/nvim-tree/colors.lua index 55ced726..9a222001 100644 --- a/lua/nvim-tree/colors.lua +++ b/lua/nvim-tree/colors.lua @@ -34,6 +34,7 @@ local function get_hl_groups() Symlink = { gui = 'bold', fg = colors.cyan }, FolderIcon = { fg = '#8094b4' }, RootFolder = { fg = colors.purple }, + LspDiagnostics = { gui = 'underline' }, ExecFile = { gui = 'bold', fg = colors.green }, SpecialFile = { gui = 'bold,underline', fg = colors.yellow }, @@ -74,8 +75,9 @@ function M.setup() end local higlight_groups = get_hl_groups() for k, d in pairs(higlight_groups) do - local gui = d.gui or 'NONE' - api.nvim_command('hi def NvimTree'..k..' gui='..gui..' guifg='..d.fg) + local gui = d.gui and ' gui='..d.gui or '' + local fg = d.fg and ' guifg='..d.fg or '' + api.nvim_command('hi def NvimTree'..k..gui..fg) end local links = get_links() diff --git a/lua/nvim-tree/diagnostics.lua b/lua/nvim-tree/diagnostics.lua new file mode 100644 index 00000000..3db1103b --- /dev/null +++ b/lua/nvim-tree/diagnostics.lua @@ -0,0 +1,49 @@ +local a = vim.api +local utils = require'nvim-tree.utils' +local get_diagnostics = vim.lsp.diagnostic.get_all + +local M = {} + +local function get_severity(diagnostics) + for _, v in ipairs(diagnostics) do + if v.severity > 0 then + return v.severity + end + end + return 0 +end + +local function highlight_node(node, linenr) + local buf = require'nvim-tree.lib'.Tree.bufnr + if not vim.fn.bufexists(buf) or not vim.fn.bufloaded(buf) then return end + local line = a.nvim_buf_get_lines(buf, linenr, linenr+1, false)[1] + local starts_at = vim.fn.stridx(line, node.name) + a.nvim_buf_add_highlight(buf, -1, 'NvimTreeLspDiagnostics', linenr, starts_at, -1) +end + + +function M.update() + local buffer_severity = {} + + for buf, diagnostics in pairs(get_diagnostics()) do + local bufname = a.nvim_buf_get_name(buf) + if not buffer_severity[bufname] then + local severity = get_severity(diagnostics) + buffer_severity[bufname] = severity + end + end + + vim.defer_fn(function() + local nodes = require'nvim-tree.lib'.Tree.entries + for bufname, severity in pairs(buffer_severity) do + if severity > 0 then + local node, line = utils.find_node(nodes, function(node) + return node.absolute_path == bufname + end) + if node then highlight_node(node, line) end + end + end + end, 100) +end + +return M diff --git a/lua/nvim-tree/utils.lua b/lua/nvim-tree/utils.lua index 372f327e..ee2ed41f 100644 --- a/lua/nvim-tree/utils.lua +++ b/lua/nvim-tree/utils.lua @@ -64,4 +64,22 @@ function M.path_remove_trailing(path) end M.path_separator = path_separator + +-- get the node from the tree that matches the predicate +-- @param nodes list of node +-- @param fn function(node): boolean +function M.find_node(nodes, fn) + local i = 1 + for _, node in ipairs(nodes) do + if fn(node) then return node, i end + if node.open and #node.entries > 0 then + local n, idx = M.find_node(node.entries, fn) + i = i + idx + if n then return n, i end + end + i = i + 1 + end + return nil, i +end + return M diff --git a/plugin/tree.vim b/plugin/tree.vim index 7015b913..79d77ae2 100644 --- a/plugin/tree.vim +++ b/plugin/tree.vim @@ -13,6 +13,9 @@ augroup NvimTree silent! autocmd! FileExplorer * endif au BufWritePost * lua require'nvim-tree'.refresh() + if get(g:, 'nvim_tree_lsp_diagnostics', 0) == 1 + au BufWritePost * lua require'nvim-tree.diagnostics'.update() + endif au BufEnter * lua require'nvim-tree'.buf_enter() if get(g:, 'nvim_tree_auto_close') == 1 au WinClosed * lua require'nvim-tree'.on_leave()