我正在编写一个插件,仅在没有打开缓冲区时才加载会话。到目前为止,我正在测试 vs argc。
if (argc() != 0)
return
endif
如果我从命令行传入参数,这很好用:vim file1
但是,问题是我有一些围绕 vim 的脚本:
function foo {
vim file1
}
$ foo
在后一种情况下,argc
为空,因此上述 if 条件失败。
如果仅在默认缓冲区打开的情况下调用 vim,您如何测试?
我正在编写一个插件,仅在没有打开缓冲区时才加载会话。到目前为止,我正在测试 vs argc。
if (argc() != 0)
return
endif
如果我从命令行传入参数,这很好用:vim file1
但是,问题是我有一些围绕 vim 的脚本:
function foo {
vim file1
}
$ foo
在后一种情况下,argc
为空,因此上述 if 条件失败。
如果仅在默认缓冲区打开的情况下调用 vim,您如何测试?
我能想到的最好的办法就是写一个函数。我认为 bufnr('$') 会这样做,但它列出了最高加载的缓冲区号。即使我没有打开文件(只是启动 vim), bufnr('$') 函数也会返回 1。缓冲区也可以用 :bw 卸载,这不会改变 bufnr('$') 返回的内容。
无论如何,这是功能:
function! NumBuffers()
let rc = 0
for idx in range(bufnr('$'))
if bufloaded(idx)
let rc += 1
endif
endfor
return rc
endfunction
如果您将文件传递给 Vim,这将反映在argc
(也当您包装 Vim 调用时)。相反,极端情况是使用编辑命令启动 Vim,例如vim -c "edit foo"
. 如果你需要检测,你需要检查两件事:
这是一组实现它的函数:
function! IsBlank( bufnr )
return (empty(bufname(a:bufnr)) &&
\ getbufvar(a:bufnr, '&modified') == 0 &&
\ empty(getbufvar(a:bufnr, '&buftype'))
\)
endfunction
function! ExistOtherBuffers( targetBufNr )
return ! empty(filter(range(1, bufnr('$')), 'buflisted(v:val) && v:val != a:targetBufNr'))
endfunction
function! IsEmptyVim()
let l:currentBufNr = bufnr('')
return IsBlank(l:currentBufNr) && ! ExistOtherBuffers(l:currentBufNr)
endfunction