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
| Package manager | Snippet | 
|---|---|
use {"artemave/workspace-diagnostics.nvim"} | 
|
Plug "artemave/workspace-diagnostics.nvim" | 
|
require("lazy").setup({"artemave/workspace-diagnostics.nvim"}) | 
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.
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' },
  },
})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