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

时间:2014-01-24 17:52:34

标签: vim ftplugin

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

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

map <F5> :w<CR>:!clang % -o %:r.out && ./%:r.out<CR>

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

map <F5> :w<CR>:!clang++ -ggdb -pthread -std=c++11 % -o %:r.out && ./%:r.out<CR>

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

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

2 个答案:

答案 0 :(得分:10)

vim附带的cpp ftplugin包含以下行:

runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim

这意味着它将来源~/.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和quickfix列表。例如setlocal makprg clang\ %\ -o\ %:r.out

如需更多帮助,请参阅:

:h :map
:h :map-local
:h 'makeprg'
:h :make
:h quickfix

答案 1 :(得分:2)

如果将文件移动到/after/ftplugin/文件夹,则仍会在C ++文件上执行C特定说明。但是你的C ++指令将在C语言之后执行。

如果您想避免此行为,请在~/.vim/ftplugin/c.vim文件

的开头添加此行为
if (&ft != 'c')
    finish
endif