在 vim 中,我经常发现自己在对某个部分进行更改之前重复相同的步骤来复制它:
V
逐行启动可视模式j
直到我选择了我想复制的部分y
拉出选择j
向下滚动到我刚刚选择的文本的最后一行p
复制当前行下方的被复制部分O
在复制的文本上方开始新的空白行ESC
退出插入模式
有没有更有效的方法来实现这一点(或其中的任何部分)?特别是,似乎应该有更好的方法将文本放在您刚刚选择的选择下方,而不是向下滚动以选择它,将其拉出,然后再次向下滚动到底部。
答案1
真正的瓶颈似乎在于jjjj…
你所做的一切。hjkl
相对于箭头键的所谓优势被如此频繁地提及,以至于人们往往会忘记 Vim 的动作和文本对象相对于两个都繁琐的方法。
假设您位于 Vim 定义的段落的第一行(空白行之间的文本),y'}P
应该拉出整个段落(包括后面的空白行)并将其粘贴到当前行上方。
some text above
[l]orem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit
some text below
y'}P
some text above
[l]orem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit
lorem ipsum dolor sit amet
ipsum lorem dolor sit amet
lorem dolor ipsum sit amet
lorem ipsum sit dolor amet
lorem ipsum dolor amet sit
some text below
v}yP
也应该以更舒适的方式工作。
如果你的区块不是“段落”,那么可能有一种方法可以用动作而不是 来定义选择jjj
。例如V/it$<cr>
。
编辑
这是另一个变体,它将副本以下原本的:y'}'}p
。
编辑
我认为缩短整个过程的最通用方法是扩展视觉选择:
使用搜索动作,如果您能在要复制的块的最后一行找到“钩子”(
V/foo<CR>
)或计数 (
V5j
)。
完成选择后,您可以:
拉 (
y
),移动到视觉选择的末尾(
'>
或5j
但'>
更通用),打开一个新行(
o
),退出插入模式 (
<Esc>
),粘贴 (
p
)
这种方法可能是最通用的,但仍然需要输入很多内容。这时映射就派上用场了:
vnoremap <F9> y'>o<Esc>p
这里的想法是将上下文与通用分开:
上下文部分是当你定义要复制的块时,因为没有办法预测你想要复制什么,我将这部分留给你自行决定,但我希望你使用比
jjjjjj…
通用部分是选择之后的所有内容,这里通过简单的映射完成。
整个过程现已简化到V5j<F9>
尽可能快。
答案2
如果我理解正确,你的目标是基本上获得一段文本的两个副本,一个接一个。在这种情况下,请尝试以下操作:
- Shift-V
- j选择区域
- y猛拉
- Shift-P放在你当前位置的上方
- 当你执行 put 时,它会告诉你添加了多少行。输入此数字,然后点击j
- Shift-O
我意识到这样做只是为了消除滚动,但对于任何大量的文本来说,这将是演变过程中最长的部分,并且最容易出现过度/不足的正确位置。