VIM:关闭当前文件的所有其他选项卡,除了我在的那个?

时间:2018-03-06 19:49:59

标签: vim

假设我的5个打开的标签是:

file1 file2 file2 file2 file3

当重点放在任何file2标签上时,我想快速关闭所有重复的file2标签。

运行命令后的结果应为:

file1 file2 file3

当焦点位于file1file3时,该命令不会产生任何影响,因为这些选项没有重复的标签。

有关如何实现这一目标的任何想法?

编辑 - 基于Ingo建议的解决方案:

function! s:CloseDupTabs()
    let curBufnr = bufnr('')
    let numTabs  = tabpagenr('$')

    " Run for 1 lesser than numTabs so that we don't visit current tab in loop
    for i in range(numTabs - 1)
        execute 'tabnext'

        if curBufnr == bufnr('')
            " Check edge case to see if we're already on last tab before doing tabprev
            if tabpagenr() != tabpagenr('$')
                close 
                execute 'tabprev'
            else
                close
            endif
        endif
    endfor

    execute 'tabnext'
endfunction

2 个答案:

答案 0 :(得分:1)

Vim中的每个打开文件都会获得一个唯一的缓冲区编号;您当前文件的一个(示例中为file2)可以通过

获取
:let bufnr = bufnr('')

然后,您可以检查其他标签页,并关闭任何具有相同编号的缓冲区。 :help tabpagebuflist()举例说明了如何遍历所有标签页;只需修改它即可跳过当前(tabpagenr())。

要关闭缓冲区,首先需要导航到相应的标签页:

:execute 'tabnext' tabnr

如果您在标签页中只有一个窗口,则可以:close。否则,您需要首先找到具有缓冲区的窗口,然后转到它:

:execute bufwinnr(bufnr) . 'wincmd w'

最好跟踪原始标签页编号,在删除之前的标签页时减少它,以便返回原始标签页。

答案 1 :(得分:1)

我使用Tabops来实现这一目标。

使用您最喜欢的软件包管理器安装后,只需执行以下操作:

:Tabops Uniq