进一步阅读

进一步阅读

我尝试将 Ctrl+LeftArrow 绑定到终端中的后向单词(无 XWindowSystem)。

但我观察到,Ctrl+LeftArrow 和 LeftArrow 在终端中生成相同的转义序列:

  1. 我按 Ctrl+V
  2. 我按向左箭头
  3. 我收到了^[[D
  4. 我按 Ctrl+V
  5. 我按 Ctrl+向左箭头
  6. 我收到了^[[D

Ctrl+右箭头也有同样的问题。我该如何修复它?

(Debian:Linux v4.19.0-8-amd64)

答案1

^[[D用左箭头得到。

Ctrl-left^[[151在 linux VC 中给出,^[[1;5D在 xterm 中给出


man keymaps有:

 Which  of  the actions bound to a given key is taken when it is pressed depends on what
   modifiers are in effect at that moment.  The  keyboard  driver  supports  9  modifiers.
   These  modifiers  are  labeled  (completely  arbitrarily)  Shift,  AltGr, Control, Alt,
   ShiftL, ShiftR, CtrlL, CtrlR and CapsShift.  Each of these modifiers has an  associated
   weight of power of two according to the following table:

          modifier            weight

          Shift                  1
          AltGr                  2
          Control                4
          Alt                    8
          ShiftL                16
          ShiftR                32
          CtrlL                 64
          CtrlR                128
          CapsShift            256

我对其进行了更改,以便两个“Alt”键执行相同的操作,就像 Shift 和 Control 一样:

示例:键盘映射文件loadkeys

# three modifiers -> 8 cols. (AltGr missing):
#
keymaps 0-1,4-5,8-9,12-13

进而:

# left modifiers
keycode  42 = Shift
keycode  29 = Control
keycode  56 = Alt
keycode  58 = Caps_Lock
# right side...just Alt
keycode  54 = Shift
keycode  97 = Control
keycode 100 = Alt

通常是 100=AltGr。

然后我在默认的“Left”后面添加了两个附加操作:

keycode 105 = Left F150 F151
  string F150 = "\033[150"
  string F151 = "\033[151"

这必须分两步......“F150”只是一个标签,用于将修改后的键与字符串连接起来。

现在我的箭头键 (105) 像以前一样产生“向左”,但 Shift 和 Control 会产生所选的转义序列。

然后在~/.inputrc

# Moving - modif. L+R Arrows in linux VC
# ascii codes in X / evdev / xterm
#
"\e[150":  backward-word
"\e[1;2D": backward-word
"\e[154":   forward-word
"\e[1;2C":  forward-word

"\e[151":  shell-backward-word
"\e[1;5D": shell-backward-word
"\e[155":   shell-forward-word
"\e[1;5C":  shell-forward-word

回想起来我应该选择1;2DX 生产的。这样可以节省一些 inputrc 行。但这些转义序列对我来说似乎有点不透明,所以我定义了自己的转义序列。


为了说明修饰符映射:

# "Print Screen Sys Rq" is Nr 99
#
keycode 99 =  F91 F92 F93 nul F95 F96
 string F91 = " --help\n"
 string F92 = " |less"
 string F93 = " |grep "
 string F95 = "()\033[D"
 string F96 = "echo \'\033[4~\'"

现在我可以按以前未使用的“打印”键来写入--help加上Enter.这仅适用于linux VC,因为X也忽略了我的“打印”键,并且我还没有找到如何在XKB中激活它。

“nul”条目是“Shift+Control”的位置,通过重量出现在“Alt”之前。

keymaps 0-1,4-5,8-9,12-13:数“0,1,4,5,8”将重量“8”放在第五位,其中“F95”所在。 “8”被定义为“Alt”。缺少 2,3,6,7 是因为我想跳过值 2 的 AltGr 权重。


通过将 10 个 F 键与仅 Shift、Control 和 Alt(无左、右)的 8 种组合相结合,您可以获得 80 种不同的按键功能 - 如果您愿意的话。但谁希望 Shift+Control-F6 做一件事,而 Control+Alt-F9 做另一件事呢?

答案2

您重写了 Linux 中内置的终端仿真器程序,添加了此功能。

内置终端仿真器根本不包括任何控制序列中的修饰符信息。特别是,它不像某些 GUI 终端仿真器那样在光标键盘的控制序列中包含修饰符信息。

你会发现,与 GUI 终端仿真器和真实终端相比,内置于操作系统内核(例如 Linux 和 BSD 内核)中的终端仿真器程序有很多功能无法完成。 (NetBSD 和 OpenBSD 的用户手册wscons详细列出了真正的 DEC VT 所做的事情和它不做的事情。Linux 的 doco 没有那么有用。)

您可以通过使用键盘映射将光标键定义为(高编号)可编程功能键,为每个可能的修饰符组合使用不同的功能键,并将所有功能键字符串手动编码为适当的控制序列。这既乏味又荒谬,并且会破坏 DECCKM 的启动(因为 Linux 内置终端仿真器仅将 DECCKM 应用于键盘映射中实际指定为光标键盘键的键)。

有几个用户空间不需要 X 的终端仿真器。我不能代表其他人,因为没有检查过它们,但我的确实在控制序列中提供了修饰符信息。以下是您提到的和弦会发生的情况:

%猫-V
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
%控制台解码ecma48--输入
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
幼兽
CUF
CUU
CUD
控制+CUB 1
控制+CUF 1
控制+CUU 1
控制+CUD 1
如果
%setterm --appcursorkeys on ;控制台解码ecma48--输入
^[OD^[OC^[OA^[OB^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
SS3 'D'
SS3 'C'
SS3 'A'
SS3 'B'
控制+CUB 1
控制+CUF 1
控制+CUU 1
控制+CUD 1
如果
%

进一步阅读

相关内容