Экранирование командных аргументов оболочки в Vim - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь полностью понять следующую команду в Vim:

:exe "grep -R " . shellescape(expand("<cWORD>")) . " ."<cr>

Я получил использование функции expand (принудительно развернуть в текущую строку, прежде чем она получитпередается в шеллскейп) и самой команде shellescape (со страницы справки Vim: Escape {string} для использования в качестве аргумента команды оболочки).

Что я не понимаю, из самой справки,заключается в том, что используются точки, одна до и одна после команды shellescape .

Снова обеим точкам предшествует пустой пробел.И если я использую:

:exe "grep -R "shellescape(expand("<cWORD>"))" ."<cr>

, которая является той же командой без этих точек, я (очевидно) получаю тот же результат.

Кто-нибудь может дать подробное объяснение?

Спасибо

1 Ответ

0 голосов
/ 26 ноября 2018

:help :execute уже объясняет это.

Как видно из синтаксиса :exe[cute] {expr1} .., он принимает несколько аргументов.

Несколько аргументовсцепленный, с пробелом между ними.Чтобы избежать лишних пробелов, используйте "."оператор для конкатенации строк в один аргумент.

:help expr-. объясняет, что оператор для конкатенации строк в Vimscript имеет вид . (не +, как во многих других языках;в Vimscript это исключительно для добавления чисел или списков).Пустое пространство вокруг него является необязательным, но часто предоставляется для лучшей читаемости.

В итоге, если вам нужно объединить строки с пробелами, вы можете использовать . и включить пространство внутри одной из строк,или передать отдельные аргументы в :execute и позволить ему неявно добавлять пробелы, или смешать оба подхода в рамках одной команды (удобочитаемость должна быть здесь первым приоритетом).

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