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


762

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

但是,有什么方法可以像Cocoa应用程序中的Alt+ / 一样逐字跳跃吗?


2
您正在使用什么外壳?重击?
Sargun Dhillon

4
iTerm2比内置终端好得多。我在下面发布了有关如何自定义键盘的说明:)
cwd

21
ALT快捷方式已被添加到终端在最新的OS X版本。
Mosty Mostacho

7
在我看来,这不是一个话题,Bash shell是一个相关的编程环境,在大多数流行的Linux CLI应用程序中普遍存在readline绑定。另外,请看社区已发表的投票数。
GL2014 2014年

11
重新投票,OS X Terminal非常视为编程工具。
djechlin '16

Answers:


566

开箱即用,您可以使用非常奇怪的Esc+ F移至下一个单词的开头,而Esc+ B移至当前单词的开头。


47
再次按下两个键以再次重新执行命令是不方便的。与GNOME终端相比,我发现在Mac OSX终端中执行此操作相当la脚。
PHUONG阮

244
您可以在终端>首选项>设置> [配置文件]>键盘中启用“将选项用作元键” 。然后,您不必单独手动键入Esc。
克里斯·佩奇

7
同样,如果您在行尾或其他键组合在行尾时按Esc+ F,则只会插入字母。烦人!
Noldorin

10
关于“ bizarre”:“ F”和“ B”代表“前进”和“后退”。Control-F将光标向前移动一个字符,而Control-B将光标向后移动一个字符。使用Meta修饰符(或ESC)表示“按字移动”。这些是emacs兼容的绑定。如果您使用的是bash,则可以选择使用vi兼容的绑定,也可以使用完全自定义它们~/.inputrc
克里斯·佩奇

5
不幸的是,对于那些需要使用Option键键入重要的shell符号(例如〜和|)的人来说,使用option作为meta并不是一个选择。(例如法语键盘上的)。
Eric O Lebigot

417

在Mac OS X上-默认情况下,以下键盘快捷键有效。请注意,您必须在终端首选项中(在键盘选项卡下)使Option键像Meta一样运行

  • alt (⌥)+ 向前FF
  • alt (⌥)+ B跳过B单词

我观察到,用于简单文本导航的默认emacs键绑定似乎适用于bash shell。您可以使用

  • alt (⌥)+ D删除从当前光标位置开始的单词
  • ctrl+ A跳到行首
  • ctrl+ E跳到行尾
  • ctrl+ K杀死从光标位置开始的行
  • ctrl+ Y从终止缓冲区粘贴文本
  • ctrl+ R从历史记录中反向搜索您过去键入的命令
  • ctrl+ S转发搜索(对我来说,在zsh中有效,但对bash无效)
  • ctrl+ F向前移动一个字符
  • ctrl+ B向后移动一个字符
  • ctrl+ W从光标位置向后删除单词

1
谢谢!我想知道为什么它没有开箱即用,这正是我所需要的。
Flov 2011年

11
您可以按以下方式在iterm2中更改meta:首选项->配置文件->键->左选项键充当+ESC,然后可以使用OPTION f / b相应地前后移动单词。更多
艾伦·董

5
[ Ctrl + W ]-从光标位置向后删除单词
YemSalat '16

[ctrl + u] -删除整个条目
Cornelius

286

这是你怎么做

默认情况下,终端具有以下快捷方式来逐字移动(左右):

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

您可以配置alt+ 为您生成这些序列:

  • 打开终端首选项(cmd+ ,);
  • 在“设置”选项卡上,选择“键盘”,然后双击⌥ ←它(如果没有),或者添加它。
  • 根据需要设置修饰符,然后在框中输入快捷键:esc+ B,生成文本\033b(您不能手动输入此文本)。
  • 重复右移字(esc+ F变成\033f

或者,您可以在textmate上参考此博客文章:

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


7
对于MacOSX 10+和iTerm用户:您可以在全局首选项上分配按键快捷方式,或者作为配置文件按键组合。确保你选择:“发送转义序列”的下拉菜单中选择并输入刚才B背面FEsc+现场
格斯

+1是我以前没有想到的助记符。我肯定/很遗憾现在不会记住这一点,因为我配置alt leftalt right生成了这些序列
Arc676,2015年

如果我将密钥映射添加到终端,它将绑定到'^ [B'而不是Esc-B。
安德里亚·贝尔贡佐

164

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

我也很喜欢您可以使用cmd和1-9在选项卡之间切换。尝试一下,您将永远不会回到常规终端:)

