我想检测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>
Run Code Online (Sandbox Code Playgroud)
似乎是这样,bufwinnr()发现"divramod.vim"尽管事实上,缓冲区列表中的缓冲区名称被称为"vim/plugin/divramod/divramod.vim".它似乎使用正则表达式在buffername中搜索.我必须进行实验,当打开两个具有相同文件名但文件路径不同的缓冲区时会发生什么.
mur*_*uru 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.
Run Code Online (Sandbox Code Playgroud)
来自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.
Run Code Online (Sandbox Code Playgroud)
所以,像:
if bufwinnr(myfile) > 0
echo "Already open"
endif
Run Code Online (Sandbox Code Playgroud)
如果您想知道缓冲区是否存在,而不是它既存在又在某个窗口中打开,请使用bufexists(buffer_number)。我建议使用bufexists(str2nr(buffer_number)),以防您的缓冲区变量恰好是一个字符串。1即使您的缓冲区存在,但未在任何当前窗口中打开,这也会返回。