在 vim 中拉动/移动选定的文本

Abe*_*bie 4 vim neovim

<template>
   <h1>Hello</h1>
</template>
Run Code Online (Sandbox Code Playgroud)

如果我使用搜索这个

/<template>\_.*template>
Run Code Online (Sandbox Code Playgroud)

如何拉动/剪切所选内容以将其放在文件中的其他位置?

有更好的方法来做这件事吗?

rom*_*inl 6

问题是,搜索后,您得到的是匹配项,而不是选择项。如果您想对该匹配执行某些操作,则必须将该匹配转换为“动作”、“选择”或“范围”。多才多艺:help gn可以帮助解决这三个问题。

\n

与运动匹配

\n

搜索完成后,您可以执行以下操作:

\n
dgn\n
Run Code Online (Sandbox Code Playgroud)\n

剪切匹配的文本,然后将光标移至其他位置并按pP将其放置在那里。问题在于寄存器是按字符排列的,因此您的代码片段可能会插入到行的中间,这不好。您还可以执行以下操作:

\n
:/foo/put=@"\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
:6put=@"\n
Run Code Online (Sandbox Code Playgroud)\n

这将以逐行方式放置文本,因为 Ex 命令如下:put都是逐行的。

\n

参见:help gn:help :range、 和:help :put

\n

匹配选择

\n

或者,您可以在视觉线模式下选择匹配的文本:

\n
Vgn\n
Run Code Online (Sandbox Code Playgroud)\n

并用 切割它d。由于这是在可视行模式下完成的,因此寄存器是逐行的,因此您可以将代码片段放在p/P放在任何地方,而不会产生太大的风险。

\n

通过上述方法,您可以边做边决定要做什么,一个接一个的原子操作。去那里。拿着它。去那里。去做。

\n

不同的方法

\n

这绝对没问题,但多年来,我开始欣赏 Ex 命令在此类场景中的更高水平的表达能力。

\n

这是我的做法(“在最后一行后移动文本”,此处):

\n
:/<template/,/<\\/template>/m$\n
Run Code Online (Sandbox Code Playgroud)\n

:help :move

\n

匹配范围

\n

这是另一种方法,它混合了上面的所有方法/方法再加上一种:

\n
/<template>\\_.*template><CR> \nvgn\n:'<,'>m$\n
Run Code Online (Sandbox Code Playgroud)\n

其中\xe2\x80\xa6

\n
    \n
  • 你匹配
  • \n
  • 您可以通过将其视为运动来将其转变为选择
  • \n
  • 最后你用它作为范围
  • \n
\n

一切

\n

FWIW,这里以简洁的方式显示了上述所有方法:

\n
/<template>\\_.*template><CR>\ndgn\n<motion>\np\n
Run Code Online (Sandbox Code Playgroud)\n
\n
/<template>\\_.*template><CR>\ndgn\n<motion>\n:<address>put=@"\n
Run Code Online (Sandbox Code Playgroud)\n
\n
/<template>\\_.*template><CR>\nVgn\nd\n<motion>\np\n
Run Code Online (Sandbox Code Playgroud)\n
\n
:/<template/,/<\\/template>/m$\n
Run Code Online (Sandbox Code Playgroud)\n
\n
/<template>\\_.*template><CR> \nvgn\n:'<,'>m$\n
Run Code Online (Sandbox Code Playgroud)\n