在 Shell 中使用 Vi 模式

了解如何在命令行中使用 vi 模式进行行编辑的介绍。
432 位读者喜欢这篇文章。
An introduction to GNU Screen

Opensource.com

作为更广泛的开源社区的参与者,更具体地说是 Fedora 项目 的成员,我有机会与许多人会面并讨论各种有趣的技术话题。我最喜欢的话题之一是“命令行”,或 Shell,因为了解人们如何熟练地使用 Shell 可以让你深入了解他们的思维方式、他们偏爱的工作流程,以及在某种程度上是什么让他们充满活力。许多开发人员和系统运维人员在互联网上公开分享他们的“点文件”(他们 Shell 配置文件的一种常用俚语),这带来了有趣的协作机会,让每个人都可以从经验丰富的命令行老手那里学习技巧和窍门,并分享常用的快捷方式和生产力提升工具。

我将在这里向您介绍一个技巧,展示 Shell 的 vi 模式。

在庞大的计算和操作系统生态系统中,有 许多 Shell。然而,在 Linux 世界中,事实上的标准已成为 bash,并且在撰写本文时,它是所有主要 Linux 发行版上安装的默认 Shell。因此,那是我今天要谈论的 Shell。但需要注意的是,bash 在其他 UNIX 风格的操作系统上也是一个相当流行的选择,因此它很可能离您不远(对于 Windows 用户来说,始终有 cygwin)。

在探索 Shell 时,您首先要做的是在其中键入命令,并且通常会获得输出,如下所示

$ echo "Hello World!"
Hello World!

这是常见的做法,可能是每个阅读本文的人都做过的事情。新手和初学者可能没有意识到的是,bash Shell 的默认输入模式是 Emacs,这意味着您将在命令中执行的所有行编辑功能都将使用 “Emacs 风格”的键盘组合。(对于那些对细节感兴趣的人来说,行编辑的功能实际上是由 GNU Readline 执行的。)

例如,如果您键入了 echo "Hello Wrld!" 并且意识到您想快速跳回一个单词(空格分隔)来修复该错别字,而无需按住向左箭头键,那么您将同时按下 Alt+b 键,光标将向后跳到 W

$ echo "Hello Wrld!"
              ^
        Cursor is here.

这仅使用了 Shell 用户可用的众多 Emacs 键盘组合之一。还有许多其他组合可用于各种操作,例如复制文本、粘贴文本、删除文本以及使用快捷方式编辑文本。使用复杂的键盘组合并将其记在脑海中可能看起来很傻,但是当处理较长的命令或从 Shell 历史记录中 recalling 命令但又想在再次执行命令之前编辑一些内容时,它们可能非常强大。

如果您熟悉 Emacs 文本编辑器,或者发现 Emacs 键绑定使用起来很方便,那么 Emacs 键绑定就非常棒了,但有些人更习惯使用“vi 风格”的键盘绑定,因为他们在 vi 文本编辑器中花费了大量时间(通常通过 vimnvim)。bash Shell(同样通过 GNU Readline)能够为我们提供此功能。为了启用它,您运行命令 $ set -o vi

就像魔术一样,您现在处于 vi 模式,可以轻松地使用 vi 风格的按键绑定进行行编辑,以便复制文本、删除文本以及在文本行中的不同位置之间跳转。这在功能方面与 Emacs 模式没有太大区别,但与 Shell 交互以执行这些操作的方式发生了变化,这根据您的具体偏好是一个强大的选择。

让我们看一下与之前相同的示例,但在您进入 Shell 的 vi 模式后,您处于 INSERT 模式的上下文中,这意味着您可以像以前一样键入命令,但您现在可以点击键盘上的 Esc 键,您将进入 NORMAL 模式,您可以在其中自由导航并进行文本修改。

查看与之前相同的示例,如果您键入了 echo "Hello Wrld!" 并且意识到您想跳回一个单词(同样,空格分隔)来修复该错别字,那么您将点击 Esc 以从 INSERT 模式更改为 NORMAL 模式。然后您可以键入 B(对于在家跟随的读者,Shift+b),这将使光标向后移动,就像之前一样。(有关 vi 模式的更多信息,请访问 此处。)

