如何检测Vimscript中是否存在特定缓冲区?

时间:2016-02-17 19:11:25

标签: vim

我想检测Vimcript窗口中是否已经打开(可见)特定文件。如果文件未在vim窗口中打开(可见),我想通过:edit打开它。

我有一个带扩展文件路径的变量,想要检查一个带有扩展文件路径的文件是否已经在Vim窗口中打开(可见)。

我该怎么做?

关于这一点的第二个问题是如何获得包含所有打开(可见)文件和所有不可见但打开文件(缓冲区)的列表。

我认为这主要是关于缓冲区。

SOLUTION(2016.02.18)

thx @muru指向所需的功能。 我的测试解决方案在当下看起来像那样

function! ChooseBuffer(buffername)
    let bnr = bufwinnr(a:buffername)
    if bnr > 0
       :exe bnr . "wincmd w"
    else
       echo a:buffername . ' is not existent'
       silent execute 'split ' . a:buffername
    endif
 endfunction
:nnoremap <leader><leader>d :call ChooseBuffer("divramod.vim")<cr>
:nnoremap <leader><leader>1 :call ChooseBuffer("vim/plugin/divramod/test1.vim")<cr>
:nnoremap <leader><leader>2 :call ChooseBuffer("vim/plugin/divramod/test2.vim")<cr>
:nnoremap <leader><leader>t :call ChooseBuffer("vim/plugin/divramod/test.vim")<cr>

似乎是这样,bufwinnr()发现“divramod.vim”尽管事实上,缓冲区列表中的缓冲区名称被称为“vim / plugin / divramod / divramod.vim”。它似乎使用正则表达式在buffername中搜索。我必须进行实验,当打开两个具有相同文件名但文件路径不同的缓冲区时会发生什么。

3 个答案:

答案 0 :(得分:11)

您可以使用bufwinnr()功能:

bufwinnr({expr})                                        bufwinnr()
            The result is a Number, which is the number of the first
            window associated with buffer {expr}.  For the use of {expr},
            see bufname() above.  If buffer {expr} doesn't exist or
            there is no such window, -1 is returned.

来自bufname()

            If the {expr} argument is a string it must match a buffer name
            exactly.  The name can be:
            - Relative to the current directory.
            - A full path.
            - The name of a buffer with 'buftype' set to "nofile".
            - A URL name. 

所以,比如:

if bufwinnr(myfile) > 0
  echo "Already open"
endif

答案 1 :(得分:3)

bufwinnr()没有考虑其他标签页。由于Vim patch 7.4.1558有一个名为win_findbuf({bufnr})的新功能,它将从所有标签页返回包含缓冲区的所有窗口ID的列表。

答案 2 :(得分:1)

如果您想知道缓冲区是否存在,而不是它既存在又在某个窗口中打开,请使用bufexists(buffer_number)。我推荐使用bufexists(str2nr(buffer_number)),以防你的缓冲区变量恰好是一个字符串。这将返回1,即使您的缓冲区存在,但在任何当前窗口中都不会打开。