Vimscript call vs. execute
В vimscript, в чем разница между call
и execute
? В каких сценариях/случаях использования я должен использовать один или другой?
(Отказ от ответственности, я знаю обширную онлайн-помощь, доступную в vim - я ищу краткий ответ на этот конкретный вопрос).
Ответы
Ответ 1
Из опыта написания моих собственных плагинов и чтения кода других:
: вызов: используется для вызова функций:
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)
Ответ 2
-
:call
: Вызов функции.
-
:exec
: Выполняет строку как команду Ex.
Он имеет аналогичный смысл eval
(в javascript
, python
и т.д.)
Например:
function! Hello()
echo "hello, world"
endfunction
call Hello()
exec "call Hello()"
Ответ 3
Короткий ответ
Вы можете увидеть 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
Ответ 4
См. Переключиться на последнюю активную вкладку в VIM
например
: exe "tabn".g: lasttab
Где
g: lasttab - глобальная переменная для хранения текущего номера табуляции
и это число объединяется с "tabnext" для переключения, например, на вкладку номер 3
(Если g: lasttab, например, содержит "3", например)
Эта целая строкa > "tabn".g: lasttab <
оценивается и выполняется командой VIM exec.
НТН?