$ echo "Hello Wrld!"
              ^
        Cursor is here.

现在,对于 vi/vim/nvim 用户来说,当您意识到始终将您尝试和真实的键盘快捷键放在手边,而不仅仅是在编辑器中编写代码或文档时,这希望是一个有趣的“啊哈!”时刻。如果这对您来说都是新鲜事物,并且您想了解更多信息,那么我建议您访问这个 交互式 vim 教程,看看您是否觉得 vi 风格的文本编辑对您有用。

如果您喜欢在这种模式下与 Shell 交互,您可以通过编辑主目录中的 ~/.bashrc 文件并在底部添加以下行来持久设置它。

set -o vi

对于 emacs 模式用户,希望这是一个快速而有趣的“另一面”的 Shell 的了解。归根结底,我认为每个人都应该使用任何使他们最具生产力的编辑器和 Shell 行编辑模式,如果那是 vi 模式,并且这篇文章对您来说是新闻,那么恭喜您!现在去努力工作,提高生产力吧。

祝您编码愉快...

标签
User profile image.
Adam Miller 是红帽公司 Ansible 工程团队的成员,专注于 Ansible Core 运行时、Linux 系统管理自动化、容器编排集成和信息安全自动化。Adam 拥有萨姆休斯顿州立大学计算机科学理学学士学位和信息保障与安全理学硕士学位。

10 条评论

我已经这样做了很多年了。因为 vi 是我选择的编辑器,所以我发现以 vi 模式导航命令行更加自然。

感谢这篇精彩的文章。

我也是,我本人也是 vi 模式的忠实粉丝,并希望以(希望)有趣和友好的方式与他人分享。感谢您的赞美!

回复 ,作者是 dboth

很酷的东西,感谢分享!

“然而,在 Linux 世界中,事实上的标准已成为 bash,并且在撰写本文时,它是所有主要 Linux 发行版上安装的默认 Shell。”

...据我所知,Ubuntu 一段时间以来一直使用 dash 作为其默认 Shell。

Ubuntu 的默认交互式 Shell 仍然是 bash,dash 用于执行任何带有 #!/bin/sh 的内容,这为 POSIX sh 用例(例如 SysV init 和 Upstart 守护程序脚本)提供了更快的 Shell。

回复 ,作者是 Jerome Covington (未验证)

我更喜欢反过来。启动 vim,编写命令,然后通过以下方式传递给 Shell
:! bash
尽管如此,这对 vim 粉丝来说很棒!

我碰巧是 Emacs 迷而不是 Vi 迷,但我了解这两种编辑器,并且可以随时使用其中任何一种。

我会将 Vi 或 Vim 用于某些任务,有时也会使用 see、awk、Perl 甚至 Ed,有时只是为了保持练习,但有时也是为了使用合适的工具来完成我正在执行的任务。

很高兴拥有所有这些出色的工具!

另一个有用的技巧是将“set editing-mode vi”放入 .inputrc 中。这将允许一些带有自己命令提示符的程序也像 vi 一样工作。我想到的是 mysql 提示符,但也还有其他提示符。

作为我自己顽固的 vi 用户,我不得不承认,几乎每次登录到类似 Bash 的 Shell 后,我发出的第一个命令都是“set -o vi”,以便在命令行上获得最低限度的生产力,因为我是一个糟糕的键盘打字员(即实际上最多只使用我 10 根手指中的 6 根)。
如果没有 Shell 的历史记录和 vi 编辑模式,我就会像被囚禁在 csh 中一样,茫然不知所措。
但是,除了仅仅依赖“set -o vi”之外,对于像我这样的笨拙的人来说,还有另一种解脱。
您可以通过编辑 HOME 中的 .inputrc 文件(或 INPUTRC 环境变量将引用的任何其他文件)并放入以下两个节来求助于 readline

set editing-mode vi
set keymap vi

作为 root 用户,您甚至可以在 /etc/inputrc 中全局设置此设置(前提是您没有持异议的用户)。

使用这些 readline 设置的另一个好处是,任何 readline-gnostic 程序或 CLI 工具都会自动为您提供 vi 风格的映射和编辑模式,这使得使用这些工具同样令人愉快。

感谢您在文章中提供的信息。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.