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