【问题标题】:how to bind Ctrl+Enter when using "readline" library?使用“readline”库时如何绑定Ctrl+Enter?
【发布时间】:2016-12-19 10:41:47
【问题描述】:

我正在写一个*nix shell,我想支持Ctrl-Enter的组合键。我使用的库是 GNU readline。

我已经花了几个小时,但找不到路。

我可以绑定Enter成功,如:

========= ~/.inputrc ===============

"\C-M": "sdf"

======================================

当我按下 Enter 时,我得到了“sdf”的回显,正如预期的那样。

我也可以绑定Esc,Enter成功(注意,这里是key serial,不是组合),比如:

========= ~/.inputrc ===============

"\e\C-M": "sdf"

======================================

当我按 Esc 然后按 Enter 时,“sdf”按预期回显。

但是,以下行不能产生有效的 Ctrl-Enter 组合:

========= ~/.inputrc ===============

"\C\C-M": "sdf"

======================================

而且,"\C-\C-M" 也不起作用。

这里有两个相关的问题:

how to bind the 'Enter key'

How to bind Ctrl-Enter in fish?

谁能帮帮我?

【问题讨论】:

  • 第二个链接问题中的答案应该告诉您这实际上是不可能的。
  • Esc 和Control 的区别在于Esc 可以在下一个键之前按下和释放。 \C-M 有效,因为大多数终端在您按 Enter 或 Control-m 时会生成 ASCII 13。您需要同时按住控制键和另一个键,它才有意义;按住两次是什么意思?
  • "按住两次是什么意思?"
  • “按住两次是什么意思?”对不起,我在哪里表示,请原谅我的英语不好。我或多或少知道你的意思。但是奇怪的是zsh支持Alt+Enter,还有一些*nix shell支持Shift+Enter(google的时候看到的)。 @chepner
  • shell 对键盘一无所知;它只是在其输入文件上获取一系列字节。您的终端仿真器会生成该系列字节,其中一件事是在您按下 Enter 键时写入 ASCII 13。因此,Control-Enter 不是您可以用单个字节表示的。

标签: linux bash shell readline


【解决方案1】:

你没有提到你使用哪个终端模拟器——这很重要,因为最终,当你按下 CTRL+ENTER 时,终端决定了你的程序从中读取什么

实现这项工作的一种方法是(假设您使用xterm):

  • xterm 发送例如CTRL+k 当你按下 CTRL+ENTER 时,通过在.Xdefaults 中添加一行:

    XTerm.vt100.translations: #override Ctrl<Key>Return: string("\013")

  • 将此绑定到.inputrc中您想要的任何内容:

    "\C-k": "sdf"

不是很优雅,因为这只适用于xterm。但是,据我所知,这是获得您想要的东西的唯一方法。

【讨论】:

  • 这有一个相当大的缺点,就是不能让你使用某些应用程序常用的 Ctrl-K。也许您可以将 Ctrl-Enter 映射到其他序列,而不仅仅是一个字符。但是您可能不能指望其他用户设置相同的映射(即使假设他们使用 xterm)。 OP 不希望其他人使用该应用程序可能是合理的。
猜你喜欢
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2019-04-05
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多