在新安装的架构Linux,我的 shell ( bash
, zsh
, tcsh
) 不区分箭头键和Ctrl+arrow keys或Shift+ arrow keys。
cat
Ctrl命令显示左箭头、 +Left arrow或Shift+ 的相同代码Left arrow:^[[D
这很烦人,因为它阻止我配置逐字位移以及 shell 中的文本选择,但这不是关键问题,因为我仍然可以逐个字符导航。
然而在 nano 中,Ctrl和Shift+arrow工作得很好,逐字位移和文本选择没有任何问题。
我准确地说,这是我第一次安装 arch-linux,我可能忘记了导致这个问题的基本配置。
如何让Ctrl/ Shift+Arrow在我的 shell 中检测到?
-- 编辑以添加所需信息 --
zle-line-init() echoti smkx
不解决问题,
echoti smkx; STTY='-icanon -echo min 0 time 20' od -vtc -tx1
输出以下内容:
no such terminfo capability: smkx
00000000 033 [ D
1b 5b 44
00000003
对于left和ctrl+ left,
和对于echoti rmkx; STTY='-icanon -echo min 0 time 20' od -vtc -tx1
:
no such terminfo capability: rmkx
00000000 033 [ D
1b 5b 44
00000003
对于left和ctrl+left
我使用 Arch-linux 的默认终端,如果我的理解正确的话,它被称为 linux (echo $TERM
输出linux
,我没有/etc/inittabl
可以掩盖真正的终端)
答案1
正如问题是摆出姿势,这可能与 ncurses FAQ 有关我的光标键不起作用。
nano 将终端初始化为应用方式,而贝壳则不然,将它们留在正常模式。
您没有识别终端(模拟器),但其“正常”模式可能错误地使用 CSI (escape-[) 而不是 SS3 (escape-O)。
然而,从后续评论来看,给出了相互矛盾的信息。被指定为不工作的程序(bash、tcsh、zsh)并不奇怪,因为它们都不使用终端数据库来获取有关的信息。修改键。其中一些记录在 xterm 手册中(特殊按键)。这些都没有记录在任何 shell 手册中。就其“工作”而言,它们依赖于其配置中的文字字符串。由于 zsh(尝试)使用终端数据库,但不读取扩展信息 - 请参阅来源——那里没有运气。
在 GUI 中,默认的“终端”可能是 gnome-terminal...,它设置TERM
为xterm-256color
.这(大部分)是有效的,尽管如果有 的文档gnome-terminal
,人们会期望找到它的怪癖被适当地注意到。
nano使用终端描述; grep'ing for (调用函数调用)tigetstr
显示了它如何使用此信息(请参阅来源):
src/nano.c:1233:int get_keycode(const char *keyname, const int standard)
src/nano.c:2389: controlleft = get_keycode("kLFT5", CONTROL_LEFT);
src/nano.c:2390: controlright = get_keycode("kRIT5", CONTROL_RIGHT);
src/nano.c:2391: controlup = get_keycode("kUP5", CONTROL_UP);
src/nano.c:2392: controldown = get_keycode("kDN5", CONTROL_DOWN);
src/nano.c:2394: controlhome = get_keycode("kHOM5", CONTROL_HOME);
src/nano.c:2395: controlend = get_keycode("kEND5", CONTROL_END);
src/nano.c:2397: controldelete = get_keycode("kDC5", CONTROL_DELETE);
src/nano.c:2398: controlshiftdelete = get_keycode("kDC6", CONTROL_SHIFT_DELETE);
src/nano.c:2400: shiftup = get_keycode("kUP", SHIFT_UP);
src/nano.c:2401: shiftdown = get_keycode("kDN", SHIFT_DOWN);
src/nano.c:2403: shiftcontrolleft = get_keycode("kLFT6", SHIFT_CONTROL_LEFT);
src/nano.c:2404: shiftcontrolright = get_keycode("kRIT6", SHIFT_CONTROL_RIGHT);
src/nano.c:2405: shiftcontrolup = get_keycode("kUP6", SHIFT_CONTROL_UP);
src/nano.c:2406: shiftcontroldown = get_keycode("kDN6", SHIFT_CONTROL_DOWN);
src/nano.c:2408: shiftcontrolhome = get_keycode("kHOM6", SHIFT_CONTROL_HOME);
src/nano.c:2409: shiftcontrolend = get_keycode("kEND6", SHIFT_CONTROL_END);
src/nano.c:2411: altleft = get_keycode("kLFT3", ALT_LEFT);
src/nano.c:2412: altright = get_keycode("kRIT3", ALT_RIGHT);
src/nano.c:2413: altup = get_keycode("kUP3", ALT_UP);
src/nano.c:2414: altdown = get_keycode("kDN3", ALT_DOWN);
src/nano.c:2416: altpageup = get_keycode("kPRV3", ALT_PAGEUP);
src/nano.c:2417: altpagedown = get_keycode("kNXT3", ALT_PAGEDOWN);
src/nano.c:2418: altinsert = get_keycode("kIC3", ALT_INSERT);
src/nano.c:2419: altdelete = get_keycode("kDC3", ALT_DELETE);
src/nano.c:2421: shiftaltleft = get_keycode("kLFT4", SHIFT_ALT_LEFT);
src/nano.c:2422: shiftaltright = get_keycode("kRIT4", SHIFT_ALT_RIGHT);
src/nano.c:2423: shiftaltup = get_keycode("kUP4", SHIFT_ALT_UP);
src/nano.c:2424: shiftaltdown = get_keycode("kDN4", SHIFT_ALT_DOWN);
答案2
我在这里写下 Thomas Dickey 在评论中提供的答案:我想做的(使用ctrl+ arrow)在 Linux 内核终端中是不可能的。
安装桌面环境(KDE Plasma)并打开终端仿真器(Konsole)后,我可以毫无问题地使用修改后的密钥。
感谢大家的帮助。