如何测试是否只打开默认缓冲区?

时间:2013-05-28 17:24:44

标签: vim

我正在编写一个插件,只有在没有打开缓冲区的情况下才会加载会话。到目前为止,我testing vs argc

if (argc() != 0)
    return
endif

如果我从命令行传递参数,这可以正常工作:vim file1

然而,问题是我有一些包围vim的脚本:

function foo {
    vim file1
}

$ foo

在后一种情况下,argc为空,因此上述if条件失败。

如何在仅打开默认缓冲区的情况下测试vim是否被调用?

2 个答案:

答案 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