VIM:关闭当前文件中除I';我在吗?

VIM:关闭当前文件中除I';我在吗?,vim,Vim,如果我打开的5个选项卡是: file1 file2 file2 file2 file3 我想要一种快速的方法来关闭所有重复的file2选项卡,当焦点在任何file2选项卡上时 所以运行命令后的结果应该是: file1 file2 file3 当焦点位于file1或file3时,该命令不应产生任何效果,因为这些选项卡没有重复 关于如何实现这一点有什么想法吗 编辑-基于Ingo建议的解决方案: function! s:CloseDupTabs() let curBufnr = bufnr

如果我打开的5个选项卡是:

file1 file2 file2 file2 file3
我想要一种快速的方法来关闭所有重复的
file2
选项卡,当焦点在任何
file2
选项卡上时

所以运行命令后的结果应该是:

file1 file2 file3
当焦点位于
file1
file3
时,该命令不应产生任何效果,因为这些选项卡没有重复

关于如何实现这一点有什么想法吗

编辑-基于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

Vim中每个打开的文件都会得到一个唯一的缓冲区编号;可以通过以下方式获得当前文件的文件(
file2

:let bufnr = bufnr('')
然后,您可以检查其他选项卡页,并关闭具有相同编号的任何缓冲区<代码>:help tabpagebuflist()有一个如何迭代所有选项卡页面的示例;只需修改它即可跳过当前(
tabpagenr()
)一个

要关闭缓冲区,首先需要导航到相应的选项卡页面:

:execute 'tabnext' tabnr
如果选项卡中始终只有一个窗口,则可以将其关闭。否则,您需要首先找到具有缓冲区的窗口,然后转到该窗口:

:execute bufwinnr(bufnr) . 'wincmd w'
最好能跟踪原始选项卡页码,在删除之前的选项卡页时将其递减,以便返回到原始页。

我使用它来实现这一点

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


:塔博斯Uniq

您可以添加您的解决方案作为答案,甚至可以接受它:-)可能重复的