在 shell 中使用 vi 模式

介绍在命令行编辑中使用 vi 模式。

作为一名大型开源社区的参与者,更确切地说,作为 Fedora 项目的成员,我有机会与许多人会面并讨论各种有趣的技术主题。我最喜欢的主题是“命令行”或者说 shell,因为了解人们如何熟练使用 shell 可以让你深入地了解他们的想法,他们喜欢什么样的工作流程,以及某种程度上是什么激发了他们的灵感。许多开发和运维人员在互联网上公开分享他们的“ dot 文件”(他们的 shell 配置文件的常见俚语),这将是一个有趣的协作机会,让每个人都能从对命令行有丰富经验的人中学习提示和技巧并分享快捷方式以及有效率的技巧。

今天我在这里会为你介绍 shell 中的 vi 模式。

在计算和操作系统的庞大生态系统中有很多 shell。然而,在 Linux 世界中,bash 已经成为事实上的标准,并在在撰写本文时,它是所有主要 Linux 发行版上的默认 shell。因此,它就是我所说的 shell。需要注意的是,bash 在其他类 UNIX 操作系统上也是一个相当受欢迎的选项,所以它可能跟你用的差别不大(对于 Windows 用户,可以用 cygwin)。

在探索 shell 时,首先要做的是在其中输入命令并得到输出,如下所示:


  1. $ echo "Hello World!"
  2. Hello World!

这是常见的练习,可能每个人都做过。没接触过的人和新手可能没有意识到 bash shell 的默认输入模式是Emacs 模式,也就是说命令行中所用的行编辑功能都将使用 Emacs 风格的“键盘快捷键”。(行编辑功能实际上是由 GNU Readline 进行的。)

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


  1. $ echo "Hello Wrld!"
  2. ^
  3. Cursor is here.

这只是使用提供给 shell 用户的诸多 Emacs 快捷键组合之一完成的。还有其他更多东西,如复制文本、粘贴文本、删除文本以及使用快捷方式来编辑文本。使用复杂的快捷键组合并记住可能看起来很愚蠢,但是在使用较长的命令或从 shell 历史记录中调用一个命令并想再次编辑执行时,它们可能会非常强大。

尽管 Emacs 的键盘绑定都不错,如果你对 Emacs 编辑器熟悉或者发现它们很容易使用也不错,但是仍有一些人觉得 “vi 风格”的键盘绑定更舒服,因为他们经常使用 vi 编辑器(通常是 vim 或 nvim)。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 模式的更多信息,请参阅这里。):


  1. $ echo "Hello Wrld!"
  2. ^
  3. Cursor is here.

现在,对于 vi/vim/nvim 用户来说,你会惊喜地发现你可以一直使用相同的快捷键,而不仅仅是在编辑器中编写代码或文档的时候。如果你从未了解过这些,并且想要了解更多,那么我可能会建议你看看这个交互式 vim 教程,看看 vi 风格的编辑是否有你所不知道的。

如果你喜欢在此风格下与 shell 交互,那么你可以在主目录中的 ~/.bashrc 文件底部添加下面的行来持久设置它。


  1. set -o vi

对于 emacs 模式的用户,希望这可以让你快速并愉快地看到 shell 的“另一面”。在结束之前,我认为每个人都应该使用任意一个让他们更有效率的编辑器和 shell 行编辑模式,如果你使用 vi 模式并且这篇文章给你展开了新的一页,那么恭喜你!现在就变得更有效率吧。

原文发布时间为:2017-04-04

本文来自合作伙伴“Linux中国”

时间: 2024-10-01 20:33:40

在 shell 中使用 vi 模式的相关文章

在shell中使用vi模式

介绍在命令行编辑中使用 vi 模式. 作为一名大型开源社区的参与者,更确切地说,作为 Fedora 项目的成员,我有机会与许多人会面并讨论各种有趣的技术主题.我最喜欢的主题是"命令行"或者说 shell,因为了解人们如何熟练使用 shell 可以让你深入地了解他们的想法,他们喜欢什么样的工作流程,以及某种程度上是什么激发了他们的灵感.许多开发和运维人员在互联网上公开分享他们的" dot 文件"(他们的 shell 配置文件的常见俚语),这将是一个有趣的协作机会,让每

Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)_linux shell

在Linux Shell中有很多的特殊符号,这对于我们写Shell脚本时要特别留意:一方面要知道这些特殊符号的用法,这些符号用好了可以达到事半功倍的效果:但另一方面要避免这些特殊符号的过度使用而导致脚本难以调试.难以阅读. 这些特殊符号罗列出来大致如下: 复制代码 代码如下: # ; ;; . , / / 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `command`{} [] [[]] () (()) || &&am

一些Linux Shell中的权限相关知识总结

  这篇文章主要介绍了一些Linux Shell中的权限相关知识总结,使Linux入门学习中的基础知识,需要的朋友可以参考下 一个文件一经创建,就具有三种访问方式: 1) 读,可以显示该文件的内容. 2) 写,可以编辑或删除它. 3) 执行,如果该文件是一个s h e l l脚本或程序. 按照所针对的用户,文件的权限可分为三类: 1) 文件属主,创建该文件的用户. 2) 同组用户,拥有该文件的用户组中的任何用户. 3) 其他用户,即不属于拥有该文件的用户组的某一用户 文件的全部信息包括以下: 文

我的程序哪里错了?-shell中程序调试问题 不知道哪错了 求解答

问题描述 shell中程序调试问题 不知道哪错了 求解答 #!/bin/bashfunction a {read -p ""input: "" valueecho -n ""doubling the value ""return $[ $value * 2 ]} aecho ""the new value is $?"" 我想让输入的数的两倍大于255时,程序输出的值为1如果我输入的数的

Linux集群和自动化维2.3 Shell中的控制流结构

2.3 Shell中的控制流结构 Shell中的控制流结构也比较清晰,如下所示: if ...then... else...fi语句 case语句 for循环 until循环 while循环 break控制 continue控制 工作中用得最多的就是if语句.for循环.while循环及case语句,大家可以以这几个为重点对象来学习. if语句语法如下: if 条件1 then   命令1 else   命令2 fi if语句的进阶用法: if 条件1 then     命令1       el

linux中shell中的变量使用说明

变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 - $n"的形式输出所有参数. $@ 所有参数列表.如"$@"用「"」括起来的情况.以"$1" "$2" - "

shell中的各种括号的使用方法_linux shell

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 现在分述如下: 1.Shell中变量的原形:${var}大家常见的变量形式都是$var

CentOS 5.x中部署LVS-DR模式的步骤

LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统. 在下面的案例中,我们用了3台主机,IP地址分别为: 192.168.1.100 192.168.1.101 192.168.1.102 其中,192.168.1.100将安装LVS做为负载均衡器来分发请求,另外2台做为真实提供服务的主机,以DR模式进行部署. 首先,我们应先在192.168.1.101和192.168.1.102上部署好Apache或是Nginx,还有PHP,这里就不详细

Linux shell中的那些小把戏

我日常使用Linux shell(Bash),但是我经常忘记一些有用的命令或者shell技巧.是的,我能记住一些命令,但是肯定不会只在特定的任务上使用一次,所以我就开始在我的Dropbox账号里用文本文件写下这些Linux shell的小技巧,现在我决定共享它给你.这个表我以后还会更新.记住,这里的一些贴士需要在你的Linux发行版上安装额外的软件. 在bash中检查远程端口是否打开: echo >/dev/tcp/8.8.8.8/53 && echo "open"