vim substitute () и expand () вызывает новое определение команды - PullRequest
1 голос
/ 13 сентября 2011

Я пытаюсь определить новую команду в vim, которая вызывает внешний скрипт с именем текущего файла, но слегка измененный. Вот как я определил команду:

:command MyNewCommand !/tmp/myscript.sh substitute(expand("%:p"), "-debug", "", 'g')

Другими словами, myscript.sh принимает один параметр, который является полным путем к файлу редактируемого файла, со строкой "-debug" в удаленном пути. Мое определение команды не работает, потому что вместо того, чтобы передавать путь, vim, кажется, пропускает всю строку целиком, начиная со слова «замена», до myscript.sh . Как мне определить команду, чтобы делать то, что я хочу? Спасибо:).

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

Измените определение команды следующим образом.

:command! MyNewCommand call system('/tmp/myscript.sh ' .
\   shellescape(substitute(expand('%:p'), '-debug', '', 'g')))

Чтобы увидеть вывод команды, замените call на echo.

2 голосов
/ 13 сентября 2011

Вы можете использовать решение, похожее на решение @ ib, но с !, которое покажет вам вывод команды оболочки (а также будет обрабатывать случай, когда expand('%:p') содержит символы новой строки (это может быть, если FS полностью POSIX-совместим))):

command MyNewCommand execute '!/tmp/myscript.sh' shellescape(substitute(expand('%:p'), '-debug', '', 'g'))
0 голосов
/ 23 июня 2015

Общий подход состоит в том, чтобы построить строку, а затем execute ее. Проблема в вашей команде в том, что substitute(expand(... не оценивается и передается как есть.

Так в общем примере

command MyNewCommand OldCommand expand("%:p")

следует преобразовать в

command MyNewCommand execute 'OldCommand '.expand("%:p")

Таким образом MyNewCommand просто вызовет execute с выражением 'OldCommand '.expand("%:p"). execute вычислит выражение и, следовательно, expand() будет оценено по имени файла и объединено в 'OldCommand ', что приведет к строке вида 'OldCommand myfilename'. Затем эта строка исполняется как команда Ex тем же execute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...