如何在OS X终端中逐字移动光标

916

我知道组合键Ctrl+A可以跳转到当前命令的开头,而Ctrl+E可以跳转到结尾。

但是是否有办法像Cocoa应用程序中的Alt+/那样逐词跳转?


2
你使用的是哪个Shell?Bash吗? - Sargun Dhillon
4
iTerm2比内置终端好得多。我在下面发布了关于如何自定义键盘的说明 :) - cwd
26
最新的OS X版本中,在终端中添加了ALT快捷键。 - Mosty Mostacho
7
在我看来,这不是离题的内容。Bash shell 是一个相关的编程环境,并且 readline 绑定在大多数流行的 Linux 命令行应用程序中普遍存在。此外,请看一下点赞的数量,社区已经表明了他们的想法。 - GL2014
13
重新开放投票,OS X Terminal 绝对是一种编程工具。 - djechlin
显示剩余3条评论
20个回答

663

开箱即用,你可以使用相当奇怪的Esc+F将光标移动到下一个单词的开头,使用Esc+B将光标移动到当前单词的开头。


60
在Mac OSX终端中,重新执行命令需要同时按下两个键,这样做比GNOME终端麻烦得多,我认为这种操作方式很差劲。 - Phương Nguyễn
277
您可以在“终端 > 首选项 > 设置 > [配置文件] > 键盘”中启用“使用选项键作为元键”选项。这样,您就不必手动单独输入 Esc 了。 - Chris Page
12
如果你在一行的末尾按下 Esc+F 或在一行的开头按下另一个键组合,它只会插入那个字母。非常令人烦恼!请注意,本次翻译未包含解释和额外内容。 - Noldorin
15
“离奇”的意思是:“F”和“B”代表“前进”和“后退”。按Control-F可以将光标向前移动一个字符,按Control-B可以将光标向后移动一个字符。使用元操作键(或ESC)意味着“按单词移动”。这些绑定是与Emacs兼容的。如果你正在使用bash,有一个选项可以使用vi兼容的绑定,或者你可以通过~/.inputrc来完全自定义它们。 - Chris Page
8
使用选项作为元是不幸的选择,对于我们这些需要选项键输入重要的shell符号(例如在法语键盘上的~和|)的人来说,这不是一个选项。 - Eric O. Lebigot
显示剩余13条评论

564

在 macOS(所有版本)中,默认情况下以下键盘快捷键可用。

  • ALT+F 跳转到向前一个单词。
  • ALT+B 跳转到向后一个单词。

请注意,您必须将Option键设置为像Meta键一样运行。您可以通过访问终端(CMD+,)并选择配置文件 -> 键盘来完成此操作。在 iTerm2 中,选择配置文件 -> 键 -> 通用,并选择“Option键作为Esc +”。

Terminal and iTerm2 Preference Screens

此外,一些Emacs风格的键绑定用于简单文本导航似乎在bash shell上也可以使用。您可以使用:

  • CTRL+F向前移动一个字符
  • CTRL+B向后移动一个字符
  • CTRL+A跳转到行首
  • CTRL+E跳转到行尾
  • CTRL+K从光标位置开始删除该行
  • ALT+D从当前光标位置开始删除一个单词
  • CTRL+W从光标位置向后删除一个单词
  • CTRL+Y从kill缓冲区粘贴文本
  • CTRL+R从历史记录中反向搜索您输入的命令。
  • CTRL+S向前搜索(在我的ZSH中有效,但不适用于bash)

1
谢谢!我一直在想为什么它不能直接使用,这正是我所需要的。 - Flov
29
您可以按照以下步骤更改iTerm2中的元设置:首选项->配置文件->键盘->左选项键作为'+ESC',然后您就可以使用Option+f/b来相应地向前或向后移动单词。更多信息 - Alan Dong
6
[ Ctrl + W ] - 用于从光标位置向后删除一个单词。 - YemSalat
1
[ ctrl + u ] - 删除整个条目 - Cornelius
1
这个方法是可行的,但当我换了一台安装了Catalina系统的新MacBook后,<kbd>alt (⌥)</kbd>+<kbd>F</kbd>等快捷键会跳过/字符,这很麻烦。有什么办法可以将/包含在单词分隔符中吗? - Ben
嗨,@Ben,我刚刚发布了一个关于下划线字符的类似问题。 - Pat

311

这里有如何设置

默认情况下,终端有以下快捷键可以移动光标(向左和向右):

  • esc+B (向左)
  • esc+F (向右)

