2013-05-28 40 views
1

我正在寫一個只在沒有緩衝區打開的情況下才加載會話的插件。到目前爲止我是testing vs argc如何測試是否只有默認緩衝區打開?

if (argc() != 0) 
    return 
endif 

,如果我在傳遞參數從命令行這工作得很好:vim file1

然而,問題是,我有一些腳本,迴繞VIM:

function foo { 
    vim file1 
} 

$ foo 

在後面情況下,argc是空的,因此如果條件失敗。

如何測試vim是否僅在默認緩衝區打開的情況下調用?

+2

我沒有看到您描述的行爲。在簡單的測試中,我做了'argc()'包含正確的數字。 – FDinoff

回答

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 
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 
相關問題