在 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 拥有萨姆休斯顿州立大学计算机科学理学学士学位和信息保障与安全理学硕士学位。

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 不可知的程序或 CLI 工具都会自动为您提供 vi 风格的映射和编辑模式,这使得使用这些工具同样令人愉快。

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

© . All rights reserved.