5

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>

我不知道如何进行。

4

2 回答 2

14

给出的答案和原始映射都存在问题。首先,对于缓冲区本地映射,有*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>
于 2012-08-20T04:49:42.817 回答
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 才能使这些更改覆盖当前的自动命令组。

于 2012-08-20T00:12:53.933 回答