!!(的简写)根据POSIX &:.!将当前行作为命令的输入执行。如果它是系统命令,您可能需要附加。 exvish
!!在空行上执行(并省略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命令执行,几乎就像宏一样。您仍然可以编辑和undo 该行以使其正确,而不是尝试:在命令模式下编辑该行。
这里推荐的功能都是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。 undo 只是“历史上准确且合规” 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 filenamesudo vi -r filename
这里的区别在于,即使“ :preserved 文件”在内部有自己的“特殊”名称和路径,它也会在“ ed ==> :write时到达原始的预期位置,但请
务必使用,而不是像完成你的“恢复”,否则您仍然会丢失您尝试保存的编辑。:recover/etc/sudoers:wq!ZZ
顺便说一句,^R预计会根据 POSIX 重绘或重绘显示;vi在任何合规的实现中,它都不是“撤消” 。