如何在iterm2中设置自定义键盘首选项

  • 安装iTerm2
  • 启动,然后转到首选项窗格。
  • 选择键盘配置文件选项卡
  • 您可能需要将配置文件复制到新的内容,然后删除箭头快捷键(例如^+ Right/),Left或者如果您不关心备份,只需将其从默认配置文件中删除即可。
  • 接下来,请确保已选择您修改过的个人资料(已加星标)

图片1.png

  • 现在选择键盘标签(非常第一行)

iTerm 2

  • 单击加号按钮以添加新的键盘快捷键
  • 在第一个框中,输入CMD+Left arrow
  • 在第二个框中选择“发送转义码”
  • 在第三个框中键入字母 B

图片2.png

  • 重复所需的组合键。escape+ B向左移动一个单词,escape+ f向右移动一个单词。
  • 你也不妨设立cmd+ d以删除光标前面的单词escape+d

我经常用箭头键敲击错误的按钮(cmd/ control/ alt),因此我将箭头键组合在一起的那些按钮都设置为向前和向后跳转,但是请执行最适合您的操作。


4
无论我做什么,我不能进入Ctrl + Arrow LeftRight- UpDown工程:/尝试使用和不使用新的配置文件设置为默认值
托比

4
解决方案:我不得不在MacOS系统偏好设置->键盘:)下禁用任务控制快捷方式
Tobi,2017年

以上说明不适用于iTerm2。请参阅以下有关iTerm2 Build 3.3.4的答案。
挂起

150

实际上,有更好的方法。按住optionalt在某些键盘上),然后向左或向右按​​箭头键逐字移动。就那么简单。

option
option

ctrle可以将您带到行尾,ctrla并将您带到行头。


