0

如何创建一个新缓冲区作为另一个缓冲区的克隆?换句话说,内容应该相同,但最终应该是 2 个不同的缓冲区。我对这样做的编程方式更感兴趣,而不是从映射的角度来看,因为这是未来插件所需要的。

像拉动一个缓冲区,然后将焦点放在另一个缓冲区并粘贴这样的建议在这里不起作用,因为这意味着我们已经覆盖了用户之前的拉动,因此在调用我们的插件方法后破坏了用户的体验。我正在寻找一些尽可能偷偷摸摸的方法。

此外,作为奖励,这个新缓冲区应该被隐藏起来,因为它只是用来快速存储一些处理过的数据,然后立即死亡。最好不要进行任何拆分,因为即使尽快关闭(例如:new/:close组合),它们也会引入烦人的闪烁(因为 Vim 重绘屏幕)。我们也不能假设我们要克隆的缓冲区有名称。

谢谢你。

结论


一些测试表明,使用

:put=getbufline(...)

是最快的方法,也是最安全的方法,因为它不会以任何方式干扰用户体验。

虽然没有人回答这个问题,但我设法找到了一个函数,它可以创建一个没有任何拆分的新隐藏缓冲区,即它将在没有窗口的背景上静默创建。要了解更多信息,请参阅:h bufnr()。例子:

let buffer_number = bufnr('My New Hidden Buffer', 1)

此外,此调用将隐式执行以下操作:

let &l:buflisted = 0

在这个新创建的缓冲区上,所以它也会被隐藏:ls,这正是我们需要满足上述要求。

因此,对于用户来说,不会有任何闪烁或任何视觉刺激,例如 from :new/ :closecombo ......对于一些肮脏的工作来说,这是一个真正隐藏的缓冲区。

4

3 回答 3

2

有一个函数称为getbufline(). 抬头看:h getbufline()

它在行动中,并入此克隆命令中:

:new | put =getbufline('#',1,'$') | 1d_

这会将当前缓冲区克隆到新的拆分中。

笔记:

  • 垂直<Bar>链 Ex 命令,在本例中为三个;
  • :new在拆分窗口中创建一个新缓冲区并将焦点移到那里;
  • :put =评估传递给它的表达式并将列表中的项目作为行插入;
  • getbufline()被调用以从“备用文件”1中从头到尾读取行;'$''#'
  • :1d_摆脱作为副作用产生的空行 1 :put

为方便起见,这里又是命令,打包为用户命令:Clone

:command! Clone new | put =getbufline('#',1,'$') | 1d_
于 2013-10-22T21:16:03.043 回答
1

您可以使用let var=getline(1,'$')获取缓冲区中的所有行并将它们放入变量中。然后,您可以直接在列表中使用数据,也可以使用append()setline()函数将该文本写入另一个缓冲区。如果您希望文件中的数据在外部处理,您可以使用该writefile()功能。

或者,您可以使用写入文件,:w newfilename并且如果当前缓冲区已经关联了文件名,则只会使用当前缓冲区内容创建一个新文件,而根本不会更改关联文件。然后您可以打开该文件或使用该readfile()函数将文本输入 Vim。如果您的处理发生在 Vim 之外,这可能是更好的选择,因为它不涉及在列表中保留大量数据或打开新缓冲区。

于 2013-10-22T20:13:25.730 回答
0

我假设,你的缓冲区已经有了名字?然后这是另一种方法:

:sp|f foobar|exe "norm! \<C-^>"

:sp拆分缓冲区

:f foobar将两个拆分窗口的缓冲区名称设置为 foobar(并将旧缓冲区名称设置为备用文件)

exe "norm! \<C-^>"在当前窗口中切换到上一个缓冲区

于 2013-10-22T21:58:03.200 回答