Экранирование " % " в 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"
echo system("echo " . shellescape(g:input))
следует отметить, что я действительно не забочусь о выходе; я буду использовать это с silent
в скрипта.