我已经为 Neovim 安装了 nvim-lspconfig 和 nvim-cmp 插件。使用 ccls 的代码补全对于
.cpp
和 .hpp
文件扩展名非常有效。我想让代码完成也可以使用 .tpp
文件扩展名。我在 tpp.vim
目录中创建了 ~/.config/nvim/ftdetect
文件,其中包含 au BufRead,BufNewFile *.tpp set filetype=cpp
Vim 脚本。执行此操作后,语法突出显示开始对 .tpp
文件起作用,但代码完成不起作用。
vim.filetype.add({
extension = {
tpp = "cpp",
},
})
我还在
~/.config/nvim/init.lua
文件中添加了这些代码行,代码完成仍然不想开始工作。因此,我已经完成了所有这些工作 - 只有语法突出显示开始适用于 .tpp
文件扩展名,但代码完成则不起作用。我怎样才能完成代码以开始处理此文件扩展名?
lspconfig: require("lspconfig.health").check()
LSP configs active in this session (globally) ~
- Configured servers: ccls
- OK Deprecated servers: (none)
LSP configs active in this buffer (bufnr: 1) ~
- Language client log: ~/.local/state/nvim/lsp.log
- Detected filetype: `cpp`
- 1 client(s) attached to this buffer
- Client: `ccls` (id: 1, bufnr: [1])
root directory: ~/TurboINI/
filetypes: c, cpp, objc, objcpp, cuda
cmd: /usr/local/bin/ccls
version: `Debian ccls version 0.20241108-2-g4331c895`
executable: true
autostart: true
即使LSP检测到该文件的扩展名与C++相关,但代码完成仍然无法正常工作:
我认为这个问题的解决方案隐藏在 ccls 中,而不是在 Neovim 插件中。
附注我在 vi.stackexchange.com 上找到了一篇关于如何使特定文件扩展名的行为与标准 C++ 扩展完全相同的文章,我已经尝试过,但 ccls 仍然不想执行代码完成。在原理上,代码补全是有效的,但作为数据库,它已经接受了您在文件中输入的内容,例如,如果我输入
#include <iostream>
,它的数据库将只包含 #include
和 <iostream>
而没有其他内容。
正如 @HighCommander4 在 GitHub
上提到的不是 clang 识别为 C++ 文件类型的文件扩展名。.tpp
如果您在编译命令中显式指定
标志(例如,使用.tpp
clangd 配置文件),您仍然可以让 clangd 将-xc++
文件作为 C++ 处理。
为了使代码完成适用于非标准 C++ 文件扩展名,我必须向编译器指定
-xc++
参数,例如g++ -xc++
或 clang -xc++
。
因此,对于 clangd,在
.clangd
配置文件中,我必须添加一个 -xc++
参数,它将如下所示:
CompileFlags:
Add: [-xc++]
对于使用 GCC 编译器的
ccls
.ccls
配置文件,它将如下所示:
g++
-xc++
万岁!
.tpp
文件的代码完成终于开始工作了!