如何在 vi 中将两个不同的操作绑定到 Ctrl-Shift-Key 和 Ctrl-Key

如何在 vi 中将两个不同的操作绑定到 Ctrl-Shift-Key 和 Ctrl-Key

我正在尝试将两个不同的动作映射到CtrlShifta例如Ctrla

map <C-S-a>    :echo "ctrl-shift-a received"<CR>
map <C-a>      :echo "ctrl-a received"<CR>

但是,当我按下这两个键中的任何一个时,状态行中只会输出“ctrl-a received”。显然,vi 无法区分大写控制字符和小写控制字符。

有办法改变这种情况吗?

我在 xterm(X.Org 6.8.99)中运行 vi(v7.4)。

答案1

这是一个终端限制,因为 vi 认为键码是相同的。可以通过进入插入模式 来验证这一点i,然后点击Ctrlv将 vi 置于期望特殊字符的文字输入的模式,然后点击例如CtrlShifta^A将出现输出。现在执行序列Ctrlv, Ctrla,然后再次^A出现:两个输入序列都会导致 vi 看到相同的键码。

对于诸如此类的终端,xterm您可以更改这一点。对于gnome-terminal 忽略 X 资源设置我不知道如何执行以下操作:

那么问题来了涵盖同一主题,并且这个例子显示了此方法在.Xresources文件中映射多个键。例如:

XTerm*vt100.translations: #override \
  Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n\
  Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n\ 
  Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")  

现在我们有不同的按键序列进入 vi,分别为Ctrlavs. CtrlShiftaCtrlbvs. CtrlShiftbCtrlfvs CtrlShiftf.。

我们现在可以用不同的方式映射它们~/.vimrc

map <ESC>[65;5u   :echo "ctrl-shift-a received"<CR>
map <C-a>         :echo "ctrl-a received"<CR>

相关内容