!!
(的简写)根据POSIX &:.!
将当前行作为命令的输入执行。如果它是系统命令,您可能需要附加。 ex
vi
sh
!!
在空行上执行(并省略sh
)是将 shell 命令直接读入缓冲区的快捷方式。它的本质是:.!
覆盖当前行,同时:.r!
在下面的行上插入。
ls -A | head -n +4
~
~
!sh
结果:
.sh_history
.sh_logout
.kshrc
corelist.txt
~
~
4 lines added; 1 line deleted`
这意味着无需将管道重定向到文件,然后检查数据以查看内容是否有效。vi
直接执行命令,u
如果出错则ndo。
或者,将行作为命名缓冲区拉出允许您将其作为ex
命令执行,几乎就像宏一样。您仍然可以编辑和u
ndo 该行以使其正确,而不是尝试:
在命令模式下编辑该行。
这里推荐的功能都是POSIX并且已经支持了 40 多年,所以不需要特殊的vim或其他增强功能。
:%s/meep/pEEp/ | g/foo/ s//BAR
foo
grok
meep
~
~
将ex
命令(第 1 行,:%s...
)拉到命名缓冲区/宏中。
我只是使用“宏”的标签m
。
"myy
或者
:1y m
现在在命令模式下执行命名的缓冲区/宏,使用@
:
@m
结果:
:%s/pEEp/pEEp/ | g/BAR / s//BAR
BAR
grok
pEEp
~
~
4 lines changed
但请记住,“多次撤消”不是POSIX。 u
ndo 只是“历史上准确且合规” ex
/vi
实现中的撤消和重做之间的切换。
解决方法是在执行有问题的编辑之前保存到临时(或有效)文件名:
:w $$.tmp
然后只是:e!
在需要时“重置并重新加载”。
您还可以在进行多项更改之前使用:pre
(保留)制作特殊的临时备份文件。然后使用:reco! %
(恢复这个!)恢复到那个点。意识到:preserve
创建一个类似快照的文件,一旦它回滚就被删除。是否保存编辑并不重要。因此,编写您自己的文件 ( :w ...
) 并使用恢复:e!
可能仍然有价值,因为系统不会自动删除它。
:pre
当您应该运行sudo vi ...
或没有必要的权限时是完美的 - 但您只是在进行了几次更改后才意识到错误。即 vi /etc/sudoers
代替sudo vi /etc/sudoers
.
^^永远不要这样做!只是一个例子!改用sudo visudo
!
您可以获取现有恢复文件的列表,并根据需要vi -r
直接使用恢复文件,也可以选择使用.vi -r filename
sudo vi -r filename
这里的区别在于,即使“ :preserve
d 文件”在内部有自己的“特殊”名称和路径,它也会在“ ed ==> :write
时到达原始的预期位置,但请
务必使用,而不是像完成你的“恢复”,否则您仍然会丢失您尝试保存的编辑。:recover
/etc/sudoers
:wq!
ZZ
顺便说一句,^R
预计会根据 POSIX 重绘或重绘显示;vi
在任何合规的实现中,它都不是“撤消” 。