Ctrl + 箭头识别为 shell 上的唯一箭头

Ctrl + 箭头识别为 shell 上的唯一箭头

在新安装的架构Linux,我的 shell ( bash, zsh, tcsh) 不区分箭头键和Ctrl+arrow keysShift+ arrow keys

catCtrl命令显示左箭头、 +Left arrowShift+ 的相同代码Left arrow^[[D

这很烦人,因为它阻止我配置逐字位移以及 shell 中的文本选择,但这不是关键问题,因为我仍然可以逐个字符导航。

然而在 nano 中,CtrlShift+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

对于leftctrl+ 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

对于leftctrl+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...,它设置TERMxterm-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)后,我可以毫无问题地使用修改后的密钥。

感谢大家的帮助。

相关内容