ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

你用的是什么外壳?重击?
iTerm2 比内置终端好得多。我在下面发布了有关如何自定义键盘的说明:)
ALT 快捷方式已添加到最新 OS X 版本的终端中。
在我看来,这不是题外话,Bash shell 是一个相关的编程环境,readline 绑定在大多数流行的 Linux CLI 应用程序中都很普遍。另外,看看社区的投票数量。
重开投票,OS X Terminal 非常算得上是一个编程工具。

d
dcharles

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


重新按下两个键以再次重新执行命令很不方便。与 GNOME 终端相比,我发现在 Mac OSX 终端中执行此操作非常蹩脚。
您可以在终端 > 首选项 > 设置 > [配置文件] > 键盘中启用“使用选项作为元键”。然后您不必单独手动键入 Esc。
此外,如果您在行尾或行首的其他组合键时点击 Esc+F,它只会插入字母。恼人的!
关于“奇异”:“F”和“B”代表“前进”和“后退”。 Control-F 将光标向前移动一个字符,而 Control-B 将光标向后移动一个字符。使用 Meta 修饰符(或 ESC)意味着“按单词移动”。这些是与 emacs 兼容的绑定。如果您使用 bash,则可以选择使用与 vi 兼容的绑定,或者您可以使用 ~/.inputrc 完全自定义它们。
不幸的是,对于我们这些需要 option 键来键入重要 shell 符号(如 ~ 和 | (就像在法语键盘上一样)。
J
Josh K

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

ALT+F 向前跳一个字。

ALT+B 向后跳一个字。

请注意,您必须将 Option 键设置为类似于 Meta 键。您可以通过访问首选项 (CMD+,) 并选择配置文件 -> 键盘在终端中执行此操作。在 iTerm2 Pselect rofiles -> Keys -> General 并选择“Option key as Esc+”。

https://i.stack.imgur.com/b22Mm.jpg

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

CTRL+F 向前移动一个字符

CTRL+B 向后移动一个字符

CTRL+A 跳转到行首

CTRL+E 跳转到行尾

CTRL+K 终止从光标位置开始的行

ALT+D 删除从当前光标位置开始的单词

CTRL+W 从光标位置向后删除单词

CTRL+Y 从终止缓冲区粘贴文本

CTRL+R 从历史记录中反向搜索您过去键入的命令。

CTRL+S 转发搜索(对我来说在 ZSH 中有效,但在 bash 中无效)


谢谢!我想知道为什么它不能开箱即用,这正是我所需要的。
您可以按以下方式更改 iterm2 中的元:首选项 ->配置文件 ->键->左选项键充当+ESC,然后您可以使用 OPTION f/b 相应地向前和向后移动单词。 More
[ Ctrl + W ] - 从光标位置向后删除单词
ctrl + u ] - 删除整个条目
这行得通,但是当我得到一台装有 Catalina 的新 MacBook 时,<kbd>alt (⌥)</kbd>+<kbd>F</kbd>和朋友跳过 / 个字符,这很痛苦。知道如何将 / 包含为单词分隔符吗?
Y
Yves M.

Here's how you can do it

默认情况下,终端有这些快捷键来逐字移动(左右):

ESC+B(左)

ESC+F(右)

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

打开终端首选项(cmd+,);

在“设置”选项卡上,选择“键盘”并双击 ⌥ ← 如果它在那里,或者如果它不存在则添加它。

根据需要设置修饰符,在框中键入快捷键:esc+B,生成文本\033b(不能手动键入此文本)。

对 word-right 重复(esc+F 变为 \033f)

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

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


对于 MacOSX 10+ 和 iTerm 用户:您可以在全局首选项中分配快捷键,也可以作为配置文件组合键。确保在下拉选择中选择:“发送转义序列”,然后在 Esc+ 字段中输入 B 代表 backF 代表 forward
+1 是我之前没有想到的一个很棒的助记符。我现在肯定/很遗憾记得这一点,因为我配置了 alt leftalt right 来生成这些序列
如果我将键映射添加到终端,它会将其绑定到 '^[B' 而不是 Esc-B。
L
L Y E S - C H I O U K H

