如何将一组缓冲区绑定到选项卡?


14

当我需要同时处理不同的项目时,我有以下工作流程:

  • 我为每个项目创建一个选项卡。
  • 在每个选项卡中,打开要编辑的文件,这将创建多个缓冲区。
  • 可选地,如果我需要同时查看两个(或多个)文件,则可以创建拆分窗口,因此我有一个包含不同窗口的选项卡,其中显示了一个缓冲区。

我的缓冲区我真的不使用之间进行切换:ls,并:b [name or number of buffer]代替我创造了一些方便的映射,让我与缓冲区之间切换:bnext,并:bprevious

这种工作方式非常好,但让我感到困扰:缓冲区在选项卡之间共享。

如果我打开file1,并file2tab1file3tab2,如果tab1我用几个时间:bnext我会看到file3在这个标签,我不想。我想要得到的工作流程如下:

  • 启动vim(我有一个带有缓冲区的第一个选项卡): $ vim foo
  • 将缓冲区添加到此选项卡: :e bar
  • 打开一个新标签并切换到它: :tabnew
  • 在此选项卡中打开一个新缓冲区: :e baz
  • 如果我留在此缓冲区中并且:bnext还是:bprevious要留在baz缓冲区中(因为它是此选项卡中唯一的缓冲区)
  • 如果我进入上一个选项卡:tabprevious并执行几次,则:bnext只能在foobar缓冲区之间切换,但看不到baz

因此,我的问题来了:是否可以将一组缓冲区绑定到一个选项卡,并使vim禁止从另一个选项卡(而不是它们要进入的那个)访问某些缓冲区?

注意:我知道使用:b [myBuffer]可以在选项卡中保留缓冲区,但是当我要编辑3或4个文件时,我觉得使用映射的速度确实比输入缓冲区名称要快(即使我可以仅键入一些字符以匹配缓冲区名称)


1
这是一个古老的讨论,着重强调了这种方法的优缺点
VanLaser

@VanLaser:感谢您的链接,这是一个有趣的讨论!当我在个人计算机上时,实际上包括tmux和不同的vim实例。我的问题来自这样一个事实,我必须在专业工作中使用窗口,而我真的不喜欢如何处理窗口:使用alt+tab(甚至更糟的是鼠标)感觉比在vim中切换选项卡容易得多。
statox

1
也许 vim-ctrlspace可以帮上忙-它在每个标签页缓冲区列表中做广告;不过我不使用它。
VanLaser

Answers:


7

嗯,我没有找到任何插件,但是您可以自己编写。您需要为此学习vimscript。我刚刚实现了可以在选项卡中的缓冲区之间切换的功能(尚未删除)。您可以将其复制到您的vimrc中:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

关闭您的vimrc,然后再次打开它。要查找下一个缓冲区,只需使用

:call WindowBufManagerNext()

或定义您自己的命令或映射。只要您不关闭或删除选项卡或缓冲区,这将起作用。它也不适用于多个缓冲区。要添加这些功能,还需要做更多的工作,但是绝对可以实现。


我也没有找到插件,我希望有一个内置的功能,但是看来你是对的,我可能必须自己做。感谢您的代码,我可能会使用它有一个开发完整插件的基础。
statox

6

缓冲区是全局的,除了在选项卡页,窗口和缓冲区的顶部编写自己的抽象层之外,您无能为力。philolo1的答案显示了解决该问题的合理方法,但是您将很快找到这种“解决方案”的局限性,并且需要复制许多内置功能,例如:bufdo或备用文件……

另一方面,“参数”可以位于窗口本地,因此它们在工作流程中可能比“缓冲区”(在此词的最严格含义中)更有用:

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

参数不如缓冲区灵活,但它们可以为您的工作流提供更可靠的基础。

但是在我看来,在自己的Vim实例中处理每个项目是唯一可行的解​​决方案。


我同意这样的想法,即可以在终端中使用单独的vim实例更好,正如我在另一条评论中所说,我必须在专业计算机上使用Windows,并且在gvim实例之间进行切换对于使用此操作系统是一种痛苦。 。我将看看以前从未使用过的参数,这可能是一个很好的解决方法,谢谢!
statox

2

