2012-09-27 49 views
6

下面是一個Vim插件一塊VIM腳本:如何理解這個vim腳本?

我應該說,vim的語法是有點奇怪:

  1. !exists("*s:SetVals"),爲什麼他們是s:前STARMARK?
  2. 功能!,爲什麼有一個!字符?
  3. & iskeyword,這是一個變量,如果是,它在哪裏定義?
  4. 什麼是s:g:,它們之間有什麼區別?
  5. 爲什麼要使用?如let &dictionary = g:pydiction_location,我可以將其更改爲&dictionary = g:pydiction_location

如果存在!( 「* S:SetVals」)

function! s:SetVals() 
     " Save and change any config values we need. 

     " Temporarily change isk to treat periods and opening 
     " parenthesis as part of a keyword -- so we can complete 
     " python modules and functions: 
     let s:pydiction_save_isk = &iskeyword 
     setlocal iskeyword +=.,(

     " Save any current dictionaries the user has set: 
     let s:pydiction_save_dictions = &dictionary 
     " Temporarily use only pydiction's dictionary: 
     let &dictionary = g:pydiction_location 

     " Save the ins-completion options the user has set: 
     let s:pydiction_save_cot = &completeopt 
     " Have the completion menu show up for one or more matches: 
     let &completeopt = "menu,menuone" 

     " Set the popup menu height: 
     let s:pydiction_save_pumheight = &pumheight 
     if !exists('g:pydiction_menu_height') 
      let g:pydiction_menu_height = 15 
     endif 
     let &pumheight = g:pydiction_menu_height 

     return '' 
    endfunction  

ENDIF

+0

爲什麼'python'標籤? –

+0

@AshwiniChaudhary因爲python被這個腳本調用:) – hugemeow

+2

它可能是Ruby或Perl或Lua,它與你的問題無關。 – romainl

回答

2

:help eval.txt。它描述了大多數vimscript語法。

+0

你怎麼知道這個文件有大部分的vim腳本規範,是否有任何buildin工具可以搜索所有vim的buildin文檔? – hugemeow

+2

@hugemeow請參閱':h:helpgrep',':helpgrep'是搜索所有文檔文件的命令。 – ZyX

5

我可以回答一些這些問題,但我會從最近的問題啓發您的一般意見。

對於大多數問題的解答在Vim非常詳盡的文檔中非常清晰地闡述。如果你對使用Vim很認真,你必須知道如何使用它。從:help開始並仔細閱讀。它付錢。相信我。

你可以在:help expression找到所有這些子問題的答案。

  • !exists("*s:SetVals"),爲什麼他們是s:前STARMARK?

    請參閱:help exists()

  • function!,爲什麼有!字符?

    沒有感嘆號,如果您重新輸入腳本,Vim將不會替換先前的定義。

  • &iskeyword,這是一個變量,如果是,它在哪裏定義?

    這就是測試腳本中vim選項值的方法。見:help iskeyword

  • 什麼是s:g:,它們之間有什麼不同?

    這些是命名空間。見:help internal-variables

  • 爲什麼要用let?如讓&dictionary = g:pydiction_location,我可以將其更改爲&dictionary = g:pydiction_location

    不,你不能,:let是你如何定義或更新一個變量。習慣它。

19

!exists("*s:SetVals"),爲什麼他們是前 個STARMARK:?

星號是exists函數的特殊語法,它表示我們正在檢查是否存在一個名爲SetVals的現有函數。選項iskeyword可以用exists("&iskeyword")進行檢查和ex命令echoexists(":echo")

:h exists(

2.function!,爲什麼有!字符?

感嘆號表示如果該功能已存在,則該功能將被替換。

:h user-functions

&iskeyword,這是一個變量,如果是,它被定義?

這是一個vim選項。如果它被設置與:set iskeyword?

4.什麼是s:g:您可以檢查,它們之間有什麼區別呢?

這些定義了以下符號的範圍。 s:表示符號對於腳本是本地的,而g:表示符號將是全局的。

:h internal-variabless:看到:h script-variable

5.爲什麼let應該使用?如let &dictionary = g:pydiction_location, can i change it to be &dictionary = g:pydiction_location

Vimscript是需要使用關鍵字聲明變量的語言之一。我認爲沒有辦法比let更容易聲明變量。

+1

4 .:「定義範圍」爲真,「只能在當前腳本中使用符號」爲false:存在': - 範圍字典 - 並且您可以自由將其傳遞到其他位置以授予訪問權限腳本局部變量。 – ZyX

+1

5 .:不需要用關鍵字來聲明變量(例如:'call extend(g:,{'var':'val'})'創建g:var變量,不使用'let' ),只有一種類型的語句:類似'[range] [command] [!] [argument [s]] [comment]'的命令'(所有元素都是可選的,某些命令需要沒有範圍, ,參數或不支持將它們作爲參數的一部分的註釋,範圍沒有命令是「去到範圍的最後一行」),沒有「分配」語句OP所要求的,因爲它不符合這種語法。 – ZyX

+0

謝謝ZyX。我修改了答案以糾正錯誤。 –