在你的 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 历史记录中调用命令但又想在再次执行命令之前编辑一些内容时,它们可能非常强大。

如果您熟悉 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 是 Red Hat Ansible 工程团队的成员,专注于 Ansible Core 运行时、Linux 系统管理自动化、容器编排集成和信息安全自动化。Adam 已获得 Sam Houston State University 的计算机科学理学学士学位和信息保证与安全理学硕士学位。

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 风格的映射和编辑模式,这使得使用这些工具同样令人愉快。

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

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.