如何在zsh中绑定CTRL + Enter键?

12

我想在 zsh 中绑定 Ctrl+Enter ↵

bindkey '^M' autosuggest-execute

但是似乎终端会为除了Alt键以外的任何修改键发送相同的转义序列。

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^M       13 0015 0x0d # Enter
^M       13 0015 0x0d # CTRL  + Enter
^M       13 0015 0x0d # SHIFT + Enter
^[^M     27 0033 0x1b # ALT   + Enter
         13 0015 0x0d

我不确定问题是否特定于 gnome-terminal。我也在 mate-terminalxterm 中进行了测试,结果是相同的。有没有办法检测到 CTRL + Enter


可能是Can terminals detect <Shift-Enter> or <Control-Enter>?的重复问题。 - Adaephon
@Adaephon 这很相似。但在我的情况下,终端不将 CTRL + Enter 视为 <NL>,而是视为 ^M,这与 EnterSHIFT + Enter 相同。 - Andrija Čehko
1个回答

6
这里提供了适用于xterm、gnome-terminal和XWindow系统中的任何其他终端仿真器的解决方案。
请注意,将Ctrl+Enter映射到特定的shell命令可以通过特定的方式在xterm中完成,而不会影响运行在同一X服务器上的其他终端仿真器。在gnome-terminal中,有一个更通用的解决方案,但它将同时应用于您XWindow服务器上的每个终端仿真器,而不仅仅是gnome-terminal。因此,根据您的需求,您必须选择这两个解决方案之一。
首先,以下是与xterm特别匹配的解决方案:
我们将Ctrl+Enter绑定到未被其他组合键占用的序列上:使用xterm时,可以通过指定一些X资源来填充转换表来完成此操作。例如,将其绑定到Esc+M。然后,在zsh中使用bindkey将此特定序列绑定到ZLE功能(根据您的问题,例如autosuggest-execute)。
只需按照以下步骤尝试:
1- 以以下方式启动xterm:
% xterm -xrm '*.VT100.translations: #override Ctrl <Key>Return: string(0x1b) string("M")'

注意:我们使用了Return,但是我们将以这种方式映射Enter
2- 在新的xterm窗口中,使用bindkey:
% bindkey '^[M' autosuggest-execute

3- 现在按下CTRL-Enter运行 autosuggest-execute

这里是一个更通用的解决方案,对于几乎所有终端仿真器都适用:

像上面一样,让我们将 Ctrl + Enter 绑定到一个尚未被其他组合绑定的序列(我们选择 Esc + M)。使用 Compose (5) X11 机制:添加一个文件 $HOME/.XCompose,其中包含一个特定映射,用于多键输入序列 Ctrl + M。然后,在 zsh 中使用 bindkey 将此特定序列绑定到您的 ZLE 函数(根据您的问题,绑定到 autosuggest-execute

要尝试,请按照以下步骤进行:

1- 创建名为 $HOME/.XCompose 的新文件

在此文件中添加以下内容:

include "%L"
! Ctrl <Return> : "\033M"

注意1:我们使用了Return,但实际上要映射的是Enter

注意2: 不是注释标记,在这一行开头保留它非常重要。

注意3:第一行(include...)是为了让其他快捷键正常工作(例如将^ + e映射为ê)。

2- 现在,您可以启动gnome-terminal。

3- 在新的gnome-terminal窗口中,使用bindkey命令:

% bindkey '^[M' autosuggest-execute

4- 现在按下 CTRL-Enter 键以运行自动建议执行。


1
xterm解决方案可行,但我无法使用gnome-terminal。似乎~/.XCompose文件未加载。我尝试了export GTK_IM_MODULE=xim,但仍然没有成功。 - Andrija Čehko
1
通用解决方案对我不起作用。当运行“im-config”时,我收到错误消息:“GTK+仅支持输出一个字符:"\033M":!Ctrl<Return>:"\033M"”。 - kuceb
1
通用解决方案在我使用最小化的i3/alacritty系统上运行良好。 - ForeverZer0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接