在zsh中寻找ALT+左箭头键的解决方案

247

我最近从bash切换到了zsh,但我错过了使用Alt+LeftArrowKeyAlt+RightArrowKey一次移动一个单词的功能。

现在,如果我按Alt+LeftArrowKey,我只能回退几个字母,然后就卡住了。我无法再向后回退,Alt+RightArrowKey也不能让光标回到行末,这与我预期的不同。我甚至不能使用箭头键到达行末,只能到达倒数第二个字符。也无法输入新的字符或删除字符。

我如何才能恢复我钟爱的快捷键呢?

我使用的是Mac OS X系统和Terminal。

14个回答

447

运行cat,然后按下快捷键以查看您的快捷方式发送的代码。
(完成后按Ctrl+C杀死cat。)
对于我来说,在(ubuntu、konsole、xterm)中按下Alt+会发送^[[1;3D,所以我会将其放在我的.zshrc中。

bindkey "^[[1;3C" forward-word
bindkey "^[[1;3D" backward-word

(实际上,我更喜欢使用Ctrl +箭头逐字移动,就像在Windows或Linux GUI下的普通文本框中一样。)

相关问题:在Terminator终端模拟器中运行Zsh时修复键设置(Home / End / Insert / Delete)


25
你是我的救星!在我的 Mac 上,“Alt + <-” 给了 “^[b”,而 “->” 给了 “^[f”,所以我添加了这些。效果非常好。在 Mac 上,Ctrl+方向键是用于在桌面之间切换的。 - Mads Ohm Larsen
1
一个需要注意的问题是,对于ctrl+<-,cat 报告的是“^[[D”,而ctrl+v则报告的是“^[OD”。Ctrl+v的建议可行,但cat的建议不行。此外,ctrl+v对于alt+<-和alt+->都报告相同的内容。通过查看cat的输出并将任何“[[”替换为“O”,我成功地添加了这两个快捷键。 - Mike S
14
我的输出在 cat 下是 ^[^[[C 表示向前一个单词,而 ^[^[[D 表示向后一个单词,但在 .zshrc 中更新它们出了一些问题。 - Yunti
8
@Yunti - 在我的 ~/.zprofile 文件中添加 bindkey "^[^[[D" backward-wordbindkey "^[^[[C" forward-word 就解决了我的问题! - Fernando Espinosa
4
在编辑文件后,请不要忘记运行 source ~/.zshrc - Aaron
显示剩余3条评论

318
对于使用iTerm的任何人,无论使用什么shell
在我看来,这里提供的所有解决方案都是一种倒退的方法。实质上,你是告诉你的shell去监听一些在终端中设置的esc序列或其他键绑定,这样在切换shell时会产生兼容性问题(如果你SSH到其他shell,从BASH切换到ZSH等,可能会丢失一些甚至全部的键绑定)。
大多数shell都有一组预先绑定的默认序列。此外,虽然它们并不完全一致,但足够接近。因此,我发现在shell中为特定操作创建键绑定的最简单方法是告诉你的终端应用程序绑定到跨shell保持一致的默认键绑定。
我写了一个简洁的解决方案,使你的终端响应得更接近原生的Mac键绑定

enter image description here

打开 iTerm 首选项 +, 并导航到配置文件选项卡(也可以使用键盘快捷键选项卡,但将快捷键添加到您的配置文件中可让您保存您的配置文件并将其同步到多台计算机上),然后打开按键映射子选项卡,点击增加按键映射并输入以下内容:

将光标向左移动一个单词

+ 发送十六进制代码:0x1b 0x62

将光标向右移动一个单词

+ 发送十六进制代码:0x1b 0x66

这样不仅在 ZSH 中,而且在通过 SSH 连接到运行 BASH、irb/pry、Node.js 等服务器时都能得到所需的行为。


2
我在使用已接受的解决方案时遇到了问题,因为我的zsh工作正常,但是irb和其他控制台却不行。像建议的那样擦除先前的设置(在iTerm配置文件中)非常有效! - llekn
2
绑定按键方案在Mac上会发出令人讨厌的错误提示音。这应该是正确的方法。 - Weishi Z
1
很可能是因为你的shell没有映射到默认配置。运行bindkey | grep forward-word,你应该会看到返回了"^[f" forward-word,但如果没有,你有两个选择。将其映射到其他返回值之一,或将"^[f" forward-word添加到你的.zshrc文件中。 - Travis
这是在我的 Mac 上第一次就成功的正确解决方案 - 谢谢! - Ermiya Eskandary
在“键映射”选项卡中,您还可以加载“自然文本编辑”预设。这将额外为您提供像alt+backspace这样的功能,用于删除一个单词。 - tjwelde
显示剩余6条评论

93

在我的OSX Mountain Lion上,将以下内容添加到~/.zshrc中对我有效。

bindkey -e
bindkey '[C' forward-word
bindkey '[D' backward-word

5
这个解决方案在每次使用时都会在iTerm 2中触发一次“铃声”,所以跳转单词会变得非常烦人。 - Matthew Morek
1
有人找到了如何禁用这个的方法吗?^ @MatthewMorek - Daniel Kobe
26
'\e\e' 可以防止响铃。我在El Capitan操作系统上使用iTerm 2终端兼容模式,并进行以下配置:bindkey "\e\e[D" backward-word bindkey "\e\e[C" forward-word - Johannes Gontrum
谢谢,这解决了在macOS Sierra上的问题。我在终端或iTerm2上都没有听到任何铃声。 - Raspo
你如何设置它从单词的末尾而不是开头移动? - Mafro34
还适用于带有ISO键盘的Hackintosh Ventura :D - ZeoS

52
在MacOS High Siera 10.13.6或Mojave 10.14.2上,使用iTerm2与ZSH。要从单词移动,我必须这样做:
bindkey "\e\e[D" backward-word
bindkey "\e\e[C" forward-word

其他的解决方案对我不起作用


2
这是唯一对我有效的解决方案。谢谢!Mac OS Mojave - james-see
1
同样适用于Catalina操作系统! - Reed Richards
返回翻译后的文本:\e\e[D. 它代表哪些键 - Bravo
非常感谢,您为我解决了在Big Sur上的问题。 - Adam K Dean
工作正常,而且没有“boop”声音 <3 - KFunk

40

iTerm用户,前往此截图所示位置并选择“自然文本编辑”

enter image description here

如果您已经设置了一些按键映射,则会如下图所示进行提示,选择相应选项以避免丢失之前设置的任何特殊绑定。但是,如果您不记得添加任何绑定或刚开始使用iTerm(在此计算机上),则选择“删除”是安全的。

enter image description here


4
这怎么不是被接受的答案,太完美了! - kjonsson
2
是的!我正在使用iTerm,这个方法有效了,谢谢! - jurl
2
这是iTerm的最佳工作答案! - VisioN

9
虽然并非严格回答您的问题,但是forward-wordbackward-word的默认绑定分别为alt-falt-b
这在任何地方都有效,不需要您离开主键区,并且具有很好的助记属性(f表示向前,b表示向后),同时也与ctrl-fctrl-b分别对应forward-characterbackward-character的一致性。
请摆脱箭头键!

6
在zsh/iterm2中无法正常工作,输出ƒ和∫(c-b cf可以正常工作)。 - Davorin

4
为了让它对我起作用,我使用了这个答案,但我必须交换代码(左 <-> 右)
⌥+← 发送十六进制代码:0x1b 0x66 ⌥+→ 发送十六进制代码:0x1b 0x62
并将以下内容添加到我的~/.zshrc文件中。
bindkey -e
bindkey "^[b" backward-word
bindkey '^[f' forward-word

如果您将bindkey绑定为forward-word而不是backward-word,将^[f绑定到它可能会更清晰明了。这样做可以避免混淆。 - Nickolay

3
这些键绑定适用于在Arch Linux上使用的Alacritty,只需将它们添加到~/.zshrc文件中即可。
bindkey -e

bindkey "^[[3~" delete-char                     # Key Del
bindkey "^[[5~" beginning-of-buffer-or-history  # Key Page Up
bindkey "^[[6~" end-of-buffer-or-history        # Key Page Down
bindkey "^[[H" beginning-of-line                # Key Home
bindkey "^[[F" end-of-line                      # Key End
bindkey "^[[1;3C" forward-word                  # Key Alt + Right
bindkey "^[[1;3D" backward-word                 # Key Alt + Left

2
在MacOS Monterey上,使用以下代码在~/.zshrc中,使SHIFT + Arrows可以跳转单词:
bindkey "^[[1;2C" forward-word
bindkey "^[[1;2D" backward-word

下面介绍的是使用 Option + 方向键 的技巧:

bindkey "^[^[[C" forward-word
bindkey "^[^[[D" backward-word

1
在zsh中,您可以使用bindkey命令查看键盘快捷键。
使用bindkey来探索可用的选项,而不需要自定义键绑定。
^[b向后移动一个单词和^[f向前移动一个单词。

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