我正在寻找一种方法来创建一个新的缓冲区,它是当前缓冲区的副本。
然后,我可以做如下操作,将当前选项卡复制到gVim中的新选项卡,例如:
:let b = bufnr("%") | tabnew | execute 'buffer' b | *duplicate*
然而,这个问题并不是选项卡或gVim特有的;我可能想在split
命令或vert diffsplit
命令之后复制缓冲区。(实际上,vert diffsplit
是我第一次意识到我想要复制缓冲区。)
理想情况下,我还希望保留尽可能多的原始缓冲区和窗口状态,包括光标位置,但原始缓冲区只读状态被忽略,新缓冲区始终是可写的。
目前,当我遇到这个任务时,我会键入ggyG
,打开或移动到新的缓冲区,然后键入Vp
,但我不仅会松开新窗口的光标位置,我使用的复制命令也需要松开原始窗口中的位置。这个过程肯定可以简化为一个单一的命令。
以下命令序列应该提供一个良好的起点…
-
在原始缓冲区中:
:%y :let my_view = winsaveview() :let my_ft = &filetype :new
-
在新的缓冲区中:
:execute "setf " . my_ft :0put :call winrestview(my_view)
请注意,要复制的"状态"不是特定于缓冲区的,而是特定于窗口的。
我的克隆插件为此提供了一个:CloneAs {file}
命令。它基本上创建了一个新的缓冲区,并在原始缓冲区、光标位置和关键选项上进行复制。