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

cfi*_*cfi 5 keyboard-shortcuts vim xterm

我正在尝试将两个不同的操作映射到 egCtrlShiftaCtrla

map <C-S-a>    :echo "ctrl-shift-a received"<CR>
map <C-a>      :echo "ctrl-a received"<CR>
Run Code Online (Sandbox Code Playgroud)

但是当按下这两个中的任何一个时,我得到的只是状态行中的输出“ctrl-a received”。显然,vi 看不到大写控制字符和小写控制字符之间的区别。

有没有办法改变这种情况?

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

cfi*_*cfi 5

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

对于像xterm你这样的终端,你可以改变它。对于gnome-terminal 它忽略 X 资源设置我不知道如何执行以下操作:

这个SO 问题涵盖了相同的主题,这个例子显示了它用于映射.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")  
Run Code Online (Sandbox Code Playgroud)

现在我们有不同的键序列进入 vi,用于Ctrlavs. CtrlShiftaCtrlbvs. CtrlShiftbCtrlfvs. CtrlShiftf.

我们现在可以不同地映射它们~/.vimrc

map <ESC>[65;5u   :echo "ctrl-shift-a received"<CR>
map <C-a>         :echo "ctrl-a received"<CR>
Run Code Online (Sandbox Code Playgroud)