我想检测Vimcript窗口中是否已经打开(可见)特定文件。如果文件未在vim窗口中打开(可见),我想通过:edit
打开它。
我有一个带扩展文件路径的变量,想要检查一个带有扩展文件路径的文件是否已经在Vim窗口中打开(可见)。
我该怎么做?
关于这一点的第二个问题是如何获得包含所有打开(可见)文件和所有不可见但打开文件(缓冲区)的列表。
我认为这主要是关于缓冲区。
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中搜索。我必须进行实验,当打开两个具有相同文件名但文件路径不同的缓冲区时会发生什么。
答案 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
,即使您的缓冲区存在,但在任何当前窗口中都不会打开。