在UNIX中使用VI键编辑Shell命令


28

我曾经有一个非常擅长UNIX的同事。

他向我展示了如何使用Vi键绑定编辑我的shell命令。

他将命令放在我每次登录时都会运行的文件中。

从那时起,我搬到了另一个项目。

不幸的是,我不记得该如何设置。

这里有人知道如何使用Vi键绑定在终端中编辑命令吗?

如何使该设置永久化?

Answers:


31

您正在谈论有史以来最伟大的功能!

通过将vi命令添加到.bashrc文件中,可以使用vi命令来编辑Shell命令(和命令历史记录):

set -o vi

您也可以从命令行运行该命令,以仅影响当前会话。

如果您不使用bash,请为您的shell替换适当的rc文件。


这使您可以使用vi命令来编辑任何命令...

您还可以使用jk浏览历史记录(按ESC)。

您还可以使用/(单击以后ESC)搜索旧命令。

换句话说,要找到cp您十分钟前所做的超长命令:

ESC/cpENTER

然后,您可以通过您的历史记录所有匹配的指令周期nN

所有这些使我在命令行上的生产力提高了10万亿倍!


4
好吧,它并不是真正使用vi,而是使用vi样式的键盘命令进行行编辑。

4
当然,我想合适的术语是vi bindings in the shell有史以来最伟大的功能!
jahroy 2012年

如果有一种显示模式的方法,我会从emacs绑定切换到vi绑定。您知道这样做的方法吗?
iconoclast

他们,有没有结合的方式jjESC我们平时在vim吗?
steveyang

@yangchenyun-也许这个问题可以帮助您:stackoverflow.com/questions/844862 / ... 我个人没有绑定/更改任何命令,所以我不确定您要问什么。
jahroy 2012年

12

如果您使用的是bash,如jahroy和evil otto已回答,则可以使用

set -o vi

使bash使用vi风格的编辑命令。

完成此操作后,您可以键入Esc v以使用包含当前命令行副本的临时文件启动vi编辑器。您可以编辑命令,甚至可以用多行替换。当您保存文件(:wq)时,shell将执行已编辑的命令。

若你宁可

set -o emacs

您可以Ctl-XCtl-E用来做同样的事情。它将使用您首选的编辑器$EDITOR,而不必使用emacs。

(就我个人而言,大部分编辑工作都使用vi(实际上是vim),但我更喜欢set -o emacs在shell中使用;切换插入模式和退出插入模式对于编辑文件非常有用,但对于交互式命令则比较尴尬。)


您知道避免使用vi风格返回正常编辑模式的方法吗?我记得成功继承了Bl Num,但现在没有了。我想念什么?
piertoni

@piertoni:set -o emacs不做你想要的吗?
基思·汤普森

是的,它确实有效,我错过了要点,谢谢
piertoni

10

您可以使用set -o vi@jahroy发布的方式来更改行编辑命令,但是您可能正在考虑该fc命令(在bash中可用,我认为是ksh,但可能不是tcsh),它将先前的命令放入编辑器中(FCEDIT或E​​DITOR) ,您可能已将其设置为vi),然后在退出编辑器时执行命令。请参见手册或help fc以获得详细信息,或者尝试一下。


5
alias r='fc -e -'是重新运行先前命令的宝贵别名。 fc我相信,它本身起源于Korn Shell。您可以按编号指定命令(fc 123 129以编辑历史记录中的命令编号123至129)。您可以指定相对编号(fc -10 -1以编辑最后输入的10个命令)。您可以使用列出以前的命令fc -l。您可以使用r别名加上前缀来指定命令(r make运行最后一次调用maker m如果mv自上次运行以来没有运行过命令make,则也是如此)。
乔纳森·勒夫勒

6

要在vim中编辑最近使用的命令并在保存并退出编辑器后调用已编辑的版本,请使用fc内置的shell。没有任何参数,它将执行以下操作:

  1. 在其中创建一个临时文件,/tmp并使用最新输入的命令填充该文件
  2. 编辑器正常退出(退出代码为0)后,它将执行在该临时文件中找到的命令,并删除该文件。编辑后的版本作为常规命令保存在历史记录中(至少在zsh中)。如果编辑器退出时返回的代码不是零,它什么也不执行(在vim中,可以通过杀死它或使用来实现:cquit)。

命令在bash和zsh中均有效。


5

确实,这实际上是有史以来最伟大的功能。还有更多:

创建一个名为

.editrc

包含线

bind -v

Editline是BSD许可的版本库,提供类似于readline的服务。该.editrc将在MySQL的命令行外壳程序或任何不使用readline的应用程序中将键绑定设置为vi模式。

随着时间的流逝,我变得有些健忘,所以我的.zshrc 为vi模式提供了一些包装,以向我展示我在命令行中处于哪种模式。这真好。

我知道你可以在zsh中键入

bindkey -L

并获取绑定列表。我确定bash一定有类似的东西。默认情况下,并非所有的vi键都是绑定的。将它们绑定到您认为合适的位置,即可开始比赛。


希望我可以在MySQL中为vi绑定投票5次!
jahroy 2012年

1

在您的终端中,键入 export EDITOR=vi

保存此设置。将此行放在文件〜/ .profile中


5
这会将您的默认编辑器(对于注意的命令$EDITOR)设置为vi。它不允许您使用vi(至少不能直接)编辑shell命令。
基思·汤普森

2
如果$EDITOR包含,则@KeithThompson Zsh默认为vi编辑模式vi。我认为这是唯一可以做到这一点的外壳。
吉尔(Gilles)'所以
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.