Экранирование " % " в Vim при обстреле, поэтому оно не расширено до имени файла?

скажем, у меня есть этот vimscript как " /tmp / example.ВИМ":

let g:input = "START; % END"
exec("! clear && echo " . shellescape(g:input))

если я открою этот файл и запущу его с :so %, выход будет

START; /tmp/example.vim END

потому что " % " расширяется до имени буфера. Я хочу, чтобы выход был

START; % END

Я могу использовать универсальный escape() метод, чтобы избежать процентов знаков, в частности. Это работает:

let g:input = "START; % END"
exec("! clear && echo " . escape(shellescape(g:input), "%"))

но это действительно лучший способ? Я уверен, что есть больше персонажей, которых я должен избежать. Есть конкретные функция Escape для этой цели? Или лучше раскошелиться?

3 ответов


для использования с :! команда, вам нужно передать необязательный до shellescape():

когда {special} аргумент присутствует, и он ненулевой Число или непустая строка (/non-zero-arg|), затем специальная такие элементы, как !, %, # и <cword> будет предшествовать обратная косая черта. Эта обратная косая черта будет удалена снова |:!| команда.

:exec("! clear && echo " . shellescape(g:input, 1))

вам нужно правильно избежать"%". Так и должно быть:

let g:input = "START; \% END"

это, кажется, делает это:

let g:input = "START; % END"
echo system("echo " . shellescape(g:input))

следует отметить, что я действительно не забочусь о выходе; я буду использовать это с silent в скрипта.