如何在Vim中复制缓冲区



我正在寻找一种方法来创建一个新的缓冲区,它是当前缓冲区的副本。

然后,我可以做如下操作,将当前选项卡复制到gVim中的新选项卡,例如:

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

然而,这个问题并不是选项卡或gVim特有的;我可能想在split命令或vert diffsplit命令之后复制缓冲区。(实际上,vert diffsplit是我第一次意识到我想要复制缓冲区。)

理想情况下,我还希望保留尽可能多的原始缓冲区和窗口状态,包括光标位置,但原始缓冲区只读状态被忽略,新缓冲区始终是可写的。

目前,当我遇到这个任务时,我会键入ggyG,打开或移动到新的缓冲区,然后键入Vp,但我不仅会松开新窗口的光标位置,我使用的复制命令也需要松开原始窗口中的位置。这个过程肯定可以简化为一个单一的命令。

以下命令序列应该提供一个良好的起点…

  1. 在原始缓冲区中:

    :%y
    :let my_view = winsaveview()
    :let my_ft = &filetype
    :new
    
  2. 在新的缓冲区中:

    :execute "setf " . my_ft
    :0put
    :call winrestview(my_view)
    

请注意,要复制的"状态"不是特定于缓冲区的,而是特定于窗口的。

我的克隆插件为此提供了一个:CloneAs {file}命令。它基本上创建了一个新的缓冲区,并在原始缓冲区、光标位置和关键选项上进行复制。