我想在我的~/.inputrc中为\C-m自定义绑定。但是,当我替换它的那一刻,我无法再输入任何命令。例如,
"C-m": vi-forward-word
问题似乎是存在默认绑定
"C-m": accept-line
这本身不是问题,但似乎其他程序(终端?)发送^M(Ctrl-m)来指示回车。在我的设置中,我有urxvt,但我也尝试了xterm,行为是相同的(一旦我在inputrc的末尾添加"\C-m"vi-forward-word绑定,返回就不再有效)。
现在我想改变这一点,我愿意修补任何涉及的程序/库。我的问题是:我应该在哪里寻找相关作品?我检查了阅读行源代码,但找不到任何表明 \C-m 在内部重用的内容。同样,我检查了urxvt,但我在代码中找不到任何将回车映射到\C-m的内容(这将是我对导致此行为的情况的最佳猜测)。有趣的是,有一个 rxvt.7.pod 包含
KP_Enter ^M ESC O M
和 rxvt-unicode.termcap 与
...:cr=^M:...
但是,这两个文件似乎主要是文档或至少未安装。我对terminfo文件及其对整个终端工作的参与的了解有些有限。readline 和终端之间的交互也是如此(在我的示例中,readline 是否在 urxvt 之前调用?因此,如果有人有关于在哪里看的指针,我将不胜感激。
顺便说一句:我添加的那一刻
"r": accept-line
在"\C-m"绑定之后,我恢复了原始行为(即返回工作)。如果我在"\C-m"之前添加该行,返回仍然无法按预期工作。
干杯!
德索
"r"
、"C-m"
、"C-M"
、^M
都是相同的字符:ASCII CR(回车),通常回车映射到换行符(ASCII LF 换行)。 当然,这种行为是由readline假设的。原则上,使用 readline 库的应用程序可以抑制映射,但仅使用 .inputrc
文件和 shell 可以执行的操作很少。
该行
KP_Enter ^M ESC O M
在这里无关紧要:它指的是数字小键盘上的 Enter 键,而不是主键盘上的 Enter 键。