我正在学习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您可能想要至少提供模式的地方.nmapnoremap它会变成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)