在VIM中重用ex命令中的先前范围

lat*_*lip 9 vim

是否可以在VIM中重用ex命令的范围?

例如,我可以使用以下命令将当前文件中的第4行(第10行)写入(复制)到新文件:

:4,10w foo/bar.txt
Run Code Online (Sandbox Code Playgroud)

但我真正想做的是将线移到一个新文件.我可以这样做:

:4,10w foo/bar.txt
:4,10d
Run Code Online (Sandbox Code Playgroud)

但是两次输入4,10都有点烦人.

所以我有两个问题:

  1. 通常,有没有办法在ex命令中引用先前使用的范围?
  2. 具体来说,如果没有办法(1),是否有更简单的方法将一行文件中的一些行剪切并粘贴到一个新文件中.

小智 5

我通常用猫来做这件事:

:4,10!cat > foo/bar.txt
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为你通过cat管道线并用结果输出替换它们,这没什么.当然,您可以通过>>而不是>追加到现有文件的末尾.


ste*_*eha 2

一般来说,我所做的就是从一个文件中删除行,切换到另一个文件,然后粘贴。

另外,我通常使用标记。我没有输入实际数字,而是点击mb以标记起始行,然后转到结束行并点击d'b以删除回到标记为 的行b。但是您可以使用mb来标记开始行,并me标记结束行,然后运行 ​​ex 命令:

:'b,'e w somefile.txt<Enter>
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用从a到 的任何字母z作为分数;我通常使用bande但你可以使用你喜欢的。

我将如何移动线条:

m'b
<navigate to end line>
d'b
:n somefile.txt<Enter>
p
Ctrl+^
Run Code Online (Sandbox Code Playgroud)

Ctrl+^ 从当前打开的文件切换到上一个打开的文件。(如果您愿意,您也可以只打开一个窗格并切换窗格。窗格在普通 vi 中不起作用,但在 vim 中起作用。)

以上假设您已设置该autowrite选项。使用 时autowrite:n命令和 Ctrl+^ 都只是写入当前文件,然后切换文件,而不是抱怨文件已更改而没有保存。您也可以执行上述操作,并在使用 或 Ctrl+^ 之前显式写入文件:n

顺便说一下,我经常使用 Ctrl+^,以至于我将其映射到K. 打字更容易,但我很久以前就养成了这个习惯,当时我有时不得不使用无法输入 Ctrl+^ 的哑终端。

顺便说一句,当您删除行时,它们会进入“未命名缓冲区”。在 vim 中,切换文件时会保留未命名的缓冲区。在原来的 vi 中,未命名的缓冲区被清除。所以上面的内容不适用于旧的 vi。您可以通过删除到命名缓冲区,然后从命名缓冲区粘贴来使其工作;适用于任何版本的 vi。

m'b
<navigate to end line>
"ad'b
:n somefile.txt<Enter>
"ap
Ctrl+^
Run Code Online (Sandbox Code Playgroud)

上面的内容删除到名为 的缓冲区中,然后从另一个文件中a粘贴。a这当然在 vim 中有效;只是你不需要它。