2013-08-12 2 views
20

В vimscript, в чем разница между call и execute? В каких сценариях/случаях использования я должен использовать один против другого?vimscript call vs. execute

(Отказ от ответственности, я знаю обширную интерактивную справку, доступную в vim - я ищу краткий ответ на этот конкретный вопрос).

ответ

12

Из опыта написания своих собственных плагинов и читать код других:

: вызов: Используется для вызова функции:

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

let target_id = 1 
call foo(target_id) 

: выполнить: Используется для двух вещей:

1) Построить строку и оценить ее. Это часто используется, чтобы передать аргументы команд:

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

2) Оцените возвращаемое значение функции (возможно, тот же самый):

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

let target_id = 1 
execute s:bar(target_id) 
17
  • :call: Вызов функции.
  • :exec: Выполняет строку как команду Ex. Он имеет аналогичный смысл evaljavascript, python и т.д.)

Например:

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

call Hello() 

exec "call Hello()" 
+0

В каких сценариях я хотел бы использовать один против другого? Или выполняется только тогда, когда вам необходимо программно составить команду для выполнения? – noahlz

+0

Вы можете создать команду динамически и 'exec' it. Однако вы можете вызвать функцию только по имени. – kev

+2

Возможно, вы захотите показать пример построения команды ex с использованием конкатенации exec и string. – FDinoff

0

См Switch to last-active tab in VIM

, например

: EXE " tabn ".g: lasttab

Где г: lasttab является глобальной переменной для сохранения текущей вкладки номер и это число объединяется с «tabnext», чтобы переключиться на вкладку например номер 3 (Если г: например, lasttab содержит '3', например)

Эта целая строка> "tabn" .g: lasttab < оценивается и выполняется командой VIM's exec.

HTH?

2

Короткий ответ

Вы можете увидеть call, как сначала оценить выражение, а затем отбросить результат. Поэтому полезны только побочные эффекты.

Длинный ответ

Определить:

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

Вызов:

:call Foo() 

Выход:

echoed 

Execute:

:execute Foo() 

Выход:

echoed 
EXXX: Not an editor command: returned 

Execute:

:silent let foo = Foo() 
:echo foo 

Выход:

returned 
Смежные вопросы