您可以配置 alt+ 为您生成上述快捷键序列:

  • 打开终端首选项(cmd+,);
  • 在“设置”选项卡中,如果存在,则双击选择键盘的⌥ ←,否则添加;
  • 按需设置修饰符,并在框中输入快捷键:esc+B,生成文本\033b(无法手动输入此文本)。
  • 重复上述步骤以进行向右移动(esc+F 变成 \033f)。

或者,您可以参考TextMate上的这篇博客文章:

http://blog.macromates.com/2006/word-movement-in-terminal/


8
针对 MacOSX 10+ 和 iTerm 用户:您可以在全局偏好设置中分配键盘快捷键,或者将其作为配置文件的键组合。请确保在下拉选择框中选择“发送逃逸序列”,并将 B 用于“后退”,将 F 用于“前进”并输入到 Esc+ 字段中即可。 - Gus
+1 个好的助记符,我之前没有想到过。不幸的是,我现在肯定/不会记住这个,因为我已经配置了 alt leftalt right 来生成那些序列。 - Arc676
如果我将键映射添加到终端,它会将其绑定到“^ [B”而不是Esc-B。 - Andrea Bergonzo

192

切换到iTerm2。它是免费的,比普通终端更好用。此外,它还有更多的自定义选项,如键盘快捷键。

我也喜欢你可以使用 cmd 和 1-9 来在选项卡之间切换。试试看,你再也不会回到普通终端了 :)

如何在 iterm2 中设置自定义键盘偏好

  • 安装 iTerm2
  • 启动,然后进入首选项面板。
  • 选择键盘配置选项卡
  • 您需要将配置文件复制到新文件中,然后删除箭头键快捷方式,如^+Right/Left或者如果您不关心备份,只需从默认配置文件中删除它们。
  • 接下来,请确保所修改的配置文件已被选中(带星号)

Picture 1.png

现在选择键盘选项卡(顶部行)。

iTerm 2

  • 点击加号按钮以添加新的键盘快捷方式
  • 在第一个框中输入CMD+左箭头
  • 在第二个框中选择“发送转义码”
  • 在第三个框中输入字母B

Picture 2.png

  • 使用所需的键组合进行重复操作。按下 escape+B 向左移动一个单词,按下 escape+f 向右移动一个单词。
  • 你可能还希望设置 cmd+d 以删除光标前面的单词,使用 escape+d

我经常在按箭头键时按错按钮(cmd / control / alt),因此我将这些按钮与箭头键组合起来设置为向前和向后跳转单词,但请根据自己的需要进行设置。


5
无论我做什么,都无法使用 Ctrl + Arrow LeftRight 进行操作,但 UpDown 可以使用:/ 已尝试设置新配置文件为默认值和不设置。 - Tobi
6
解决方案:我必须在MacOS系统偏好设置 -> 键盘下禁用任务控制快捷键 :) - Tobi
上面的指令已经无法在iTerm2中使用了。请参考我下面的答案,适用于iTerm2 Build 3.3.4。 - Hang

186

实际上还有一种更好的方法。按住option(在某些键盘上是alt),然后按左右箭头键以单词为单位移动光标。就这么简单。

option
option

此外,ctrle将带您到行尾,ctrla将带您到行首。


