是否可以在 Gnome 终端中使用Ctrl-来映射序列?Shift
我正在尝试添加映射
map <C-S-[> gT
map <C-S-]> gt
但它不起作用。该怎么办?
我以某种方式映射了<C-S-]>
,但结果却不是<C-S-]>
,而是<C-]>
,因此看起来它无法识别此序列中的 Shift。是配置错误还是 gnome-terminal 的错误?
此外,按下映射后,vim 似乎正在等待。我猜是映射超时了,但是当我精确按下并且不想按任何其他键<C-[>
时,如何摆脱此超时?<C-[>
我刚刚开始学习 vim,所以如果映射中存在明显的错误,我很抱歉。
答案1
我认为这里的问题是,您试图让 vim(它应该在终端中运行)识别 CTRL-SHIFT 序列。虽然 X 可以识别这样的组合,但在终端(或如今的终端仿真器)中运行的应用程序却不能。这是因为,从历史上看,终端只能通过串行连接发送和接收七位或八位 ASCII 数据序列(尽管这可能包括定位光标、滚动或删除行、更改颜色和其他有用效果的“转义序列”)。
ASCII 字符集中有 32 个“控制代码”,包括我们熟悉的 CTRL-A 到 CTRL-Z。但是“CTRL-SHIFT”A 到 Z 没有对应的 ASCII 代码。现在,gnome-terminal 本身可以识别这些代码(例如,CTRL-SHIFT-V 将从剪贴板粘贴文本),但 vim 无法直接访问它。
当然,可能(我不知道)可以设置终端仿真器将 CTRL-SHIFT 按键转换为转义序列,然后可以通过 vim 映射识别。
=======
更新
您可能对 gvim 感兴趣,它是 vim 的图形版本,以 X 程序而非终端程序运行。也许 gvim 能够理解 CTRL-SHIFT 代码?
答案2
就像巴特比指出这是一个终端限制,因为 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>[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>
答案3
GNOME 终端似乎不允许使用某些组合键Ctrl。网上搜索发现有很多这样的情况。
如果您不知道的话,Ctrl+ page up/page down会循环切换标签。
答案4
gnome-terminal
键生成的转义序列不可配置。对于许多键+Ctrl和key++Shift会生成不同的序列;不幸的是,对于Ctrl和不会生成序列,因此您无法区分它们。key[]