2012-09-27 19 views
6

po to kawałek skryptu vim z plugin vim:jak zrozumieć ten skrypt vima?

powinienem powiedzieć, że Vim składnia jest nieco dziwne:

  1. !exists("*s:SetVals"), dlaczego ich jest Starmark przed s:?
  2. funkcja !, dlaczego istnieje! postać?
  3. & iskeyword, czy jest to zmienna, jeśli tak, gdzie jest zdefiniowana?
  4. co to jest s: i g:, jaka jest różnica między nimi?
  5. dlaczego powinno się używać? na przykład let &dictionary = g:pydiction_location, czy mogę go zmienić na &dictionary = g:pydiction_location?

jeśli istnieje! ("* 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

dlaczego tag 'python'? –

+0

@AshwiniChaudhary, ponieważ python jest wywoływany przez ten skrypt :) – hugemeow

+2

Może to być Ruby lub Perl lub Lua i nie ma to nic wspólnego z twoim pytaniem. – romainl

Odpowiedz

2

Zobacz :help eval.txt. Opisuje większość składni vimscript.

+0

Skąd wiadomo, że ten plik zawiera większość specyfikacji skryptu vim, czy istnieje jakieś narzędzie do budowania, za pomocą którego mogę przeszukiwać wszystkie dokumenty budujące vim? – hugemeow

+2

@hugemeow Zobacz ': h: helpgrep',': helpgrep' to polecenie do przeszukiwania wszystkich plików dokumentacji. – ZyX

5

Mogę odpowiedzieć na kilka z nich, ale zacznę od ogólnego komentarza zainspirowanego twoimi ostatnimi pytaniami.

Odpowiedzi na większość twoich pytań są jasno przedstawione w niezwykle wyczerpującej dokumentacji Vima. Jeśli poważnie myślisz o używaniu Vima, musisz wiedzieć, jak go używać. Zacznij od :help i przeczytaj uważnie. Opłaca się. Zaufaj mi.

Odpowiedź na te pytania można znaleźć pod numerem :help expression.

  • !exists("*s:SetVals"), dlaczego ich jest Starmark przed s:?

    Zobacz :help exists().

  • function!, dlaczego istnieje znak !?

    Bez wykrzyknika Vim nie zastąpi poprzedniej definicji, jeśli ponownie zeskanuj skrypt.

  • &iskeyword, czy jest to zmienna, jeśli tak, gdzie jest zdefiniowana?

    W ten sposób testujemy wartość opcji vim w skrypcie. Zobacz :help iskeyword.

  • co to jest s: i g:, jaka jest różnica między nimi?

    To są przestrzenie nazw. Patrz: :help internal-variables

  • dlaczego należy używać let? na przykład &dictionary = g:pydiction_location, czy mogę go zmienić na &dictionary = g:pydiction_location?

    Nie możesz, :let to sposób definiowania lub aktualizowania zmiennej. Przyzwyczaić się do tego.

19

1.!exists("*s:SetVals"), dlaczego ich jest Starmark przed s :?

Gwiazdka to specjalna składnia funkcji istniejącej, co oznacza, że ​​sprawdzamy, czy istnieje istniejąca funkcja o nazwie SetVals. Opcja iskeyword mogłyby być sprawdzane z exists("&iskeyword") a polecenie echo ex z exists(":echo")

Zobacz :h exists(

2.function!, dlaczego tam jest! postać?

Wykrzyknik oznacza, że ​​funkcja ma zostać zastąpiona, jeśli już istnieje.

Zobacz :h user-functions

3.&iskeyword, jest to zmienna, jeśli tak, to gdzie jest zdefiniowana?

To jest opcja vim. Można sprawdzić, czy jest on ustawiony z :set iskeyword?

4. co jest s: i g:, jaka jest różnica między nimi?

Określają one zakres następującego symbolu. s: oznacza, że ​​symbol jest lokalny dla skryptu, a g: oznacza, że ​​symbol będzie globalny.

Zobacz :h internal-variables i s: zobaczyć :h script-variable

5. dlaczego należy stosować let? na przykład let &dictionary = g:pydiction_location, can i change it to be &dictionary = g:pydiction_location?

Vimscript jest jednym z języków, które wymagają podania zmiennych za pomocą słowa kluczowego. Nie sądzę, że istnieje sposób na łatwiejsze deklarowanie zmiennych niż w przypadku let.

+1

4 .: "Zdefiniuj zakres" jest prawdziwe, "symbol może być użyty tylko w bieżącym skrypcie" to fałsz: jest 's:' - słownik zakresu - i możesz go przekazać gdzieś indziej, aby przyznać dostęp do zmienne lokalne skryptu. – ZyX

+1

5 .: nie ma wymogu deklarowania zmiennych za pomocą słowa kluczowego (przykład: 'call extend (g :, {'var': 'val'})' tworzy zmienną g: var, nie używa 'let'), jest tylko jeden typ instrukcji: polecenie wyglądające jak: [zakres] [polecenie] [!] [argument [s]] [komentarz] '(wszystkie elementy są opcjonalne, niektóre polecenia wymagają braku zasięgu, huk , argumenty lub nie obsługują komentarzy przyjmujących je jako część argumentów, zakres bez polecenia "idź do ostatniego wiersza w zakresie"), nie ma instrukcji "przypisania", o którą prosi OP, ponieważ nie spełnia tej składni. – ZyX

+0

Dzięki ZyX. Zmieniłem odpowiedź, aby poprawić błędy. –