切换到 iTerm2。它是免费的,而且比普通的旧终端好得多。它还具有更多自定义选项,例如键盘快捷键。

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

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

安装 iTerm2

启动然后转到首选项窗格。

选择键盘配置文件选项卡

您需要将配置文件复制到新的内容,然后删除箭头键快捷键,例如 ^+ 右/左,或者如果您不关心备份,只需从默认配置文件中删除它们。

接下来确保选择了您修改过的个人资料(已加星标)

https://i.stack.imgur.com/cqLnO.png

现在选择键盘选项卡(最上面一行)

https://i.stack.imgur.com/i2o2y.png

单击加号按钮以添加新的键盘快捷键

在第一个框中键入 CMD+向左箭头

在第二个框中选择“发送转义码”

在第三个框中输入字母 B

https://i.stack.imgur.com/xFBlY.png

重复所需的组合键。 escape+B 向左移动一个单词,escape+f 向右移动一个单词。

您可能还希望设置 cmd+d 以使用 escape+d 删除光标前面的单词

我经常用箭头键按错按钮(cmd / control / alt),所以我的箭头键组合与这些按钮都设置为向前和向后跳转单词,但请做最适合你的。


无论我做什么,我都无法输入 Ctrl + Arrow LeftRight - UpDown 有效:/ 尝试使用和不使用新配置文件设置为默认值
解决方案:我必须在 MacOS 系统偏好设置 -> 键盘下禁用任务控制快捷方式 :)
上述指令不再适用于 iTerm2。请参阅我对 iTerm2 Build 3.3.4 的以下答案。
r
rogerdpack

实际上有一个更好的方法。按住选项(某些键盘上的 alt)并按左或右箭头键按单词移动。就那么简单。

选项← 选项→

此外, ctrle 将带您到行尾,而 ctrla 将带您到开始。


