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

时间:2012-08-20 00:07:04

标签: vim keymapping

我的 F5 键的当前映射是:

imap <F5> <esc>:w\|!python %<CR>

现在我想要的是,如果我正在编辑任何python文件(如果它还能识别.py等标准.pyd格式以外的文件会更好那么这种映射可以正常工作。但是,如果我编辑Java文件,它将映射到类似:

imap <F5> <esc>:w\|!javac %<CR>

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

imap <F5> <esc>:w\|!make %<CR>

我不知道如何继续。

2 个答案:

答案 0 :(得分:13)

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

  1. 你不应该使用imap,这会使添加新映射时意外破坏旧映射变得非常容易
  2. !python %将在文件包含特殊符号(空格,分号,符号,美元,...)后中断。
  3. 使用:update代替:write可以避免在某些情况下无用的写入
  4. 我的变体:

    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>
    

答案 1 :(得分:1)

试试这个:

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>

我不是100%确定逗号分隔的文件类型,试图验证...

vim文档通常非常讨厌如何使用命令,但这些应该有助于您入门:

:h BufEnter
:h :autocmd

注意:您可能必须重新启动vim才能覆盖当前的自动命令组。