在 iTerm 中将键映射到自定义转义序列是否安全?

在 iTerm 中将键映射到自定义转义序列是否安全?

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

通过以下这两页,我明白了:

通过使用未使用的功能键的键码,您可以保持“安全”。在 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>

相关内容