我在 MacVim 中使用的一些键是终端 Vim 无法识别的。例如,Ctrl-Enter、Shift-Enter、Ctrl-Space、Shift-Space、Ctrl-Backspace。
我正在使用 iTerm2,它允许您映射键盘快捷键以发送转义序列。似乎我可以使用它来使我想要的键映射在终端中工作。例如,
iTerm2
Ctrl-Space: Send ^[[123;456ABC
Vim
set <F13>=^[[123;456ABC
map <F13> <S-Space>
noremap <S-Space> mzO<Esc>j`z
我不确定这是否会起作用,但我也想知道在开始随意创建自定义转义序列之前我应该注意什么。这似乎可能会导致问题...
答案1
通过以下这两页,我明白了:
- https://groups.google.com/forum/?fromgroups#!topic/iterm2-discuss/VEiCSc5LCIs
- http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim
通过使用未使用的功能键的键码,您可以保持“安全”。在 iTerm2 中,我创建了“键盘快捷键”,将所需的键组合映射到转义序列功能键 F13 到 F16。然后,在我的 vimrc 中,我适当地设置了 Vim 的键码,将所需的组合键映射到正确的功能键,然后将相同的组合键映射到我想要的任何组合。我不确定我是否完全理解事情的发展方向,但一切都联系在一起并发挥作用。这是我的 vimrc 的相关部分:
" use some unused function key codes to
" make special key combos work in terminal
set <F13>=O2P
map <F13> <C-CR>
map! <F13> <C-CR>
set <F14>=O2Q
map <F14> <S-CR>
map! <F14> <S-CR>
set <F15>=O2R
map <F15> <C-Space>
map! <F15> <C-Space>
set <F16>=O2S
map <F16> <S-Space>
map! <F16> <S-Space>
" open above / below current line
inoremap <S-CR> <C-O>O
inoremap <C-CR> <C-O>o
" insert above / below current line
noremap <S-Space> mzO<Esc>j`z
noremap <C-Space> mzo<Esc>k`z
答案2
我的<Ctrl-Tab>
热键也遇到了类似的问题,它在 MacVim 和 iTerm2 的控制台 vim 中都可以使用,但从 iTerm ssh 到另一台机器时却不行。我的解决方案是修改 iTerm 现有的键绑定<Ctrl-Tab>
(我从未使用过)以发送转义序列[17~
(转义序列<F6>
——另一个我从未使用过的东西——如@ivan 链接的表格中所示)。在我的 .vimrc 中,我添加了一个映射:
nnoremap <silent> <F6> :echo "success!"<CR>