我正在编写一个插件,只有在没有打开缓冲区的情况下才会加载会话。到目前为止,我testing vs argc。
if (argc() != 0)
return
endif
如果我从命令行传递参数,这可以正常工作:vim file1
然而,问题是我有一些包围vim的脚本:
function foo {
vim file1
}
$ foo
在后一种情况下,argc
为空,因此上述if条件失败。
如何在仅打开默认缓冲区的情况下测试vim是否被调用?
答案 0 :(得分:1)
我能想到的最好的就是写一个函数。我以为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
答案 1 :(得分:1)
如果您将文件传递给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