execute()
- современная альтернатива :redir
;он захватывает весь вывод выполненной команды.Давайте посмотрим поближе:
:let s = execute(":! echo dani") | echo strtrans(s)
^@:! echo dani^M^@dani^M^@
Как вы можете видеть, она захватывает всю команду и ее результат.Если вы используете обычный :echo
, символы новой строки и ^@
затеняют полный вывод (вы увидите это лучше с :echomsg
, который меньше интерпретирует специальные символы).
Я думаю, что вы на самом делеwant это просто вывод выполненной внешней команды (здесь: echo
).Вы можете использовать system()
вместо :!
для этого:
:let s = system('echo dani') | echo strtrans(s)
dani^@
Этот завершающий символ новой строки обычно удаляется следующим образом:
:let s = substitute(system('echo dani'), '\n\+$', '', '') | echo strtrans(s)
dani