使用set -o vi的优点


55

我已经看到许多开发人员使用此命令将选项设置为vi。我从来不了解这个的真正用途?

使用bash命令时,切换到vi有什么帮助?

Answers:


58

通过将readline编辑设置为emacs(默认值)或vi(set -o vi),实际上是在Shell和选择的编辑器1上标准化了编辑命令。

因此,如果要在外壳中编辑命令,则使用与在文本编辑器中相同的命令2。这意味着仅需记住一种命令语法,并且(如果这样做还不够用)将可能使您在两种环境中的编辑速度更快且出错率更低。

您可以通过从外壳程序历史记录中拉出任何命令,点击Escape进入命令模式,然后点击v,在vi模式下进一步利用这种关系,这将打开您的$ EDITOR,并加载了该命令,以利用vim的全部功能进行更复杂的编辑。完成满意的命令编辑后,该命令将:wq在您的Shell中执行。


1.当然,假设您使用Emacs或Vi / m作为编辑器。
2.或者,更准确地说,是其子集...


1
我得到了圣杯:)....
Sathyam

3
Esc-v技巧是set -o vi大多数人不知道的最佳功能之一。如果要使用不同的参数多次发出同一命令(如多个命令行命令),则尤其如此。
Michael Goldshteyn '18年

2
Esc-v技巧并不是特定于的优势set -o vi。在默认设置下set -o EMACS,Cx,Ce将打开一个emacs窗口(或$EDITOR,如果已设置),您可以在其中运行命令之前对其进行编辑。
约翰·高尔斯

8

如果您使用的是移动SSH客户端(如适用于Android的ConnectBot),Vi模式将极大地提高可用性。

这是由于减少了对修饰键的依赖。

使用Vim在智能手机或平板电脑上使用虚拟键盘比使用其他任何方式都容易得多,包括内置于Android UI中的本机编辑方法。具有讽刺意味的是,用Vim在SSH会话中编辑C源代码要比使用该平台自己的编辑小部件编辑即时消息要容易得多。

Shell vi模式带来了类似的好处。


我一直希望手机键盘上有vi模式。您提到的情况就好像它已经存在一样。如何在手机上获得vi模式?
MEH

6

它使您可以使用vi模式和操作在命令行中编辑内容。

一个例子将使它更加清晰:

您输入 cp tmp/some_other_long_directory/file1.xt /tmp2/some_other_xtra_long_dir/

但出现错误-您应该输入file1.txtnotfile1.xt

如果未设置此选项,则按向上箭头,然后按向左箭头,并使其重复... 35次,直到到达.xt,然后键入多余的t。击键总数:37

有了这个选项设置你可以(例如)按向上箭头一次,然后逃命命令模式,0去行的开始,然后/xt[return]才能到xt,然后你可以输入i为插入模式并键入缺少吨。在某些方面,这似乎非常复杂,但是如果您是vim用户,那么这些命令已经众所周知。按键总数:9


1
您也可以在Emacs模式下使用Alt+Bs或a Ctrl+Alt+] .,因此在我看来这并不是一个很好的例子。
Mikel 2014年

2
眼看因为我们正在打高尔夫球:emacs模式:UpCtrl+Alt+].RighttEnter= 8 vi模式:UpF.atEnter= 7 :)
米克尔-

@Mikel您忘记了vi模式在插入模式下启动,因此您Esc也在那里,那真是太死了。
Dragon788

5

我不确定是否有直接优势。我已经vi有20多年的用户了。我也是screen使用vi密钥的其他程序的用户,甚至更长的时间。我自然喜欢在bash中设置“ vi”模式。但是我也要在数百台服务器上工作,大多数服务器都设置为默认的“ emacs”模式。所以我需要同时使用两种模式。但这实际上只是一个偏好问题。


对我来说类似的情况-我经常使用vim,但是我总是发现精通默认的像emacs一样的readline键(可以像vi子集一样方便)要比添加行切换花费的工作少我遇到的每个新系统上的vi模式。
2012年

1
我无法在数百台服务器上工作,但是在使用ing时,我确实使用sshrc来使bash设置在不同计算机之间保持相似ssh。当然,当我在本地使用没有任何.bashrc东西的机器时,这无济于事。
凯尔·斯特兰德

4

主要优点是命令行的模式编辑。如果您熟悉Vim并喜欢它的哲学,那么好处一定是显而易见的。如果您有经验,手指的肌肉记忆将使您以闪电般的速度编辑bash命令。

注意:如果您不喜欢模式编辑,您仍然应该学习利用(默认)emacs模式。这里有一些漂亮的键盘快捷键,可在任何进程上使用readline,例如bash


1

如果您习惯了vi,则可以将其设置为vi模式作为shell编辑器。那是显而易见的原因。另一个是bash在某些操作系统(默认为UNIX,如AIX,Solaris等UNIX)上默认情况下不可用的情况,因此外壳历史记录功能不可用,因此可以通过将外壳编辑器设置为vi,和EscCtrl+ 来获取过去的命令。KCtrl+L


1

它可以让您使用vim的快捷方式轻松地浏览和编辑命令行,例如,快速向右移动一个单词,删除一个单词。

通过默认的快捷方式,当您需要移至该行的末尾时,您需要Ctrl+ e,而使用set -o vi,您只需$像在vim中那样按即可。


1

大概是聚会晚了,但是对我来说,使用vi模式更多地是关于创建交互式笔迹..例如

for i in `ls | grep -v gz`
do
    echo $i
    gzip $i
done

一个非常简单的示例,说明可能非常复杂。使用ESCkv可以进入vi会话,您可以在该会话中修改脚本,然后:wq运行该脚本。


1
这可能是在vi模式下使用bash的一个很好的例子,但是它是bash代码的一个不好的例子。(1)将from的输出ls用作任何其他类型的处理的输入是一个坏主意。(2)$(…)广泛认为命令替换的`…`语法比该语法更具可读性。(3)除非有充分的理由不这样做,否则应始终引用Shell变量,并且确定自己知道自己在做什么。
G-Man
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.