2011-05-12 287 views
6

我在許多機器上使用相同的vimrc,其中一些機器安裝了fugitive.vim,其中一些機器沒有。我喜歡在我的狀態欄中包含fugitive#statusline(),但在沒有安裝插件的機器上會產生錯誤。Vim:有條件地在vimrc中使用fugitive#statusline函數

在調用set statusline之前有沒有辦法檢查這個函數的存在?我已經使用existsŸ試過了,但它並沒有出於某種原因(加載順序?)

if exists("*fugitive#statusline") 
    set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff) 
endif 

我也試過的前綴來silent!命令沉默的錯誤,但不是似乎不工作。

回答

1

你可以嘗試檢查易損插件的加載變量嗎?

if exists('g:loaded_fugitive') 
    set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff) 
endif 

雖然如果逃犯#statusline的存在不起作用,這可能不會有效!

+0

這是行不通的。我嘗試過了,但是執行'vimrc'時變量'g:loaded_fugitive'不是空的就是不存在。 – Christopher 2013-12-05 04:24:26

9

這一次將是一條捷徑:

set statusline+=%{exists('g:loaded_fugitive')?fugitive#statusline():''} 
+0

這不起作用。我嘗試過了,但是執行'vimrc'時變量'g:loaded_fugitive'不是空的就是不存在。 – Christopher 2013-12-05 04:24:58

+0

@Christopher:請檢查您的'VIM-fugitive'安裝,因爲'G:loaded_fugitive'在'fugitive.vim'定義,這種插值完成時狀態行評估,而不僅僅是時間'vimrc'是執行。 – tungd 2013-12-05 09:52:23

+0

@tungd沒有理由'G:loaded_fugitive'加載* *前的vimrc除非你使用一些手段手動觸發加載。 – ZyX 2013-12-05 19:12:39

4

我想我已經制定了如何實現這一目標。 fugitive#statusline()的存在檢查需要在之後加載插件。在此之前,不會加載與逃逸相關的變量或函數。

$VIMRUNTIME/after/plugin路徑添加該代碼文件:

" $VIMRUNTIME/after/plugin/fugitive-statusline.vim 
if has("statusline") && exists('*fugitive#statusline') 
    " git fugitive statusline 
    set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P 

    " show statusline always 
    set laststatus=2 

    " turn off ruler 
    set noruler 
endif 
+0

做解釋。自動加載/自動加載的文件只有一種情況:有人嘗試使用未定義的函數或變量。當我們強制加載時,可能觸發自動加載的函數和變量被定義,從而有效地清除了第二次自動加載文件的原因。它不是在vimrc之後找到的插件目錄,無論它的文件是否已經被找到或者其他目錄如何。 – ZyX 2013-12-05 19:24:02

+0

F * cking fugitive插件在'plugin/fugitive.vim'中定義了這個函數,而不是在'autoload/fugitive.vim'中它應該被定位的位置(基於函數名),這意味着我的解決方案不工作* *(它仍然不會觸發無序運行:它根本不會觸發任何運行),Peter Rincker也不會。如果函數是在'autoload /'中定義的,那麼以前的評論適用,並且@Peter Rincker答案變好。加載'autoload/fugitive.vim'仍然沒有辦法引起任何麻煩,但它根本不存在。 – ZyX 2013-12-05 19:24:56

+0

^^^複製我的兩個意見,我的回答(它已被刪除),因爲我不知道你是否能看到評論被刪除的答案。要跟隨對話:「我們是否真的應該顛覆處理順序,但運行autoload/fugitive.vim失序。這可能會產生意想不到的後果。 - 克里斯托弗「是我評論第一個回覆的評論。我的答案是用':runtime'加載'autoload/fugitive.vim',然後檢查函數是否存在。 – ZyX 2013-12-05 19:25:49

6

作爲逃犯在autoload目錄沒有定義fugitive#statusline這黯然不能嗅使用silent! call/exists技術(謝謝@Christopher)。然而有一些替代方案:

  • 將三元分公司在'statusline'選項,@tungd建議。
  • 設置'statusline'after/plugin文件像@Christopher建議。這解決了這個問題,但意味着你的狀態行是在一個不太可能的地方定義的,所以最好在你的~/.vimrc文件中寫一個好評。
  • 只需在~/.vimrc文件中定義該功能即可。

實施例:

if !exists('*fugitive#statusline') 
    function! fugitive#statusline() 
     return '' 
    endfunction 
endif 
  • 另一種選擇是使用一個Fugitiveautocmd事件溢散定義。請注意,這隻會在Fugitive檢測到git目錄時觸發。

把下面的內容你~/.vimrc文件:

augroup fugitive_status 
    autocmd! 
    autocmd user Fugitive set statusline=%<\ %f\ %{fugitive#statusline()} ... 
augroup END 

我個人認爲@tungd解決方案是最簡單的。然而,只是定義一個虛擬函數將是我的下一個選擇。如果Fugitive已安裝,則逃犯會覆蓋它。最好的部分是這讓你的'statusline'選項整潔乾淨。

+0

虛擬函數應該包含'return'''我相信。否則,它返回將顯示的數字「0」。 – ZyX 2013-12-09 15:45:10

+0

@ZyX謝謝你,趕上。我添加了'return''。 – 2013-12-09 16:21:27