2013-08-12 12 views
20

W vimscript, jaka jest różnica między call i execute? W jakich scenariuszach/przypadkach użycia powinienem użyć jednego z drugim?vimscript call vs. wykonać

(Zastrzeżenie, jestem świadomy rozległej pomocy online dostępnej w vim - szukam zwięzłej odpowiedzi na to konkretne pytanie).

Odpowiedz

12

Z doświadczeń pisać własne pluginy i odczytanie kodu innymi:

call: Używany wywoływać funkcje:

function! s:foo(id) 
    execute 'buffer' a:id 
endfunction 

let target_id = 1 
call foo(target_id) 

: wykonać: Służy do dwóch rzeczy:

1) Skonstruuj ciąg znaków i oceń go. Jest to często wykorzystywane do przekazywania argumentów do poleceń:

execute 'source' fnameescape('l:path') 

2) ocenić wartość zwracaną przez funkcję (prawdopodobnie ten sam):

function! s:bar(id) 
    return 'buffer ' . a:id 
endfunction 

let target_id = 1 
execute s:bar(target_id) 
17
  • :call: Wywołanie funkcji.
  • :exec: Wykonuje ciąg jako polecenie Ex. Ma podobny sens eval (w javascript, python, etc)

na przykład:

function! Hello() 
    echo "hello, world" 
endfunction 

call Hello() 

exec "call Hello()" 
+0

W jakiej scenariusze chciałbym użyć jednego vs. innym? Lub jest wykonywane tylko wtedy, gdy chcesz programowo skomponować polecenie do wykonania? – noahlz

+0

Możesz budować polecenie dynamicznie i "exec" to. Możesz jednak wywoływać funkcję tylko według nazwy. – kev

+2

Możesz chcieć pokazać przykład budowania polecenia ex przy użyciu exec i łączenia ciągów. – FDinoff

0

Zobacz Switch to last-active tab in VIM

np

: exe " tabn ".g: lasttab

przypadku g: lasttab jest globalną zmienną przechowywać bieżący numer kartę i liczba jest łączony z „tabnext”, aby przejść na przykład z liczbą zakładkę 3 (jeśli G: lasttab np zawiera na przykład "3")

Cały ciąg> "tabn" .g: lasttab < jest oceniany i wykonywany za pomocą polecenia exec VIM.

HTH?

2

krótka odpowiedź

Można zobaczyć call jako pierwsza oceń wyrażenie, a następnie odrzuć wynik. Więc tylko efekty uboczne są przydatne.

Długa odpowiedź

Definiowanie:

function! Foo() 
    echo 'echoed' 
    return 'returned' 
endfunction 

Call:

:call Foo() 

wyjściowa:

echoed 

Execute:

:execute Foo() 

wyjściowa:

echoed 
EXXX: Not an editor command: returned 

Execute:

:silent let foo = Foo() 
:echo foo 

wyjściowa:

returned