首页 > 其他分享 >neovim 配置 LSP(ccls)

neovim 配置 LSP(ccls)

时间:2024-11-17 19:07:54浏览次数:1  
标签:neovim ccls commands lspconfig -- compile json LSP

本文主要介绍如何在 nvim 中配置使用 ccls。

安装与配置

首先安装 LSP 管理插件:

... -- 省略其他行
require("lazy").setup({
	-- LSP manager
	"williamboman/mason.nvim",
	"williamboman/mason-lspconfig.nvim",
	"neovim/nvim-lspconfig",
    ... -- 省略其他行
})

其中 mason-lspconfig 中只有 clangd,目前(2024/11/17)没有支持 ccls,因此我们使用 nvim-lspconfig。

安装 ccls 的教程可以参考我的另外一篇文章。

配置如下:

local lspconfig = require('lspconfig')
local util = require 'lspconfig.util'
lspconfig.ccls.setup {
  on_attach = on_attach,
  -- 开启单文件支持
  single_file_support = true,
  -- 根目录获取规则
  root_dir = function(fname)
    return util.root_pattern('compile_commands.json', '.ccls')(fname) or util.find_git_ancestor(fname) or vim.fn.getcwd()
  end,
  -- 初始化参数
  init_options = {
    compilationDatabaseDirectory = "",
    cache = {
      directory = ".ccls-cache"
    },
    index = {
      threads = 32;
    },
    -- 需要读者定制化添加,有一些系统库并没有被 clang 默认索引
    -- 可通过 clang++ -v -E -x c++ - 查看默认的 include 路径
    clang = {
      extraArgs = { 
        "-I/usr/include", 
        "-I/usr/local/include", 
        "-I/usr/include/c++/13",
      },
      resourceDir = ""
    } 
  }
}

官方配置参考:nvim-lspconfig/doc/configs.md at master · neovim/nvim-lspconfig

除了编写 .ccls 文件或者 compile_commands.json 文件,还可以通过添加命令行参数和初始化选项这两种方式能够使 ccls 正常工作以外。对于大项目而言(通过 cmake 或者 makefile),生成 compile_commands.json 是比较方便的,我们在后文具体讲讲如何生成。

但对于单文件来说,添加初始化参数是最方便的形式,我们在上面的配置中开启了单文件支持,并添加了系统 include 路径,最重要的,我们修改了 root_dir 的获取方式,新增了 vim.fn.getcwd() 来获取 nvim 当前的打开路径,在此之前,lspconfig 只支持查找 .ccls 和 compile_commands.json 的所在目录以及当前 git 文件所在目录,而对于一个单文件来说这些文件都没有。lspconfig ccls 还支持更多的参数配置,可参考:Customization · MaskRay/ccls Wiki

在 Ubuntu 上使用 ccls 时,ccls 会根据项目的 编译数据库compile_commands.json)来生成索引,并将结果存储在 ccls-cache 目录中。如果你想自动生成 ccls-cache,需要完成以下步骤:

生成 compile_commands.json 文件

ccls 需要通过 compile_commands.json 来了解项目的编译信息。以下是生成这个文件的方法:

使用 CMake 生成

  1. 在项目根目录下运行:

    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON <path/to/your/project>
    
  2. compile_commands.json 将生成在项目的构建目录(通常是 build/)。

  3. 如果需要将其复制到项目根目录:

    cp build/compile_commands.json .
    

其他构建工具生成

  • Makefile 项目:可以使用工具如 Bear 生成:

    sudo apt install bear
    bear -- make <your_project_name>
    

    这将在项目根目录生成 compile_commands.json

  • 手动生成:如果项目简单,也可以手动编写一个 compile_commands.json,但这不推荐,因为容易出错。

配置好的样子:

image-20241117190821333

参考

标签:neovim,ccls,commands,lspconfig,--,compile,json,LSP
From: https://www.cnblogs.com/1625--H/p/18550924