因此,我想我可能已经找到了满意的答案(至少对我而言!)。您将需要Shougo的两个插件:

以及一个快速访问映射(而不是使用:ls)来仅从当前选项卡中查看(并选择)缓冲区。

例如,类似:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

unite-每个选项卡缓冲区

现在,您可以通过当前的标签缓冲区列表中移动(jk),选择一个(CR),取消(q),进入“输入”(插入)模式快速过滤缓冲选择通过输入一些字母,有的甚至打到Tab打开动作列表对于当前选择的项目(例如,打开当前活动项目上方的缓冲区)-简而言之,您将以通用的“联合”方式进行操作。

(另请参见:h unite_default_key_mappings和Unite的帮助)。


现在是最后一个(还可选)的技巧。使用altercmd,您可以创建自己的,按Tab键启用的ls命令(基于上述Unite功能):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

...并且每次您点击时:ls,Vim实际上都会运行您的命令。

请注意,您也不需要:bn:bp,因为选项卡的缓冲区查看和选择现在是同一命令。


我也会尝试这种解决方案。目前,我将尝试评论VanLaser在评论中提到的ctrl-space,这非常好。我将看到最方便的解决方案。还为altercmd插件+1,这很酷!
statox

2

我无法发表评论,因为我的帐户是新帐户,对此感到抱歉,但是ctrl-space为++++ 1。

在帮助完成一半的时候我就被卖了。Ctrlspace具有如下结构:

workspaces --> contain tabs --> contain buffers

因此,您可以为正在处理的每个项目保存一个工作区,然后在需要时立即加载它。这意味着,每当您关闭vim时,您都可以保存所有缓冲区和制表符拆分。

您也可以命名标签。如果这还不够,您还可以非常轻松地更改工作目录并为经常使用的目录创建书签。

如果您使用它,它可以很好地与nerdtree交互(尽管说实话,使用ctrlspace一周后您甚至可能都不想要它)


考虑以下用例:

您有一个项目。它涉及植树。有果树和金钱树。金钱树包含美元和美分,而果树包含苹果和橙子。

在此示例中,苹果,橙子,美元和美分都是“缓冲区”。

Ctrlspace允许您将苹果和橙子分成一个“标签”,可以为“水果”添加标签-该标签将显示在窗口顶部的标签行中。同样,美元和美分进入“货币”标签。

“树”工作区保存了整个配置,并允许您在每次打开vim时立即访问它。


既然我知道它的存在,我真的无法想象没有这个插件在vim中进行面向对象的开发。以防万一,这是链接:https : //github.com/szw/vim-ctrlspace


2

因此,最终决定创建自己的插件来解决我的问题,该插件可以在github上找到

我使用@ philolo1的想法并尝试完成它,当时我正在编写此答案,它仍在进行中。

编辑随着工作流程的发展,我不再维护该插件,并且我意识到将缓冲区绑定到选项卡会带来更多无法解决的问题。


该插件将缓冲区绑定到选项卡:当用户打开缓冲区时,它会自动“存储”在选项卡中,无法从另一个选项卡访问。

安装应该是“插件管理器友好的” (至少与Vim-PlugVundle兼容

一些主要功能是:

  • 自动处理缓冲区的绑定(用户可以像以前一样打开它们)
  • :NextBuf:PrevBuf替换:bn:bN保持选项卡的一致状态
  • :ListBuf允许列出缓冲区,:ls除了将缓冲区分隔在选项卡中外,并通过一个符号让用户轻松查看他当前所在的选项卡。
  • :ChangeBuf 接受缓冲区编号或缓冲区名称以自动更改缓冲区和更改制表符
  • 关闭缓冲区是通过 :CloseBuf
  • 关闭标签页的操作如下 :CloseTab

对于其他操作的用户应该能够使用内置的功能(如:tabopen:tabnext等...)

对于每一个命令提供了一些默认的映射,它们可以通过添加很容易地禁用let g:betterTabsVim_map_keys = 0你的.vimrc

我还尝试制作一个明确的帮助文件(:h betterTabs.txt):尚未完成,但用户应找到使用该插件的最低要求。

我还有很多测试要做,以确保该插件不会弄乱任何本地行为。

最后,如果有人愿意提供帮助,总是可以在github页面上创建问题或创建请求请求。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.