Vim:克隆缓冲区并将其隐藏起来

时间:2013-10-22 19:10:02

标签: vim vim-plugin

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

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

此外,作为奖励,应该隐藏这个新缓冲区,因为它将仅用于快速存储一些已处理的数据然后立即死亡。优选地,这应该是没有任何拆分,因为它们会引入恼人的闪烁(因为Vim重绘屏幕),即使尽快关闭(例如,:new / {{1 }组合)。我们不能假设我们要克隆的缓冲区有一个名称。

谢谢。

结论


一些测试显示用

传输数据
:close

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

虽然没有人回答这个问题,但我设法找到了一个函数,它将创建一个没有任何拆分的新隐藏缓冲区,即它将在没有窗口的情况下在后台静默创建。要了解详情,请参阅:put=getbufline(...) 。例如:

:h bufnr()

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

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

在这个新创建的缓冲区上,因此它也将隐藏let &l:buflisted = 0 ,这正是我们需要满足上述要求的。

因此,对于用户来说,不会出现眨眼或任何视觉刺激,例如来自:ls / :new组合......对于某些肮脏的工作来说,这是一个真正隐藏的缓冲区。

3 个答案:

答案 0 :(得分:2)

这个名为getbufline()的函数。查看:h getbufline()

此处它正在运行,并入此克隆命令:

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

这会将当前缓冲区克隆为新的分割。

注意:

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

为方便起见,这里再次输入命令,打包为用户命令:put

:Clone

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我假设你的缓冲区已有名字?那么这是另一种方法:

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

:sp拆分缓冲区

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

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