/workspace-diagnostics.nvim

Populate diagnostics for _all_ projects files, not just opened ones.

Primary LanguageLuaMIT LicenseMIT

workspace-diagnostics.nvim

Populates project-wide lsp diagnostcs, regardless of what files are opened.

This post goes into details of lsp diagnostics and how this plugin works.

Demo

Here you can see that even though a single file gets opened, the diagnostics are populated for other files as well.

workspace_diagnostics.mp4

📋 Installation

Package manager Snippet

wbthomason/packer.nvim

use {"artemave/workspace-diagnostics.nvim"}

junegunn/vim-plug

Plug "artemave/workspace-diagnostics.nvim"

folke/lazy.nvim

require("lazy").setup({"artemave/workspace-diagnostics.nvim"})

⚡️ Usage

Populate workspace diagnostcs when an lsp client is attached:

require('lspconfig').tsserver.setup({
  on_attach = function(client, bufnr)
                ...
                require("workspace-diagnostics").populate_workspace_diagnostics(client, bufnr)
                ...
              end
})

Despite its placement, populate_workspace_diagnostics will actually do the work only once per client.

Alternatively, you can trigger it explicitly via a keybinding. E.g., the following code maps <space>x to populate workspace diagnostics:

vim.api.nvim_set_keymap('n', '<space>x', '', {
  noremap = true,
  callback = function()
    for _, client in ipairs(vim.lsp.buf_get_clients()) do
      require("workspace-diagnostics").populate_workspace_diagnostics(client, 0)
    end
  end
})

Caveat: this only populates diagnostics for the files that share type with the current buffer. E.g., in a rails project, if you run this in a javascript file, you'll get diagnostics for all javascript files, but not ruby files.

⚙ Configuration

You can configure a different function that returns a list of project files (it defaults to the output of git ls-files).

require("workspace-diagnostics").setup({
  workspace_files = function()
    return { 'index.js', 'lib/banana.js' }
  end
})

Some lsp clients do not advertise filetypes they cover, which makes it impossible for this plugin to select relevant project files. In this case, you'll see a warning, and you'll need to explicitly add filetypes when setting up the client. E.g.:

require("roslyn").setup({
  config = {
    filetypes = { 'cs' },
  },
})

⌨ Contributing

PRs and issues are always welcome. Make sure to provide as much context as possible when opening one.

To run make lint locally, you'd need to install stylua:

cargo install stylua --features lua52