【问题标题】:Change the mapping of F5 on the basis of specific file type根据特定文件类型更改 F5 的映射
【发布时间】:2012-08-20 00:07:03
【问题描述】:

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

我不知道如何继续。

【问题讨论】:

  • 看看SingleCompile插件。我不能 100% 确定它是否可以配置为运行 make 以运行 .c.cpp 文件,但应该可以。

标签: vim keymapping


【解决方案1】:

给出的答案和原始映射都存在问题。首先,对于缓冲区本地映射,有*map &lt;buffer&gt;。其次,使用&lt;buffer&gt;,您不需要使用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>

【讨论】:

  • 很好的答案!并且为了防止在你的 .vimrc 中分散各种自动命令(一开始很好,但慢慢变成难以理解的混乱),我更喜欢将那些 :inoremaps 放入由 Vim 自动获取的 ~/.vim/ftplugin/&lt;filetype&gt;_mappings.vim 中,并为你提供模块化。
  • @ZyX 你能修改这些映射以在正常模式下工作吗?
  • @Santosh 您可以通过在“inoremap”中将“i”替换为“n”并删除“”,使它们在正常模式下工作。但是你必须完全复制这个块。
  • @ZyX 嘿!我说“也可以在正常模式下工作”。我希望相同的映射在正常模式和插入模式下工作。是否必须再添加三行映射?
  • @Santosh 无法使用一个命令为这两种模式定义一个映射。有visual+select、visual+normal+operator-pending和command+insert缩写的命令,但insert+normal没有。您必须定义两个单独的映射。
【解决方案2】:

试试这个:

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 才能使这些更改覆盖当前的自动命令组。

【讨论】:

  • 您可以单独评论,但不能在逗号后加空格。此外,你可以做*.py* 做包括.pyd 文件等。
  • 好的,我有问题。 C 程序需要像这样从命令行编译:make program,但这种映射刺激了这一点:make program.c。有什么方法可以删除尾随的 .c 扩展名?并且只给命令行文件名,而不是扩展名?
  • @Conner 您回答了另一个问题。这样我就可以为 C 和 C++ 文件执行*.c*,因为两者的命令都是make。但是扩展仍然是问题所在。
  • @Santosh 您可以使用%:r 而不是% 来省略文件扩展名。
  • @Santosh 请参阅:help %:r:help :r。它们是不同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多