相关文章

  • 结合使用VSCode和Neovim
    原文回看第一次我发布记录初步配置好neovim的帖子已经过去了两年。说实话,我并没有用neovim提高我的工作效率,不如说配置它倒是花费了我很多时间。刚开始遇见neovim,我觉得它很酷炫,丰富的插件生态,使用lua而不是“难懂”的viml,结合tmux等终端工具,我感觉我也可以像大神那样,用纯键盘流......
  • wsl2踩坑日记(配置代理/zsh+p10k/Neovim)
    1.proxywsl--installUbuntu-24.04安装好wsl之后,测试了一下v2rayN的代理能不能正常使用(用vultr服务器搭建的校园网ipv6免流),发现可以curlwww.google.com,但是sudoapt-getupdate报错Clearsignedfileisn'tvalid,got'NOSPLIT'(doesthenetworkrequireauthe......
  • 【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关
    一、xss之过滤<svgonload=alert("过关啦")>二、xss之htmlspecialcharsjavascript:alert(123)原理:输入测试文本为herf的属性值和内容值,所以转换思路直接变为js代码OK了三、xss之href输出JavaScript:alert('假客套')原理:测试一个文本,输入提交之后,成了为了蓝色文本......
  • --kubeconfig 参数和 tlsCertFile 与 tlsPrivateKeyFile
    在Kubernetes中,--kubeconfig参数和tlsCertFile与tlsPrivateKeyFile参数的主要作用和区别可以总结如下:--kubeconfig 参数主要作用:提供一个kubeconfig文件,其中包含了Kubelet与KubernetesAPI服务器通信所需的所有配置信息。这个文件通常包含API服务器的地址......
  • VC++ __declspec(dllexport) 和 __declspec(dllimport)
    头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。Class中含有一个静态变量,生成dll的时候只采用了__declspec(dllexport),使用的时候__declspec(dllimport)就派上用场了,他会告诉使用dll的工程去lib中找......
  • neovim 配置
    installcurl-LOhttps://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz#或直接到releases中下载,linux系统要注意glibc版本sudorm-rf/opt/nvimsudotar-C/opt-xzfnvim-linux64.tar.gzexportPATH="\(PATH:/opt/nvim-linux64/bin"#......
  • msvc的__declspec(dllexport)
    一、__declspec(dllexport)的含义_declspec(dllexport) 是Microsoft特定的一个编译器扩展,用于指示编译器将符号导出到动态链接库(DLL)中。它并不是一个标准C++关键字或语法,而是 __declspec 关键字的一个特定用法。__declspec 是"declarespecifier"的缩写,表示声明说明符......
  • llm.nvim 支持在neovim中使用kimi
    llm.nvim(https://github.com/Kurama622/llm.nvim)是一个为大型语言模型(LLM)设计的通用插件,旨在使用户能够在neovim中与LLM进行交互。您可以自定义您希望使用的任何LLM(比如智谱清言、kimi、通义千问等)。最后,也是最重要的,您可以使用各种免费模型(无论是由Cloudflare还是其......
  • 题解:洛谷P9934 [NFLSPC #6] 绝不能忘记的事……
    题目链接:洛谷P9934[NFLSPC#6]绝不能忘记的事……我hatelove大力分讨。这道题先分三种大情况:N在左边,N在中间,N在右边。声明:以下分类讨论中,a,b,c,d均为记住的字符串。记录操作N在左边当复制串形如Nab,可以用map<string,int>记录。当复制串形如NaH,那么......
  • nvim 配置,neovim配置
    背景:因为vim配置的非常的复杂,所以了解到了一个新的vim,neovim。通过lazyvim这个功能来自动化的配置neovim。已达到在终端中就可以编程。原文仓库:https://github.com/folke/lazy.nvim.git原文文档仓库:https://lazyvim.github.io本人fork仓库:https://github.com/xin2233/LazyV......