如何使用 ALT (Meta) 或其他控制键作为前缀而不是 `\C-` 和 `\e` 设置 Readline 键绑定?

如何使用 ALT (Meta) 或其他控制键作为前缀而不是 `\C-` 和 `\e` 设置 Readline 键绑定?

我只能找到使用 Control ( \C-) 或 Escape ( \e) 作为前缀设置 Readline 键绑定的示例。

就我而言,在 macOS 上,该\C-空间被默认按键绑定完全填满,并且该\e空间在带有触摸栏的 Macbook 上并不实用。

输入"\M-f": kill-word结果~/.inputrc为:

bind -P | grep -F "\M-"
kill-word can be found on "\e[3;5~" "\ed".

kill-word不能使用OptionCommand、 或fn作为前缀来执行 - Readline 会忽略它。

这个问题是 macOS 特有的吗?我该如何解决它?

此外,如何控制执行键绑定(即较长键绑定的前缀)之前应发生的“超时”?

@added (@laktak):bind '"^[f": kill-word'不起作用,但会ƒ在终端上产生: 在此输入图像描述

答案1

我不认为你做错了什么,你只需要告诉 Terminal.app 使用“Option”键作为“Meta”即可。只需转到终端 ( + ,) 的首选项,然后型材,那么键盘默认配置文件选项卡并选中“使用选项作为元键”。

Terminal.app“配置文件”→“键盘”设置的屏幕截图

否则,您将获得默认的 macOS 行为(在大多数键盘映射中),其中 Option + 键会生成特殊字符,就像Option+f会生成带钩的小写字母“f”从你的屏幕截图(完整参考这里)。

i学期2,我相信默认情况下左 Option 键已经做了明智的事情,但为了以防万一,以下是如何更改它:

iTerm 2 选项按键行为

至于将 Option 重新映射为 Escape,如果您仍然想做这件事,可以通过单击窗口底部附近的“修改键...”按钮,从系统偏好设置中的键盘预置面板中完成。

macOS 系统设置键盘预面板

然后将其重新映射到您想要的任何内容(从可用的选项中):

重新映射 macOS 键盘预面板中的修饰键

我在使用新 Mac 的前五分钟左右就打开了这个首选项窗格,这样我就可以将 Caps Lock 重新映射到 Control,因为 Mac 键盘上的 Control 键处于一个尴尬的位置。

答案2

实用程序是:

showkey (1)          - examine the codes sent by the keyboard

但这似乎在 mac-os 上缺失...这里是“关键代码”...?

或者您输入 ctrl-V (qouted insert),然后输入一些特殊键。在 bash 中,这会^[OP在 xterm 和^[[[AF1 键的控制台中打印。

读取行变量:

keyseq-timeout (500)

是用于半完成序列的超时。

在此之下,必须有一种键映射文件,其中键被转换为符号。这是来自/usr/share/kbd/keymaps/mac/linux:

keycode 51 = Delete  Remove
        alt keycode 51 = Meta_Delete
        shift alt keycode 51 = Meta_Delete
        control keycode  51 = Remove
keycode 53 = Escape
        alt keycode 53 = Meta_Escape
        shift alt keycode 53 = Meta_Escape
keycode  54 = Control
keycode  55 = Alt         # Command/Apple key
keycode  56 = Shift
keycode  57 = Caps_Lock
keycode  58 = AltGr       # Alt/Option key

你看到了灵活性!元删除符号可能会成为杀戮词......


绑定 '"^[f": 杀字

^[必须是\e、 或 ctrl-V,然后是 Escape:一个字节,而不是抑扬符加括号。


这就像说: ^C 表示 control-C,而不是 Shift-6 然后是 Shift-c...在 shell (bash) 或 vim 中,当我输入 ctrl-v 然后 Esc 我得到^[,但它是当你退后一步时,只有一个字符。与 readline 中的这些元标志选项一起,它可能会变得复杂......我只是说明整个链:

键映射“default.map”(将扫描码和修饰符转换为键符号)

keycode 105 = Left F150 F151
  string F150 = "\033[150"
  string F151 = "\033[151"
keycode 106 = Right F154 F155
  string F154 = "\033[154"
  string F155 = "\033[155"

默认“Left”后面的 F150 和 F151 表示 Shift 和 Control 左箭头。在第二步中,您可以定义一个字符串,在本例中是一个转义序列。在这里,\e不起作用,但八进制 033 是 ascii 27 是 control-[ 是 Escape...这个键盘映射是 Linux 特定的,但 X Windows 有类似的逻辑。

在 .inputrc 中:

"\e[150": backward-word 
"\e[151": shell-backward-word 
"\e[154": forward-word 
"\e[155": shell-forward-word 

这在 Linux 控制台中工作得非常好。在 X Windows (Xorg) 下的 xterm 中:完全不:Xorg 本身扫描密钥。

backward-word can be invoked via "\e[150", "\e[1;2D", "\e[1;3D", "\eb".

中间两个带分号的是VTxxx风格修饰的左箭头。这是预先配置的,并且也会backward-word自动绑定。

答案3

如果我正确理解你的问题:

bind '"^[f": kill-word'

将定义Option+F调用kill-word

答案4

另一个选项是使用Esc然后点击d按钮,您可以模拟相同的键绑定。

与粘贴上一个命令的最后一个参数相同 ( ) 可以通过先点击然后再M-.点击来替换。Esc.

为了帮助我自己使用 Touch Bar 版本的 MacBook,我重新映射Caps Lock ⇪⎋ Escape

重新映射大写锁定

相关内容