我正在使用 Putty、Suse box 和 Vim 7.2 组合进行编辑,我想将Ctrl+Arrow按键重新映射到特定任务。但由于某种原因,Vim 忽略快捷方式,进入插入模式,并插入字符D
(for Ctrl+ ←) 或字符C
(for Ctrl+ →)。
我的键盘/终端配置的哪一部分应该受到指责以及如何修复它?
答案1
通过在插入模式下键入+ , +arrow来准确找出终端为Ctrl+arrow发送的转义序列:这将逐字插入前导字符(如vim 中所示),然后是转义序列的其余部分。然后告诉 vim 这些转义序列,比如CtrlVCtrlESC
^[
map <ESC>[5D <C-Left>
map <ESC>[5C <C-Right>
map! <ESC>[5D <C-Left>
map! <ESC>[5C <C-Right>
我记得 Putty 有一个默认设置应用程序光标键模式这很不方便(我忘了为什么),您可能需要先切换此设置。
请注意,虽然终端之间的转义序列有所不同,但冲突(即对应于不同终端中的不同键的转义序列)很少见,因此没有特别需要尝试仅在特定终端类型上应用映射。
答案2
你最好的选择可能是看看 PuTTY 的应用程序光标键模式配置。
默认序列ESC作为前缀发送,[
后跟A
pend 或C
hange 或其他使您进入插入模式的东西。
继吉尔斯之后添加
^V 转义的稍微更明确的版本可以通过 od(1) 看到。这是我在终端输入 ^Up、^Down、^Right、^Left:
$ od -a
0000000 esc [ 1 ; 5 A esc [ 1 ; 5 B esc [ 1 ;
0000020 5 C esc [ 1 ; 5 D
所以^[[1;5A
当我按Ctrl+时我的终端会发送↑
答案3
我在这里找到了更好的解决方案: http://vim.wikia.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell
只需将此字符串放入您的.vimrc
文件中即可:
:set term=cons25
更新
将此文件复制到您的/home
,重命名.vimrc
:
/usr/share/vim/vim_VERSION_/vimrc_example.vim
答案4
当这个问题在 2010 年被问到时(并且当提供其他答案时,不迟于 2013 年),PuTTY 无法区分控制光标键的修饰符。它只会发送 VT100 风格的普通光标键和应用程序光标键。特别是,任何带有“”等文字的答案<ESC>[1;5A
都没有解决OP的问题。
十多年后,PuTTY 提供了一个源自 xterm 的方案,如下提交所示:
commit 22911ccdcc37c7955bfc1c45a88d3762d1206da7
Author: Simon Tatham <[email protected]>
Date: Mon Oct 18 20:00:25 2021 +0100
New config option for shifted arrow key handling.
This commit introduces a new config option for how to handle shifted
arrow keys.
In the default mode (SHARROW_APPLICATION), we do what we've always
done: Ctrl flips the arrow keys between sending their most usual
escape sequences (ESC [ A ... ESC [ D) and sending the 'application
cursor keys' sequences (ESC O A ... ESC O D). Whichever of those modes
is currently configured, Ctrl+arrow sends the other one.
In the new mode (SHARROW_BITMAP), application cursor key mode is
unaffected by any shift keys, but the default sequences acquire two
numeric arguments. The first argument is 1 (reflecting the fact that a
shifted arrow key still notionally moves just 1 character cell); the
second is the bitmap (1 for Shift) + (2 for Alt) + (4 for Ctrl),
offset by 1. (Except that if _none_ of those modifiers is pressed,
both numeric arguments are simply omitted.)
The new bitmap mode is what current xterm generates, and also what
Windows ConPTY seems to expect. If you start an ordinary Command
Prompt and launch into WSL, those are the sequences it will generate
for shifted arrow keys; conversely, if you run a Command Prompt within
a ConPTY, then these sequences for Ctrl+arrow will have the effect you
expect in cmd.exe command-line editing (going backward or forward a
word). For that reason, I enable this mode unconditionally when
launching Windows pterm.
设置对话框条目位于 config.c 中:
ctrl_radiobuttons(s, "Shift/Ctrl/Alt with the arrow keys", 'w', 2,
HELPCTX(keyboard_sharrow),
conf_radiobutton_handler,
I(CONF_sharrow_type),
"Ctrl toggles app mode", I(SHARROW_APPLICATION),
"xterm-style bitmap", I(SHARROW_BITMAP));
该“位图”指的是该表XTerm 控制序列:
Code Modifiers
---------+---------------------------
2 | Shift
3 | Alt
4 | Shift + Alt
5 | Control
6 | Shift + Control
7 | Alt + Control
8 | Shift + Alt + Control
9 | Meta
10 | Meta + Shift
11 | Meta + Alt
12 | Meta + Alt + Shift
13 | Meta + Ctrl
14 | Meta + Ctrl + Shift
15 | Meta + Ctrl + Alt
16 | Meta + Ctrl + Alt + Shift
---------+---------------------------
所以...根据开发人员的描述,适用于 xterm 的设置应该适用于 PuTTY。自 PuTTY 开发于 2000 年左右开始以来,这就是 xterm 的一个功能2002年,在 2021 年修复这个细节是“期待已久的”。
进一步阅读:
- PC 风格功能键, 在XTerm 控制序列
- 如何使用移位或控制修饰符?(ncurses 常见问题解答)