我为每个项目创建一个选项卡。
在每个选项卡中,打开文件我要进行编辑,这将创建多个缓冲区。
如果需要同时查看两个(或多个)文件,则可以创建拆分窗口,因此我有一个包含不同窗口的选项卡,其中显示了一个缓冲区。
要在缓冲区之间导航,我并没有真正使用
:ls
和:b [name or number of buffer]
,而是创建了一些方便的映射,允许我在使用:bnext
和:bprevious
的缓冲区之间进行切换。很好,但令我困扰的是:选项卡之间共享缓冲区。 如果我在
file1
中打开file2
和tab1
,在file3
中打开tab2
,如果在tab1
中我使用了几次:bnext
,我会在此选项卡中看到file3
,我不想这样做。我想要得到的工作流程如下:启动vim(我有一个带有缓冲区的第一个选项卡):
$ vim foo
添加一个缓冲到此选项卡:
:e bar
打开一个新选项卡并切换到它:
:tabnew
在此选项卡中打开一个新缓冲区:
:e baz
如果我留在此缓冲区中并执行
:bnext
或:bprevious
我将留在baz
缓冲区中(因为它是此选项卡中唯一的缓冲区)如果我进入上一个选项卡
:tabprevious
并执行几次:bnext
,我将仅切换在foo
和bar
缓冲区之间,但是不会看到baz
所以这是我的问题:是否可以将一组缓冲区绑定到选项卡并使vim禁止访问
注意:我知道使用
:b [myBuffer]
是在选项卡中保留缓冲区的一种方法,但是当我有3或4个文件时编辑我觉得使用映射的速度比输入缓冲区名称(即使我只能键入一些字符以匹配缓冲区名称)。#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
来使用仅在当前选项卡中查看(并选择)缓冲区。 例如,像这样的内容:当前选项卡的缓冲区列表(
j
,k
),选择一个(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
评论
这是一个古老的讨论,着重强调了这种方法的优缺点,并建议今天可以翻译为:多个vim实例(每个项目/缓冲区列表一个)+ tmux:vim.1045645.n5.nabble.com/…@VanLaser:感谢您的链接,这是一个有趣的讨论!当我在个人计算机上时,实际上包括tmux和不同的vim实例。我的问题来自以下事实:我必须使用Windows进行专业工作,而且我真的不喜欢如何处理窗口:使用alt + tab(甚至更糟的是鼠标)感觉比在vim中切换tab容易得多。
也许vim-ctrlspace可以帮助您-它在每个标签页缓冲区列表中进行公告;不过我不使用。