如何在Vim中复制缓冲区?

6

我想找到一种方法来创建一个当前缓冲区的副本。

例如,在gVim中,我可以执行以下操作将当前标签复制到新标签中:

:let b = bufnr("%") | tabnew | execute 'buffer' b | *duplicate*

然而,这个问题并不是针对选项卡或gVim的特定问题;我可能会在split命令或vert diffsplit命令之后想要复制缓冲区。(实际上,我意识到我想要复制缓冲区的第一个例子是vert diffsplit。)
理想情况下,我希望保留尽可能多的原始缓冲区和窗口状态,包括光标位置,除了原始缓冲区只读状态被忽略且新缓冲区总是可写。
目前,在遇到此任务时,我键入ggyG,打开或移动到新缓冲区,然后键入Vp,但我不仅失去了新窗口的光标位置,我使用的复制命令也需要失去原始窗口中的位置。这个过程可以简化为单个命令。
2个回答

2
以下命令序列应该是一个很好的起点...
  1. in the original buffer:

    :%y
    :let my_view = winsaveview()
    :let my_ft = &filetype
    :new
    
  2. in the new buffer:

    :execute "setf " . my_ft
    :0put
    :call winrestview(my_view)
    
请注意,您想要复制的“状态”不是特定于缓冲区而是特定于窗口的。

0put在底部留下了一个空行。我们如何避免这种情况? - aosho235
在执行 :0put 命令后,您可以使用 :$d 命令。 - romainl

2

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