根据特定文件类型更改F5的映射

San*_*mar 4 vim keymapping

我的F5密钥的当前映射是:

imap <F5> <esc>:w\|!python %<CR>
Run Code Online (Sandbox Code Playgroud)

现在我希望如果我正在编辑任何python文件(如果它还能识别除标准.py格式之外的其他文件会更好.pyd),那么这个映射就可以了.但是,如果我编辑Java文件,它将被映射到类似:

imap <F5> <esc>:w\|!javac %<CR>
Run Code Online (Sandbox Code Playgroud)

当我正在编辑任何文件.c.cpp文件时,F5会映射到此:

imap <F5> <esc>:w\|!make %<CR>
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么办.

ZyX*_*ZyX 13

给定答案和原始映射都存在问题.首先,对于缓冲区本地映射,存在*map <buffer>.其次,<buffer>您不需要使用BufEnter事件,而是可以使用Filetype仅启动一次的事件.第三,你有一个错误(2.),一个潜在问题(1.)和一个可以在原始映射中优化的地方:

  1. 你不应该使用imap它,这使得在添加新映射时不小心意外破坏旧映射
  2. !python % 一旦文件包含特殊符号(空格,分号,符号,美元,......)就会中断
  3. 在某些情况下使用: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>
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!并且为了防止你的.vimrc中各种autocmds的散布(它在开始时很好,但慢慢变成一个难以理解的混乱),我更喜欢将那些`:inoremap`s放入`〜/ .vim/ftplugin/<filetype> _mappings. vim`,由Vim自动获取,并为您提供模块化. (4认同)