问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Neovim配置LSP(ccls)

创作时间:
作者:
@小白创作中心

Neovim配置LSP(ccls)

引用
1
来源
1.
https://www.cnblogs.com/1625--H/p/18550924

本文将详细介绍如何在Neovim中配置LSP(语言服务器协议)使用ccls(C/C++语言服务器)。文章内容包括插件安装、手动安装ccls的方法、nvim-lspconfig的具体配置以及如何生成compile_commands.json文件以支持ccls。

安装与配置

本文使用Lazy vim插件管理器,首先需要安装LSP管理插件:

require("lazy").setup({
    -- LSP manager
    "williamboman/mason.nvim",
    "williamboman/mason-lspconfig.nvim",
    "neovim/nvim-lspconfig",
})

其中mason是方便各种LSP安装和配置的,nvim-lspconfig则是负责与LSP进行交互,而mason-lspconfig则是将两者联系起来。

我们一般在安装LSP时,可以先去mason的列表里面找一下,如果有就直接填空就自动安装好了(例如clangd)。但不幸的是目前(2024/11/17)没有支持ccls,因此我们需要手动安装ccls。

使用Ubuntu的朋友可以参考相关文章来安装ccls。使用其他系统的朋友也可以借鉴一下,源码编译步骤都一样,提前声明可能会遇到一些坑。

nvim-lspconfig的配置如下:

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

除了编写.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

在Ubuntu上使用ccls

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

生成compile_commands.json文件

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

使用CMake生成

在项目根目录下运行:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON <path/to/your/project>

compile_commands.json将生成在项目的构建目录(通常是build/)。

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

cp build/compile_commands.json .

其他构建工具生成

  • Makefile项目:可以使用工具如Bear生成:
sudo apt install bear
bear -- make <your_project_name>

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

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

配置好的样子:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号