4

我正在学习 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并按预期工作。

4

2 回答 2

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修复列表。例如setlocal makprg clang\ %\ -o\ %:r.out

如需更多帮助,请参阅:

:h :map
:h :map-local
:h 'makeprg'
:h :make
:h quickfix
于 2014-01-24T18:13:50.200 回答
5

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

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

if (&ft != 'c')
    finish
endif
于 2015-12-30T19:56:25.903 回答