vi内的Bash命令


33

是否可以在vi中键入bash命令并获取标准输出?

我发现关闭并重新打开vi通常很乏味,因为我想在shell中查找内容。

Answers:


45

是的,例如,如果您想这样做ls,请尝试:

:!ls

要生成外壳,请使用

:shell


太棒了,没有这个我怎么能活下去?
竖琴

3
实际上,我经常做的事情是在编辑内容时忘记以root用户身份运行vi。该命令使我免于冗长的重写的时间超过了我所记得的时间。 :w !sudo tee %
Mark D

1
我希望在gnu中有一些方法可以做到这一点nano
ixtmixilix 2012年

1
然后使用:shell后如何返回编辑器?
Vato

@VaTo:要返回,您可以键入:退出
Raman Kathpalia

12

我倾向于使用ctrl+zvi睡眠,在shell中运行所需的东西,然后fg恢复vi。不完全是您问题的答案,但是我发现这是一种非常快速的工作方式。

如果您确实忘记了在后台打开vi(这可能在您很忙时发生),那么当您尝试使用登出Shell时,系统ctrl+d会警告您您正在运行后台作业,您可以关闭它们,或再次按ctrl + d退出。另外,如果您尝试重新打开同一文件两次,则会收到恢复警告,因此您可以按a放弃,然后运行fg返回到vi。


1
如果您陷入命令行中的工作中,而忘记了vim的背景知识,这可能会变得很棘手。
艾略特·鲍尔

1
是的,有可能,我自己做了。对我来说,保持外壳恒定是值得的。我会更新我的答案把你的意见考虑在内
Rqomey

1
我认为您最好使用GNU屏幕。
user606723 2012年

1
我自己使用tmux ...但是为了提高速度,如果登录到没有tmux或屏幕的服务器,则非常方便
Rqomey 2012年

11

由于您提到了“获取标准输出”,因此请注意,您可以执行

:r! command

命令的输出将添加到文件中,或者

:<range>!command

通过命令[例如:1,$!wc] 过滤范围的内容


:%!command看起来非常有用
Eliot Ball

我经常用它来对行进行排序[例如:.,+20 !sort]
Walter A

5

我首选的成语是

!!command

这是简写

:.!command

它通过命令通过管道传递当前行,并将输出插入文件中。对我而言,最常见的情况是使用vi编辑命令并运行:

!!sh

要么

!<motion>command

例如(例如)

!apsh

通过shell运行当前段落的整个部分。


2
请注意,因为!}您必须放在段落的开头,请尝试!ap。(我不知道这是在每个vi还是仅在vim中)
Random832

4

通过使用冒号和感叹号,您可以在shell路径和shell脚本中运行任何命令,请记住该命令在运行vi / vim程序的用户及其环境下运行。

:!<command>

由于vi使用的是运行时有效的环境,因此它使用与父命令相同的路径。请记住,某些外壳程序会在路径中保留程序的缓存,而vi可能无法使用此缓存(取决于它使用的外壳程序及其版本),因此如果您拥有更多的外壳程序,则可能会运行错误的二进制文件而不是一个同名二进制文件。


4

您可以通过:!ls -lh在命令模式下键入命令来查看命令的输出。

如果要将命令的输出插入正在编辑的文件中,只需添加即可r。例如,:r!which perl


1

使用!显然是正确的答案,但是如果您经常来回切换,那么诸如screen或tmux之类的内容也可能会有所帮助。


0

我的.vimrc中有这个。前一段时间在Stack Overflow上发现:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

通过打开两个终端命令行窗口,在一个窗口中同时运行vi以及另一个可同时用于其他工作的窗口,我将并且愿意在Linux中轻松解决此问题。

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.