Neovim LSP with Linux Kernel

Ricardo B. Marliere ricardo at marliere.net
Tue Sep 19 08:46:09 EDT 2023


On 23/09/19 12:45PM, Maciej Wieczór-Retman wrote:
> On 2023-09-19 at 06:24:24 -0300, Ricardo B. Marliere wrote:
> >On 23/09/19 09:45AM, Maciej Wieczór-Retman wrote:
> >> Hi,
> >> I'm using neovim for a long time now and I've been using ccls as the LSP
> >> for anything in C. It's working very well with userspace programs (with
> >> "bear -- make" to generate compile_commands.json) but it seems to take
> >> up a lot of CPU power whenever I reboot and open any kernel code.
> >> 
> >> The kernel provides it's own way to get compile_commands.json and I
> >> understand that ccls needs a bit of time to index these thousands of
> >> files.
> >> 
> >> But does anyone know if there is a way to avoid indexing files so often?
> >> Or maybe is there a better LSP for C? I couldn't really find anything
> >> else and I'm running Arch Linux which suggests it's the recommended one
> >> for C.
> >
> >Hey there Maciej!
> >
> >I've been using clangd with no problems, the indexing is expensive but
> >after that it's a breeze. Are you cleaning your tree very often?
> 
> Yes, quite often lately. Does it affect the indexing? I'll try using
> output directory for .o files and binaries and I'll clean that less, maybe
> that will help. Thanks.

I think this is what's causing the constant re-indexing, then. Maybe use
a 'static' tree-dir just for browsing the code using the LSP? The output
directory is a good idea, I'll try it out aswell - thanks!
> 
> >(...)
> >local lspconfig = require("lspconfig")
> >local get_servers = require("mason-lspconfig").get_installed_servers
> >for _, server_name in ipairs(get_servers()) do
> >  if server_name == "clangd" then
> >    local compile_commands = vim.fn.getcwd() .. "/compile_commands.json"
> >    if vim.fn.filereadable(compile_commands) == 1 then
> >      lspconfig[server_name].setup({
> >        on_attach = LSPAttach,
> >        capabilities = LSPCapabilities,
> >        offset_encoding = "utf-16",
> >      })
> >    end
> >  else
> >    lspconfig[server_name].setup({
> >      on_attach = LSPAttach,
> >      capabilities = LSPCapabilities,
> >      offset_encoding = "utf-16",
> >    })
> >  end
> >end
> >
> 
> I see you're using mason-lspconfig. Is the default nvim-lspconfig worse
> somehow? I picked it because it seemed pretty simple and I wanted to
> start with something straight forward but maybe mason handles some stuff
> better?

Mason is just a nice frontend for installing LSPs, DAPs, Linters and
Formatters. I use it because sometimes I like to explore the available
tooling :)

I shared that snippet only to show the usecase of setting up all
installed servers and starting clangd only if there is a
compile_commands.json available. Thought it could be helpful.

Good luck,
-	Ricardo



More information about the Kernelnewbies mailing list