2013-06-18 55 views
1

在設置statusline時,可以使用表達式(例如函數調用)而不是文字值的兩種方式,似乎都不允許使用靜態函數。Vim狀態行:表達式不接受靜態函數

  1. set statusline=%{s:MyFunc()}
  2. set statusline=%!s:MyFunc()

兩者產生以下錯誤對。

  • E120: Using <SID> not in a script context: <SID>:MyFunc
  • E15: Invalid expression: <SID>:MyFunc()

s:MyFunc()在我試圖設置statusline同一文件中定義。

當我將全局函數(s:MyFunc替換爲文件中無處不在的MyFunc)時,沒有錯誤,並且statusline設置正確。因此,這個問題。

請注意,替換s:<SID>:沒有幫助。

回答

1

唐克魯克香克的解釋是正確的。下面是一些可能的解決方案是不是定義一個全局函數更好(雖然這工作也一樣,特別是如果你前面加上腳本的名後以使其唯一):

  1. 定義和使用自動加載功能來本地化功能;這也可以在plugin/myscript.vim中完成,不一定在autoload/myscript.vim。例如。 function myscript#MyStatuslineFunc()
  2. 使用腳本中的本地函數,你需要做的s:翻譯成實際<SNR>NNN_FuncName(當你使用<SID>什麼映射自動完成)自己:
function! s:function(name) 
    return substitute(a:name, '^s:', matchstr(expand('<sfile>'), '<SNR>\d\+_\zefunction$'),'') 
endfunction 
let &statusline = '%!' . s:function('s:MyFunc()') 
+0

感謝。我只是試着'執行'set statusline ='。 s:MyFunc()',它工作!似乎是他們所有人的最簡單的解決方案。 :) – Anant

+0

這很好,如果你不需要':MyFunc()'評估所有的時間,只有一次的定義。這是語義上的巨大差異! –

+0

你是對的!在我的情況下,':MyFunc()'總是返回相同的字符串,所以它應該沒問題。但我無法理解你的意思是「一直評估」。例如,是不是'set statusline =%!MyFunc()'也被評估過一次? – Anant

2

statusline不在腳本的上下文中進行評估,因此嘗試使用本地腳本中的函數s:將始終失敗。

s:意味着給定的符號對於腳本來說是本地的,而不是靜態的,因此您需要使用另一種識別函數的方法。有關可能的符號修飾符的列表,請參閱:help E738

這一點,因爲你在問題中已經指出,確實會工作:

function MyFunc() 
    return "Hello World" 
endfunction 

set statusline=%!MyFunc()