为什么 Neovim 中的“.tpp”文件扩展名的代码补全不起作用?

问题描述 投票:0回答:1

我已经为 Neovim 安装了 nvim-lspconfignvim-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>
而没有其他内容。

c++ lua neovim file-extension code-completion
1个回答
0
投票

正如 @HighCommander4GitHub

上提到的

.tpp
不是 clang 识别为 C++ 文件类型的文件扩展名。

如果您在编译命令中显式指定

.tpp
标志(例如,使用
clangd 配置文件
),您仍然可以让 clangd 将 -xc++ 文件作为 C++ 处理。

为了使代码完成适用于非标准 C++ 文件扩展名,我必须向编译器指定

-xc++
参数,例如
g++ -xc++
clang -xc++

因此,对于 clangd,在

.clangd
配置文件中,我必须添加一个
-xc++
参数,它将如下所示:

CompileFlags:
  Add: [-xc++]

对于使用 GCC 编译器的

ccls
.ccls 配置文件,它将如下所示:

g++
-xc++

万岁!

.tpp
文件的代码完成终于开始工作了!

© www.soinside.com 2019 - 2024. All rights reserved.