2
有时,在某些情况下这不起作用。对我来说,当我打开Terminal.app时,这很好,但是对于IntelliJ,它只是打印[D[C。为了解决这个问题,添加bind '"[D": backward-word'bind '"[C": forward-word'我的.bashrc
Jamie Counsell

@JamieCounsell我向我添加了绑定内容,.bashrc但是没有用,对我来说有什么问题吗?(我使用RubyMine)
张艳军

@张艳军我不确定.bashrc终端启动时RubyMine是否读取。尝试echo "here"查看打开新终端时是否显示该消息。另外,您必须关闭并重新打开终端,或者运行source ~/.bashrc以使其读取新文件。
Jamie Counsell's

79

我有Alt+ / 工作:打开“首选项”»“设置”»“键盘”,设置选项光标左侧的条目以将字符串发送到外壳:\ 033b,设置选项光标右侧将字符串发送到外壳:\ 033f。您也可以将其用于其他控制键组合。


20
要获取\ 033b,您实际上需要按Esc,然后按b。
马修·申克尔

7
我在Snow Leopard上,发现它只有在启用时才有效Enable option as meta key。顺便说一句,这很酷。关键是一定要方便多了要达到比较Esc键+ B或Esc键+ F
PHUONG阮

2
出于好奇,这到底是怎么回事?为什么此代码与OSX开头的代码不同?我如何找到其他此类代码?
Koobz 2011年

在我的Mac中,其“偏好设置”>“配置文件”>“左键”选项键设置为+ Ecs
2015年

38

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

这是Bash的默认绑定的外观:

最重要的Bash键盘快捷键

另请注意,您可以自定义它们。您需要创建一个文件,其名称随心所欲,我将其命名为mine .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

这些确保仅字符就什么都不做,而是确保字符是“输入”的(将自己插入到外壳中)。

"\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 2014年

基本上我想将Ctrl + A映射到cmd + left(转到行的开头)
Paschalis 2014年

1
@Paschalis在MacOS X上,命令键以Metabash(\M)映射到,cmd + left为\M-\e[D。但是,您无法将cmd + ...映射到任何内容,所有命令快捷方式都由​​终端应用程序本身处理(因此被吞没了)(从来没有转发到Shell),并且如果您有多个命令,则cmd + left映射到“上一个窗口”终端窗口打开。抱歉,使用终端应用程序是不可能的。
Mecki 2014年

18

使用自然文本编辑预设!

在此处输入图片说明

本质上,除了其他键序列外,它还绑定Option + LeftArrow到^[bsequence和Option + RightArrow到^[f

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


这是为键设置良好的旧映射的最有效方法。谢谢!
fedesismo19年

万一其他人像我一样感到困惑,请注意,此预置仅在配置文件“键”子选项卡下可用,而在顶级“ 键”选项卡下不可用。
本·阿尔布雷希特

15

如果您恰好是Vim用户,则可以尝试bash的vim模式。运行此命令或将其放入~/.bashrc文件中:

set -o vi

默认情况下,您处于插入模式;命中转义,您可以像在普通模式下的Vim一样来回走动,因此按字移动是wb通常的移动键也可以使用


15

如果您Use option as meta key在首选项的键盘选项卡中签入,则默认的emacs样式命令分别用于前向和后向单词以及⌥FAlt+ F)和⌥BAlt+ B)。

我建议阅读从Bash到Z-Shell。如果您想提高bash / zsh的实力!


1
是的,那行得通。但是问题是当我想在选项7,选项8和选项9上键入大括号([] {} |)时。现在选项是元,所以最终以元7,元8结束...有什么想法吗?
Martin Wickman

12

从Mac OS X Lion 10.7开始,默认情况下,Terminal映射Option- Left/Right ArrowEsc- b/f,因此,它是内置于bash和其他使用这些emacs兼容键绑定的程序的。



8

在Bash中,这些绑定到Esc- BEsc- F。Bash有很多很多键盘快捷键。bind -p看一下它们的输出,看看它们是什么。


4

在的iterm2偏好设置”>“配置文件”>“键”下,单击+下面的“ 键映射”并记录新的快捷方式。对于“操作”,分别选择Send Escape Sequence并键入bf,或者分别向后和向前。

当我尝试为(Ctrl+ )录制一个时,我在“ 键盘快捷键”字段中注意到箭头从未出现。事实证明,我必须先禁用默认Mac的“ 系统偏好设置”>“键盘”>“快捷方式”>“任务控制”快捷方式,然后才能使用,因为它们将覆盖iterm2的默认快捷方式。对于标准终端应用程序也应如此。

键盘系统偏好设置


1

iTerm2 Build 3.3.4用户的新答案:

步骤1:(macOS X)“系统偏好设置”>“键盘”>“快捷方式”选项卡>选择“任务控制”(左侧面板)>取消选中标记为“向左移动空间”和“向右移动空间”的快捷方式

步骤2:(iTerm2 Build 3.3.4)“首选项”>“配置文件”>“选择*默认值”(左面板)>“键”选项卡>删除“⌥->”和“⌥<-”条目,同时设置“左选项(⌥)”键: ”和“右键(⌥)键:”到Esc +

不要弄乱外壳轮廓,不要弄乱劣质masOS(默认)终端,不要笨拙地按Esc + F / B,冲洗并重复无意义。

木已成舟!!!

我的程序员程序员,请喜欢这篇技巧!


0

正如前面回答,您可以添加set -o vi在您~/.bashrc使用vi/ vim键绑定,否则你可以添加以下部分.bashrc与移动Ctrl和箭头键:

# bindings to move 1 word left/right with ctrl+left/right in terminal, just some apple stuff!
bind '"\e[5C": forward-word'
bind '"\e[5D": backward-word'
# bindings to move 1 word left/right with ctrl+left/right in iTerm2, just some apple stuff!
bind '"\e[1;5C": forward-word'
bind '"\e[1;5D": backward-word'

要开始执行这些代码行,请选择source ~/.bashrc或开始一个新的终端会话。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.