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


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

要在缓冲区之间导航,我并没有真正使用:ls:b [name or number of buffer],而是创建了一些方便的映射,允许我在使用:bnext:bprevious的缓冲区之间进行切换。很好,但令我困扰的是:选项卡之间共享缓冲区。

如果我在file1中打开file2tab1,在file3中打开tab2,如果在tab1中我使用了几次:bnext,我会在此选项卡中看到file3,我不想这样做。我想要得到的工作流程如下:


启动vim(我有一个带有缓冲区的第一个选项卡):$ vim foo

添加一个缓冲到此选项卡::e bar

打开一个新选项卡并切换到它::tabnew

在此选项卡中打开一个新缓冲区::e baz

如果我留在此缓冲区中并执行:bnext:bprevious我将留在baz缓冲区中(因为它是此选项卡中唯一的缓冲区)
如果我进入上一个选项卡:tabprevious并执行几次:bnext,我将仅切换在foobar缓冲区之间,但是不会看到baz


所以这是我的问题:是否可以将一组缓冲区绑定到选项卡并使vim禁止访问

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

评论

这是一个古老的讨论,着重强调了这种方法的优缺点,并建议今天可以翻译为:多个vim实例(每个项目/缓冲区列表一个)+ tmux:vim.1045645.n5.nabble.com/…

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

也许vim-ctrlspace可以帮助您-它在每个标签页缓冲区列表中进行公告;不过我不使用。

#1 楼

嗯,我在那里没有找到任何插件,但是您可以自己编写。您需要为此学习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♦
15年7月31日在7:34

#2 楼

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

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

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


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

但是我认为在自己的Vim实例中处理每个项目是唯一可行的解​​决方案。 br />

评论


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

–statox♦
15年7月31日在7:31

#3 楼

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


Shougo / Unite
Shougo / tabpagebuffer

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

例如,像这样的内容:当前选项卡的缓冲区列表(jk),选择一个(CR),取消(q),进入“输入”(插入)模式以通过键入一些字母来快速筛选缓冲区选择,甚至按Tab打开操作当前选择的项目(例如,打开当前活动项目上方的缓冲区)-简而言之,您将以通用的“联合”方式进行操作。

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


最后的技巧(还可选)。使用altercmd,您可以创建自己的启用了逐选项的ls命令(基于上述Unite功能):

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


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

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

评论


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

–statox♦
15年8月10日在8:09

#4 楼

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

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

workspaces --> contain tabs --> contain buffers


因此,您可以为正在处理的每个项目保存一个工作区,然后随时随地加载它。这意味着,每当关闭vim时,您都可以保存所有缓冲区和标签页分割。

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

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


考虑该用例:

您有一个项目。它涉及植树。有果树和金钱树。金钱树包含美元和美分,而果树包含苹果和橙子。在此示例中,苹果,橙子,美元和美分都是“缓冲区”。

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

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


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

#5 楼

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

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


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

安装应为“插件管理器友好”(至少与Vim-Plug和Vundle兼容)

一些主要功能包括:


自动处理缓冲区绑定(用户可以像以前一样打开它们)。

:NextBuf:PrevBuf替换:bn:bN以保持选项卡的一致状态

:ListBuf允许类似于:ls除了分隔在选项卡中,并带有一个符号,使用户可以轻松查看他当前所在的选项卡。

:ChangeBuf接受缓冲区编号或缓冲区名称以自动更改缓冲区和更改选项卡
使用:CloseBuf完成缓冲区

使用:CloseTab关闭标签页


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

为每个命令提供了一些默认映射,可以通过将let g:betterTabsVim_map_keys = 0添加到.vimrc来轻松禁用它们。制作一个明确的帮助文件(:h betterTabs.txt):尚不完整,但用户应找到使用该插件的最低要求。不会弄乱任何本地行为。

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

#6 楼

看看这个插件。在我看来,它非常适合您的需求。
https://github.com/szw/vim-ctrlspace

评论


确实,VanLaser在评论中提到了它,但起初我看的不够近,但它看起来确实不错,我已经尝试了几天。

–statox♦
2015年8月10日在8:11