9
有时这种方法在某些情况下不起作用。对我来说,当我打开 Terminal.app 时,它是正常的,但对于 IntelliJ 来说,它只会打印 [D[C。为了解决这个问题,在我的 .bashrc 中添加 bind '"[D": backward-word'bind '"[C": forward-word' - Jamie Counsell
@JamieCounsell 我在我的.bashrc中添加了绑定(bind)的东西,但是它没有起作用,我做错了什么吗?(我使用RubyMine) - 张艳军
@张艳军 我不确定RubyMine在终端启动时是否读取.bashrc文件。尝试使用echo "here"命令,看看当您打开新终端时是否会显示该消息。此外,您需要关闭并重新打开终端或运行source ~/.bashrc命令才能使其读取新文件。 - Jamie Counsell
在我的macOS Catalina 10.15.5上完美运行,谢谢。 - Adam

79

我已经让Alt+/生效了:打开首选项»设置»键盘,将选项光标左移的条目设置为发送字符串到shell:\033b,并将选项光标右移设置为发送字符串到shell:\033f。您也可以将此方法用于其他控制键组合。


20
要得到 \033b,实际上需要按 Esc 键,然后再按 b 键。 - Matthew Schinckel
7
我在使用Snow Leopard系统时发现只有在启用将选项键用作元键选项后才能正常工作。顺便说一下,这个功能非常方便,与使用Esc+B或者Esc+F相比,这个键更容易触及。 - Phương Nguyễn
2
出于好奇,这里到底发生了什么?为什么这段代码在OSX上与其他平台不同?我如何找到其他类似的代码? - Koobz
在我的 Mac 上,它是“偏好设置”>“配置文件”>“键”,将左选项键设置为 +Ecs。 - Arun
这对我想要的听起来很不错,但在“首选项”->“设置”->“键盘”下,我没有看到任何地方可以设置这样的条目。需要更多的解释吗? - Flion

50
请使用“自然文本编辑”预设!

图像描述

它实质上将 Option + LeftArrow 绑定到 ^[b 序列,将 Option + RightArrow 绑定到 ^[f,以及其他关键序列。

这适用于 fish 和 bash 终端,以及 psql 终端。


这是设置键的最有效方式。谢谢! - sismo
如果有其他人像我一样感到困惑,请注意这个预设只能在“配置文件”键子选项卡下找到,而不是顶级“键”选项卡下。 - ben-albrecht
这绝对是这里最好的答案! - Panfeng Li

38

实际上,这取决于您使用的shell,但大多数shell具有类似的绑定。您提到的绑定(例如Ctrl+ACtrl+E)是许多其他程序中使用的绑定,它们已经使用了很长时间,并且在大多数UI应用程序中也可以使用。

下面是Bash的默认绑定:

Bash最重要的键盘快捷键

请注意,您可以自定义它们。您需要创建一个文件,命名任意,我命名为.bash_key_bindings并将其放入我的主目录中。您可以在那里设置一些常规的bash选项,也可以设置键绑定。为确保它们被应用,您需要修改一个名为".bashrc"的文件,在启动时bash会读取它(如果不存在,则必须创建它),并在其中进行以下调用:

bind -f ~/.bash_key_bindings

在bash中,~表示主目录。如上所述,您可以根据自己的喜好命名文件,并将其放置在任何地方,只要您提供正确的路径+名称即可绑定它。

让我展示一些我.bash_key_bindings文件的摘录:

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
set show-all-if-ambiguous on
set bell-style none
set print-completions-horizontally off

这些只是设置了一些选项(例如禁用提示音,这些可以在bash网页上查找到)。

"A": self-insert
"B": self-insert
"C": self-insert
"D": self-insert
"E": self-insert
"F": self-insert
"G": self-insert
"H": self-insert
"I": self-insert
"J": self-insert

这些确保仅字符本身不做任何事情,只确保字符被“键入”(它们自己插入到shell上)。

"\C-dW": kill-word
"\C-dL": kill-line
"\C-dw": backward-kill-word
"\C-dl": backward-kill-line
"\C-da": kill-line

这很有趣。如果我仅按下Ctrl+D(我选择的是d删除键),则不会发生任何事情。但是如果我接着输入一个小写字母w,则光标左侧的单词将被删除。然而,如果我输入一个大写字母,则光标右侧的单词会被删除。同样适用于l和L键,涉及从光标开始的整行文本。如果我输入一个“a”,则整行文本将被删除(包括光标前后的所有内容)。

我将向前跳一个单词设置为Ctrl+F,向后跳一个单词设置为Ctrl+B

"\C-f": forward-word
"\C-b": backward-word

如您所见,您可以创建一个立即导向行为的快捷方式,或者您可以创建一个仅初始化字符序列的快捷方式,然后必须键入一个或多个字符才能触发行为,正如上面的示例所示。

因此,如果您不满意默认绑定,请随意根据自己的喜好进行自定义。这里有一个链接到 Bash 手册以获取更多信息。


“command”键的代码是什么?在您的示例中,“control”是“\C”,但“command”是什么? - Paschalis
基本上我想将Ctrl+A映射到cmd+left(转到行的开头) - Paschalis
1
在MacOS X上,命令键映射到bash(\M)中的“Meta”,cmd+left将是\M-\e[D。但是,您无法将cmd+...映射到任何内容,所有命令快捷键都由终端应用程序处理(因此被吞噬),如果您打开了多个终端窗口,则cmd+left将映射到“上一个窗口”。抱歉,使用终端应用程序不可能实现。 - Mecki

37

按住 Option 键并单击光标要移动到的位置。


18

如果你是Vim用户,可以尝试使用bash的vim模式。运行下面的命令或将其添加到你的~/.bashrc文件中:

```set -o vi```
set -o vi

默认情况下,您处于插入模式;按下Esc键后,您可以像在正常模式的Vim中一样移动,因此单词的移动是wb,而通常的移动键也适用


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