我正在尝试将两个不同的动作映射到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. CtrlShifta、Ctrlbvs. CtrlShiftb、Ctrlfvs CtrlShiftf.。
我们现在可以用不同的方式映射它们~/.vimrc
:
map <ESC>[65;5u :echo "ctrl-shift-a received"<CR>
map <C-a> :echo "ctrl-a received"<CR>