有时这在某些情况下不起作用。对我来说,当我打开 Terminal.app 时,一切正常,但对于 IntelliJ,它只打印了 [D[C。要解决此问题,请将 bind '"[D": backward-word'bind '"[C": forward-word' 添加到我的 .bashrc
@JamieCounsell 我在我的 .bashrc 中添加了绑定东西,但它没有用,对我有什么问题吗? (我使用 RubyMine)
@张艳军我不确定终端启动时RubyMine是否读取.bashrc。尝试 echo "here" 并查看在您打开新终端时是否显示该消息。此外,您必须关闭并重新打开终端或运行 source ~/.bashrc 以使其读取新文件。
在 macOS Catalina 10.15.5 上非常适合我,谢谢
d
dcharles

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


要获得 \033b,您实际上需要按 Esc,然后按 b。
我在 Snow Leopard 上,发现它仅在您启用 Enable option as meta key 时才有效。顺便说一句,这很酷。与 Esc+B 或 Esc+F 相比,按键肯定更方便
出于好奇,这里到底发生了什么?为什么这段代码在 OSX 开始时会有所不同?我怎样才能找到其他这样的代码?
在我的 Mac 中,它的 Preferences > Profiles > Keys left option key set as +Ecs
这听起来很适合我想要的东西,但是在首选项-> 设置-> 键盘下,我看不到可以设置此类条目的任何地方。需要更多解释吗?
M
Mecki

实际上,这取决于您使用的 shell,但是大多数 shell 都有类似的绑定。您所指的绑定(例如 Ctrl+A 和 Ctrl+E)是您可以在许多其他程序中找到的绑定,并且它们已经使用了很长时间,顺便说一句,它也适用于大多数 UI 应用程序。

下面是 Bash 的默认绑定:

Most Important Bash Keyboard Shortcuts

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

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

正如你所看到的,你可以创建一个快捷方式,立即导致一个动作,或者你可以创建一个快捷方式,它只是初始化一个字符序列,然后你必须输入一个(或多个)字符才能导致动作发生在上面的示例中显示。

因此,如果您对默认绑定不满意,请随意自定义它们。此处是 link to the bash manual 以了解更多信息。


command键码如何?在您的示例中,control\C,但 command 是什么?
基本上我想将 Ctrl+A 映射到 cmd+left (转到行首)
@Paschalis 在 MacOS X 上,命令键映射到 bash (\M) 中的 Meta,cmd+left 将是 \M-\e[D。但是,您不能将 cmd+... 映射到任何东西,所有命令快捷方式都由终端应用程序本身处理(并因此被吞没)(那些永远不会转发到 shell),如果您有多个,则 cmd+left 映射到“上一个窗口”终端窗口打开。抱歉,终端应用程序无法做到这一点。
D
Dziamid

使用自然文本编辑预设!

https://i.stack.imgur.com/EUuAA.png

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

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


这是为键设置良好的旧映射的最有效方法。谢谢!
如果其他人像我一样感到困惑,请注意此预设仅在配置文件 Keys 子选项卡下可用,而不是顶级 Keys 选项卡。
D
Dan Alboteanu

按住 Option 键并单击您希望光标移动的位置


j
jches

如果你碰巧是 Vim 用户,你可以试试 bash 的 vim 模式。运行此程序或将其放入您的 ~/.bashrc 文件中:

set -o vi

默认情况下,您处于插入模式;点击escape,你可以像在普通模式下一样移动,所以按单词移动是wb,还有usual movement keys also work


d
dcharles

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

我建议阅读From Bash to Z-Shell。如果你想提高你的 bash/zsh 能力!


是的,这行得通。但问题是当我想输入 Option-7、Option-8 和 Option-9 上的大括号 ([]{}|) 时。选项现在是元,所以它以 Meta-7、Meta-8 结尾......有什么想法吗?
C
Chris Page

从 Mac OS X Lion 10.7 开始,终端默认将 Option-Left/Right Arrow 映射到 Esc-b/f,因此现在它已内置于 bash 和其他使用这些与 emacs 兼容的键绑定的程序中。


d
dcharles

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


q
qix

iterm2Preferences >简介 > Keys,您点击Key Mappings下方的+并记录一个新的快捷方式。对于 Action,选择 Send Escape Sequence 并分别输入 bf 用于向后和向前。

当我尝试为 (Ctrl+←) 录制一个时,我注意到在键盘快捷键字段中箭头从未出现过。事实证明,我必须首先禁用默认 mac 的系统偏好设置 > 键盘 > 快捷方式 > 任务控制快捷方式才能让事情正常工作,因为它们会覆盖 iterm2 的默认快捷方式。标准终端应用程序也应该如此。

https://i.stack.imgur.com/mitIx.png


u
ubershmekel

出于某种原因,我的终端的选项+箭头不起作用。为了在 macOS 10.15.6 上解决这个问题,我打开了终端应用程序的首选项,并且必须设置绑定。

Option-left = \033b
Option-right = \033e

https://i.stack.imgur.com/fFjC8.png

出于某种原因,我的 option-right 被设置为 \033f。现在它已经修复了,我可以再次自由地跳过 termianl 中的单词。


H
Hang

iTerm2 Build 3.3.4 用户的新答案:

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

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

不要乱用 shell 配置文件,不要乱用劣质 masOS(默认)终端,不要尴尬 Esc+F/B,冲洗并重复废话。

木已成舟!!!

享受这个技巧,我的程序员伙伴们!


C
Chinmay Chhajed

如前所述,您可以在 ~/.bashrc 中添加 set -o vi 以使用 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 或启动新的终端会话。


c
conny

只需检查终端 > 首选项 > 设置 > [配置文件] > 键盘中的“使用选项作为元键”选项,正如@cris-page 已经提到的那样。

但是请注意,在 macOS Catalina (10.15) 和更高版本中,zsh 成为新添加用户的默认 shell:其默认配置仅将空格视为单词边界,而旧的 bash 使元左/右跳转到最近的 非字母数字 字符(类似于 B/W 而不是 b/w 对于熟悉 的人vim):

                  v----v- bash jumps here
$ vim some-folder/what.txt_<- jump left twice from here
  ^---^- zsh jumps here by default

(类似的动作也适用于元退格)

有不止一种方法可以使 zsh 命令行编辑器导航类似于 bash 的工作 - 这是一种这样的方法:

# Place in your profile init script, e.g. `~/.zshrc`
autoload -U select-word-style
select-word-style bash


IMO 没有人“需要” iTerm,对于大多数用户来说,它只会增加一层额外的配置混乱。 😜