在 vim 中,如何重新映射无需重新映射?

在 vim 中,如何重新映射无需重新映射?

我喜欢使用 tab 在分割窗口之间跳转,所以我map <tab> <C-W><C-W>在 .vimrc 中这样做了。但我注意到这使得 Ctrl+I 不再表现为 Ctrl+I,而是表现为 Ctrl+W、Ctrl+W。我怎样才能重新映射<tab>而不是<C-i>

答案1

由于键盘输入的内部处理方式,遗憾的是,即使在 GVIM 中,这在今天也普遍无法实现。某些组合键(如Ctrl+ 非字母)无法映射,并且无法区分Ctrl+ 字母和Ctrl+ Shift+ 字母。(除非您的终端发送不同的术语表代码,大多数人没有。)在插入或命令行模式下,尝试输入组合键。如果没有任何反应 / 插入,则无法使用该组合键。这也适用于<Tab>/ <C-I><CR>/ <C-M>/ <Esc>/<C-[>等。(唯一的例外是<BS>/ <C-H>。)这是一个已知的痛点,也是 vim_dev 和 #vim IRC 频道上各种讨论的主题。

有些人(首先是 Paul LeoNerd Evans)想要修复这个问题(即使对于支持该功能的终端中的控制台 Vim),并提出了各种建议,cp。http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今天,还没有任何补丁或志愿者提出,尽管许多人表示希望在未来的 Vim 8 主要版本中拥有这一点。

答案2

虽然重新映射<tab>总是会导致<c-i>也被重新映射,但您可以先将其重新映射<c-i>到其他内容以nnoremap保留其功能。由于 的助记词<c-o>是“较旧”,因此我使用 的<c-n>助记词“较新”:

" First remap <tab> (and <c-i>) to <c-n>
nnoremap <c-n> <tab>

" Now remap <tab> to something else
nnoremap <tab> <c-w><c-w>

答案3

并非所有快捷方式在 Vim 中都适用,尤其是在终端下。我不建议为此使用 tab 快捷方式。但另一种解决方案可能是:

" Note: Allows faster switching between windows with "Ctrl+w"! By Questor
nnoremap <silent> <C-w> <C-w><C-w>
inoremap <silent> <C-w> <Esc><C-w><C-w>
vnoremap <silent> <C-w> <Esc><C-w><C-w>

参见使用示例https://github.com/eduardolucioac/groovim/blob/master/.vimrc

[]的

答案4

如果您使用 iTerm,您可以重新映射<Ctrl+i>到任意组合键,然后在重新映射到其他内容<tab>之前对其进行映射。<tab>

这是我用于导航选项卡的内容<tab>(在 iTerm 中重新映射<Ctrl+i>到之后==):

nnoremap == <tab>
nnoremap <tab> :tabnext<CR>

相关内容