在 UNIX 中使用 VI 键编辑 shell 命令

use*_*860 28 shell vim terminal vi

我曾经有一个同事,他非常擅长 UNIX。

他向我展示了如何使用 Vi 键绑定来编辑我的 shell 命令。

他将命令放在我每次登录时都会运行的文件中。

从那以后,我转移到了另一个项目。

不幸的是,我不记得如何设置它。

这里有没有人知道如何使用 Vi 键绑定在终端中编辑命令?

我怎样才能使该设置永久化?

jah*_*roy 32

你在谈论有史以来最伟大的功能!

您可以使用 vi 命令编辑 shell 命令(和命令历史记录),方法是将其添加到您的.bashrc文件中:

set -o vi

您还可以从命令行运行该命令以仅影响您的当前会话。

如果您不使用 bash,请将适当的 rc 文件替换为您的 shell。


这允许您使用 vi 命令来编辑任何命令...

您还可以使用jk在您的历史记录中移动(按 后ESC)。

您还可以使用/(点击 后ESC)来搜索旧命令。

换句话说,要找到cp您十分钟前执行的超长命令:

ESC/cpENTER

然后,您可以通过您的历史记录所有匹配的指令周期nN

所有这些使我在命令行上的工作效率提高了 10 万亿倍!

  • 好吧,它并不是真正使用 vi,而是使用 vi 风格的键盘命令进行行编辑。 (4认同)
  • 当然……我想合适的术语是`shell 中的vi 绑定` 是有史以来发明的最伟大的特性! (4认同)

Kei*_*son 12

如果您使用的是 bash,正如 jahroy 和 evil otto 已经回答的那样,您可以使用

set -o vi
Run Code Online (Sandbox Code Playgroud)

使 bash 使用 vi 风格的编辑命令。

完成此操作后,您可以键入Esc v以启动带有包含当前命令行副本的临时文件的 vi 编辑器。你可以编辑命令,甚至用多行替换它;当您保存文件 ( :wq) 时,shell 将执行编辑的命令。

若你宁可

set -o emacs
Run Code Online (Sandbox Code Playgroud)

你可以Ctl-XCtl-E用来做同样的事情。它将使用您首选的编辑器$EDITOR,不一定是 emacs。

(就我个人而言,我在大多数编辑中使用 vi(实际上是 vim),但我更喜欢set -o emacs在 shell 中;切换插入模式和切换插入模式对于编辑文件非常有用,但对于交互式命令来说很尴尬。YMMV。)


小智 10

您可以使用set -o vi@jahroy 发布的那样更改行编辑命令,但您可能正在考虑该fc命令(可在 bash 中使用,我认为是 ksh,但可能不是 tcsh),它将把上一个命令放入编辑器(FCEDIT 或 EDITOR) ,您可能已将其设置为 vi),然后在您退出编辑器时执行该命令。请参阅联机帮助页或help fc了解详细信息,或者只是尝试一下。

  • `alias r='fc -e -'` 是重新运行之前命令的重要别名。我相信,`fc` 本身起源于 Korn shell。您可以按编号指定命令(`fc 123 129` 可编辑历史记录中的命令编号 123 至 129)。您可以指定相对数字(`fc -10 -1` 来编辑输入的最后 10 个命令)。您可以使用 `fc -l` 列出以前的命令。您可以通过带有 `r` 别名的前缀指定命令(`r make` 运行最后一次调用 `make`;如果自上次运行 `make` 以来没有运行过 `mv` 命令,`rm` 也是如此, 等等。)。 (5认同)

小智 6

要在 vim 中编辑最近使用的命令并在编辑器保存和退出后调用已编辑的版本,请使用fc内置的 shell。没有任何参数,它将执行以下操作:

  1. 在其中创建一个临时文件/tmp并使用最近键入的命令填充它
  2. 编辑器正常退出(退出代码为 0)后,它会执行在该临时文件中找到的命令并删除该文件。编辑后的版本作为常用命令保存在历史记录中(至少在 zsh 中)。如果编辑器以零以外的代码退出,它不会执行任何操作(在 vim 中,这可以通过杀死它或使用 来实现:cquit)。

命令在 bash 和 zsh 中都有效。


chi*_*gsy 5

事实上,这实际上是有史以来最大的特点。还有更多:

创建一个名为

.editrc
Run Code Online (Sandbox Code Playgroud)

包含行

bind -v
Run Code Online (Sandbox Code Playgroud)

Editline是一个 BSD 许可版本库,提供类似 readline 的服务。该 .editrc 将在 MySQL 的命令行 shell 或任何不使用 readline 的应用程序中将您的键绑定设置为 vi 模式。

随着岁月的流逝,我变得有些健忘,所以我的 .zshrc为 vi 模式提供了一些包装器,以显示我在命令行中所处的模式。这真好。

我知道在 zsh 中你可以输入

bindkey -L
Run Code Online (Sandbox Code Playgroud)

并获取键绑定列表。我敢肯定 bash 必须有类似的东西。并非所有 vi 键都默认绑定。将它们绑定到您认为合适的方式,然后您就可以参加比赛了。