Vim 根据特定文件类型更改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

我的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 %<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>