Answers:
我认为这里的问题是,您试图获取预期在终端中运行的vim来识别CTRL-SHIFT序列。尽管X可能会识别出这样的组合,但是在终端上运行的应用程序(或如今,终端仿真器)却无法。这是因为,从历史上看,终端只能通过串行连接发送和接收7位或8位ASCII数据序列(尽管这可能包括定位光标,滚动或删除行,更改颜色和其他有用的“转义序列”)效果)。
ASCII字符集中有32个“控制代码”,包括熟悉的CTRL-A到CTRL-Z。但是没有相应的ASCII代码用于“ CTRL-SHIFT” A到Z。现在,gnome-terminal本身可以识别这些代码(例如,CTRL-SHIFT-V将粘贴剪贴板中的文本),但是vim不会能够直接访问它。
当然,可能(不知道)可以设置终端仿真器,以将CTRL-SHIFT按键转换为转义序列,然后可以通过vim映射识别该序列。
=======
您可能对gvim感兴趣,它是vim的图形版本,它作为X程序而不是终端程序运行。也许gvim将能够理解CTRL-SHIFT代码?
正如Bartleby 指出的那样,这是一个终端限制,因为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")
现在,对于Ctrlavs. CtrlShifta,Ctrlbvs. CtrlShiftb,Ctrlfvs CtrlShiftf。,我们在vi中有不同的键序列。
现在,我们可以在中以不同的方式映射它们~/.vimrc
:
map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>
map <ESC>[70;5u :echo "ctrl-shift-f received"<CR>
map <C-b> :echo "ctrl-b received"<CR>
map <C-f> :echo "ctrl-f received"<CR>
gnome-terminal
,而您的答复是xterm
。