Vim 根据特定文件类型更改F5的映射
我的F5密钥的当前映射为: 当我编辑任何Vim 根据特定文件类型更改F5的映射,vim,keymapping,Vim,Keymapping,我的F5密钥的当前映射为: 当我编辑任何.c或.cpp文件时,F5将映射到此文件: imap <F5> <esc>:w\|!make %<CR> imap:w\|!赚% 我不知道如何继续。试试这个: au BufEnter *.py map <F5> <esc>:w\|!python %<CR> au BufEnter *.java imap <F5> <esc>:w\|!javac %<C
.c
或.cpp
文件时,F5将映射到此文件:
imap <F5> <esc>:w\|!make %<CR>
imap:w\|!赚%
我不知道如何继续。试试这个:
au BufEnter *.py map <F5> <esc>:w\|!python %<CR>
au BufEnter *.java imap <F5> <esc>:w\|!javac %<CR>
au BufEnter *.c, *.cpp imap <F5> <esc>:w\|!make %<CR>
注意:这些更改可能需要重新启动vim才能覆盖当前的自动命令组。给定的答案和原始映射都存在问题。首先,对于缓冲区本地映射,有
*map
。其次,使用
不需要使用BufEnter
事件,而是可以使用只启动一次的Filetype
。第三,您有一个错误(2.)、一个潜在问题(1.)和一个可以在原始映射中优化的位置:
imap
,这样在添加新映射时很容易意外地破坏旧映射!python%
将在文件包含特殊符号(空格、分号、引号、美元等)时中断:update
而不是:write
可以避免无用的写入autocmd Filetype c,cpp inoremap <buffer> <F5> <C-o>:update<Bar>execute '!make '.shellescape(expand('%:r'), 1)<CR>
autocmd Filetype python inoremap <buffer> <F5> <C-o>:update<Bar>execute '!python '.shellescape(@%, 1)<CR>
autocmd Filetype java inoremap <buffer> <F5> <C-o>:update<Bar>execute '!javac '.shellescape(@%, 1)<CR>
autocmd文件类型c,cpp inoremap:updateexecute'!生成'.shellescape(展开('%:r'),1)
autocmd文件类型python inoremap:updateexecute'!python'.shellescape(@%,1)
autocmd文件类型java inoremap:updateexecute'!javac'.shellescape(@%,1)
您可以单独注释,但不能在逗号后加空格。另外,你可以做*.py*
包括.pyd
文件等。好的,我有个问题。C程序需要像这样从命令行编译:makeprogram
,但这种映射刺激了这一点:makeprogram.C
。有没有办法删除尾部的.c
扩展名?只给命令行文件名,不给扩展名?@Conner你回答了另一个问题。这样我就可以对C和C++文件都做<代码> *C*<代码>,因为两者的命令都是<代码> > <代码>。但扩展名仍然是问题所在。@Santosh您可以使用%:r
而不是%
来取消文件扩展名。@Santosh请参阅:help%:r
和:help:r
。它们是不同的。看看插件。我不能100%确定它是否可以被配置为运行make
,用于.c
或.cpp
文件,但这应该是可能的。答案很好!为了防止在.vimrc中分散各种autocmd(一开始很好,但慢慢会变成一团难以理解的混乱),我更喜欢将那些:inoremap
s放入~/.vim/ftplugin/_mappings.vim
,由vim自动获取,并为您提供模块化。@ZyX您可以修改这些映射以使其也在正常模式下工作吗?@Santosh您可以通过在“inoremap”中用“n”替换“i”并删除“i”使它们在正常模式下工作。但是你必须完全复制这个块。@ZyX嘿!!我说“也可以在正常模式下工作”。我希望相同的映射能够在正常模式和插入模式下工作。我必须再添加三行映射吗?@Santosh无法使用一个命令为这两种模式定义一个映射。有用于visual+select、visual+normal+运算符挂起和command+insert缩写的命令,但insert+normal没有任何命令。您必须定义两个单独的映射。
au BufEnter *.py map <F5> <esc>:w\|!python %<CR>
au BufEnter *.java imap <F5> <esc>:w\|!javac %<CR>
au BufEnter *.c, *.cpp imap <F5> <esc>:w\|!make %<CR>
:h BufEnter
:h :autocmd
autocmd Filetype c,cpp inoremap <buffer> <F5> <C-o>:update<Bar>execute '!make '.shellescape(expand('%:r'), 1)<CR>
autocmd Filetype python inoremap <buffer> <F5> <C-o>:update<Bar>execute '!python '.shellescape(@%, 1)<CR>
autocmd Filetype java inoremap <buffer> <F5> <C-o>:update<Bar>execute '!javac '.shellescape(@%, 1)<CR>