如何在选择垂直块后将内容粘贴到光标前面?

34

我确信这个功能一定存在,但如果不存在的话,可能有一个宏可以实现...

我最喜欢 vim 的一个功能是在可视模式下进行插入(<C-v>,选中行,<C-I>,输入一些内容,然后按 Esc)。

我的问题是,我想在之前粘贴剪贴板内容,而不是 '插入'。我尝试了 <C-P>,但没有成功。

我已经阅读了速查表,在各处搜索过,查看了这里的问题,但没有找到答案,但我肯定是在寻找错误的东西。


相关:在 Vim SE 上如何粘贴垂直选择块中的一行? - kenorb
因为没有粘贴光标前的现有问题,在duckduckgo、bing和google上搜索“vim paste before cursor”将返回此作为首要结果,并且它刚好回答了那个问题。 - user202729
1
请注意:在这种情况下,剪贴板内容只有1行,并且OP希望将相同的内容粘贴到所有选定的行上。这就是OP真正想要的,但在问题中没有解释清楚。 - user202729
5个回答

177

通常,P命令(大写,与p不同)会将剪贴板的内容粘贴在光标位置之前。这是您想要的吗?(当您说按下Command+I时,我不太确定您的意思,因为我的键盘没有Command键。)


好的,抱歉,<C-I> 是在光标前插入。 <C-P> 只能粘贴一次。 - Christian
12
好的,我会尽力做到。这个回答可能不是原帖作者寻求的答案,但对其他人来说似乎是解决方案。 - vastlysuperiorman
1
他们应该有一个规则,即“如果非被接受的答案在三位数中字面上比第一个答案多10倍,则忽略已接受答案的规则”。只需将其标记为已接受或至少使其成为首选。 - j riv

20

我猜你指的是在视觉块模式下使用 I 在多行插入相同的文本,而按下 p 仅会粘贴到当前行而非所有选择的行。

在插入模式中,可以按下 C-r 然后输入一个寄存器来插入该寄存器的内容,因此如果你想要粘贴未命名的缓冲区,你需要输入:

C-r"

同样地,要从剪贴板粘贴

C-r* 

通过正常输入 "insert",然后使用 C-r 快捷键,您可以获取所选行的所有文本。

查看 :h registers 可以了解可用于您的寄存器。


1

虽然五月份看起来有点晚,但我也遇到了同样的问题。

例如:一个文件有两行:

foo
bar

  1. 按下v: 进入可视模式
  2. 选择foo以进行复制
  3. 将光标移动到"b"ar上

4-1. 按下p => bfooar

4-2. 按下P(Shift+P) => foobar 这正是我所期望的。

TLDR: 大写字母P (shift + p)


更简单的方法:在foo所在的行中,按下gJ - ying17zi

0
例如,我们需要在单词Fish之前的4行中插入My
def EatMyFish(x):
    return x - 1

a = EatFish(1)
b = EatFish(2)
c = EatFish(3)
d = EatFish(4)
  1. 复制 def EatMyFish(x): 中的 My
  2. 将光标放在 EatMyFish(1) 这一行的 F
  3. Ctrl-v 进入竖向选择模式
  4. 3j 选择该列中所有的 F
  5. I 进入编辑模式,对这四行进行编辑(注意是大写的 i
  6. Ctrl-o 回到正常模式执行一个操作(记住:o = one or once)
  7. P 在光标前插入(注意是大写的 p

或者

  1. Ctrl-r" 在插入模式下从寄存器中插入,代替上述步骤 6-7

无论如何,现在我们有:

def EatMyFish(x):
    return x - 1

a = EatMyFish(1)
b = EatMyFish(2)
c = EatMyFish(3)
d = EatMyFish(4)

0

基于Alligator的解决方案,使用地图。

例如,在3种情况下粘贴字符串_s_

" |-- original --|-- pasted after C   --|-- pasted before C  --|-- pasted replacing C   --|
" |--------------|------------------------------------------------------------------------|
" |--          --|-- select column C  --|-- select column B  --|-- select column C      --|   --> step 0 (after copying/yanking a string) 
" |--          --|-- press <leader>py --|-- press <leader>py --|-- press p              --|   --> step 1 if yanked
" |--          --|-- press <leader>pc --|-- press <leader>pc --|-- press "+p            --|   --> step 1 if copied to clipboard
"       ABCD              ABC_s_D               AB_s_CD                 AB_s_D 
"       ABCD              ABC_s_D               AB_s_CD                 AB_s_D 
"       ABCD              ABC_s_D               AB_s_CD                 AB_s_D 

每个寄存器(复制或剪切)的映射如下:

xnoremap <leader>py A<C-r>*<Esc>
xnoremap <leader>pc A<C-r>+<Esc>

在之前的例子中,我将粘贴在列后面(即使在列C之前粘贴,我也会解决办法在列B之后粘贴)。如果想要在之前粘贴,只需在2个映射中将A更改为I
与其使用"+p,不如使用普通的p,如果之前已经将+复制到*寄存器中(在表格的最后一种情况下需要)。
nnoremap <leader>z :let @*='<C-r>+'<CR>

我所说的“copy”是指复制到剪贴板(+寄存器),而不是Vim的:copy命令。请参见[http://vimcasts.org/episodes/long-range-line-duplication/]。 - Xopi García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接