近期需要阅读 Linux Kernel 的源码,因为我日常使用 NeoVim + coc.nvim 在 Ubuntu 上进行开发,以下是我的配置记录。

  • NeoVim: 是 Vim 的一个 fork 版本,可以使用 Lua 进行配置和扩展
  • coc.nvim: 是一套使用 javascript 开发的 LSP 实现,目标是贴近 VsCode 的使用体验
  • ccls: 是 C/C++/Objective-C 的 Language Server 实现
  • bear: 用于记录传递给编译器的命令以构建 compile_commands.json

安装依赖

apt install clang libclang-14-dev bear

安装 ccls

git clone --depth=1 --recursive https://github.com/MaskRay/ccls
cd ccls
cmake -H. -BRelease -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/path/to/clang+llvm-xxx
cmake --build Release
ccls --version

配置 coc.nvim

{
  "languageserver": {
    "ccls": {
      "command": "ccls",
      "filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"],
      "rootPatterns": [".ccls", "compile_commands.json", ".git/", ".hg/"],
      "initializationOptions": {
        "cache": {
          "directory": "/tmp/ccls"
        }
      }
    }
  }
}

克隆 Linux Kernel 并索引

git clone git@github.com:torvalds/linux.git
cd linux

# 此处我打算查看 x86 架构的代码
make O=. ARCH=x86 COMPILED_SOURCE=1 cscope tags

# 使用 bear 来监控一次构建,用于生成 compile_commands.json
bear -- make -j 8

完成上述步骤之后,通过 nvim 打开 内核代码 就可以通过 gd 来跳转定义了。