2012-09-27 21 views
6

la seguente è pezzo di script di Vim da un plugin vim:come capire questo script vim?

Devo dire che la sintassi di vim è un po 'strano:

  1. !exists("*s:SetVals"), perché il loro è uno Starmark prima s:?
  2. funzione !, perché c'è un! carattere?
  3. & iskeyword, è una variabile, se sì, dove è definita?
  4. cosa sono s: e g:, qual è la differenza tra loro?
  5. perché dovrebbe essere usato? come let &dictionary = g:pydiction_location, posso cambiarlo in &dictionary = g:pydiction_location?

se esiste! ("* 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

perché il tag 'python'? –

+0

@AshwiniChaudhary poiché python viene richiamato da questo script :) – hugemeow

+2

Potrebbe essere Ruby o Perl o Lua e non ha nulla a che fare con la tua domanda. – romainl

risposta

2

Vedi :help eval.txt. Descrive la maggior parte della sintassi di vimscript.

+0

come fai a sapere che questo file ha la maggior parte delle specifiche per lo script vim, c'è qualche strumento di buildin con il quale posso cercare su tutti i documenti di build di vim? – hugemeow

+2

@hugemeow Vedere ': h: helpgrep',': helpgrep' è il comando per la ricerca in tutti i file di documentazione. – ZyX

5

Posso rispondere ad alcuni di questi, ma inizierò con un commento generale ispirato alle vostre domande recenti.

Le risposte alla maggior parte delle vostre domande sono presentate in modo molto chiaro nella documentazione incredibilmente esauriente di Vim. Se sei seriamente intenzionato a usare Vim devi sapere come usarlo. Inizia con :help e leggi attentamente. Paga. Fidati di me.

È possibile trovare la risposta a tutte queste sottogruppi in :help expression.

  • !exists("*s:SetVals"), perché il loro è uno Starmark prima s:?

    Vedere :help exists().

  • function!, perché c'è un carattere !?

    Senza un punto esclamativo, Vim non sostituirà la definizione precedente se si re-source lo script.

  • &iskeyword, si tratta di una variabile, se sì, dove è definita?

    Ecco come si verifica il valore di un'opzione vim in uno script. Vedi :help iskeyword.

  • cosa sono s: e g:, qual è la differenza tra loro?

    Questi sono spazi dei nomi. Vedere :help internal-variables

  • perché let deve essere utilizzato? come ad esempio &dictionary = g:pydiction_location, è possibile modificarlo come &dictionary = g:pydiction_location?

    No, non è possibile, :let è come si definisce o si aggiorna una variabile. Ci si abitua.

19

1.!exists("*s:SetVals"), perché il loro è uno Starmark prima s :?

L'asterisco è una sintassi speciale per la funzione esistente e significa che stiamo verificando se esiste una funzione esistente denominata SetVals. L'opzione iskeyword può essere verificato con exists("&iskeyword") e il comando echo ex con exists(":echo")

Vedere :h exists(

2.function!, perché c'è un! carattere?

Il punto esclamativo indica che la funzione deve essere sostituita se esiste già.

Vedi :h user-functions

3.&iskeyword, è presente una variabile, in caso affermativo, in cui è definito?

Questa è un'opzione vim. È possibile controllare se è impostato con :set iskeyword?

4. ciò che è s: e g:, qual è la differenza tra loro?

Questi definiscono l'ambito del seguente simbolo. s: significa che il simbolo è locale allo script, mentre g: significa che il simbolo sarà globale.

Vedi :h internal-variables e per s: vedere :h script-variable

5. perché dovrebbe essere usato let? ad esempio let &dictionary = g:pydiction_location, can i change it to be &dictionary = g:pydiction_location?

Vimscript è una delle lingue che richiedono le variabili da dichiarare con una parola chiave. Non penso che ci sia un modo per dichiarare le variabili più facilmente rispetto a let.

+1

4 .: "define the scope" è vero, "il simbolo può essere usato solo nello script corrente" è falso: c'è 's:' - il dizionario scope - e sei libero di passarlo da qualche altra parte per concedere l'accesso a script-variabili locali. – ZyX

+1

5 .: non è richiesto che le variabili vengano dichiarate con una parola chiave (esempio: 'call extend (g :, {'var': 'val'})' crea g: var variable, no 'let' è usato), esiste solo un tipo di istruzioni: un comando simile a '[intervallo] [comando] [!] [argomento [s]] [commento]' (tutti gli elementi sono facoltativi, alcuni comandi richiedono l'assenza di intervallo, botto , argomenti o non supportano commenti prendendoli come parte degli argomenti, range senza comando è "vai all'ultima riga nell'intervallo"), non c'è nessuna istruzione "assignment" che OP sta chiedendo in quanto non conforme questa sintassi. – ZyX

+0

Grazie ZyX. Ho modificato la risposta per correggere gli errori. –

Problemi correlati