1

我正在编写一个插件,仅在没有打开缓冲区时才加载会话。到目前为止,我正在测试 vs argc

if (argc() != 0)
    return
endif

如果我从命令行传入参数,这很好用:vim file1

但是,问题是我有一些围绕 vim 的脚本:

function foo {
    vim file1
}

$ foo

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

如果仅在默认缓冲区打开的情况下调用 vim,您如何测试?

4

2 回答 2

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
于 2013-05-29T01:35:14.070 回答
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
于 2013-05-29T09:14:29.567 回答