对于C++文件,Vim ftplugin执行c.vim而不是cpp.vim

Bab*_*yan 3 vim ftplugin

我正在学习Vim,我希望通过将F5键映射到由文件类型决定的编译命令来将其设置为IDE.

我的~/.vim/ftplugin/c.vim:

map <F5> :w<CR>:!clang % -o %:r.out && ./%:r.out<CR>
Run Code Online (Sandbox Code Playgroud)

我的~/.vim/ftplugin/cpp.vim:

map <F5> :w<CR>:!clang++ -ggdb -pthread -std=c++11 % -o %:r.out && ./%:r.out<CR>
Run Code Online (Sandbox Code Playgroud)

当我打开一个C++文件(带.cpp扩展名)并点击F5时,执行命令c.vim.为什么会这样?

当我删除文件c.vim,然后Vim加载cpp.vim并按预期工作.

Pet*_*ker 10

vim附带的cpp ftplugin具有以下行:

runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
Run Code Online (Sandbox Code Playgroud)

这意味着它将采购~/.vim/ftplugin/c.vim.

要克服这一点的方法是把你的映射关系~/.vim/after/ftplugin/cpp.vim~/.vim/after/ftplugin/c.vim文件.

但你的问题不止于此:

  • 您正在使用:map您可能想要至少提供模式的地方.nmap
  • 你也应该这样使用noremap它会变成nnoremap
  • 您的映射是全局的,因此<f5>每次打开cpp并切换到c文件时它都会踩踏您的映射.您应该将其设置为特定缓冲区的本地.nnoremap <buffer>
  • 您可能也应该makeprg相应地进行设置,以便您可以利用:make和快速修复列表.例如setlocal makprg clang\ %\ -o\ %:r.out

有关更多帮助请参阅:

:h :map
:h :map-local
:h 'makeprg'
:h :make
:h quickfix
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您将文件移动到该/after/ftplugin/文件夹中,您的 C 特定指令仍将在您的 C++ 文件上执行。但是您的 C++ 指令将在 C 指令之后执行。

如果您想避免这种行为,请将其添加到~/.vim/ftplugin/c.vim文件的开头

if (&ft != 'c')
    finish
endif
Run Code Online (Sandbox Code Playgroud)