Завершение вкладки файла zsh :путь, которому предшествует не -символ пробела

Проблема в том, что после нахождения :first-var ||в оставшемся тексте не осталось || :second-var. grep -oможет печатать только те части строк, которые не перекрываются.

Вы могли бы сделать:

$ perl -lne 'print for /:\S+\s+\|\|/g, /\|\|\s+:\S+/g' file
:first-var ||
|| :second-var

(со всеми :var ||напечатанными перед || :varс ).

Или, если вам нужна только часть :var, с GNU grepс поддержкой PCRE:

$ grep -Po ':\S+(?=\s+\|\|)|\|\|\s+\K:\S+' file
:first-var
:second-var

То же, что и:

perl -lne 'print for /:\S+(?=\s+\|\|)|\|\|\s+\K:\S+/g'

Теперь, если вы хотите извлечь :fooи :barв строку, которая всегда имеет форму anything :foo || :bar, вы можете сделать это стандартно с помощью:

s='[[:space:]]\{1,\}' S='[^[:space:]]\{1,\}'
sed -n "/\(:$S\}\)$s\{1,\}||$s\(:$S\).*/{
  s//\
\1\
\2/
  s/.*\n\(.*\n\)/\1/p
}'
2
22.07.2020, 02:02
1 ответ
setopt magic_equal_subst

Это работает как со старым -стилем, так и с новым -стилем, т. е. с завершением compinitили без него.

Завершение имен файлов после =является неясным и недокументированным побочным эффектом опции magic_equal_subst. Задокументированный эффект этой опции заключается в том, чтобы включить расширение имени файла после =.

В большинстве случаев, если вы вообще заметили эффект от этой опции, это желаемый эффект, т.е.

somecommand --option=~/file

передает путь в вашем домашнем каталоге к somecommand, а не путь в каталоге с именем ~. Однако это также имеет обычно нежелательный эффект, заключающийся в том, что аргумент ==запускает расширение имени файла :

.
somecommand foo==bar

проходит foo=/bin/bar, если команда barнаходится в $PATHпо адресу /bin/bar. Если вы хотите буквально передать ==команде, по крайней мере один из знаков равенства должен быть заключен в кавычки, например.

somecommand foo=\=bar
somecommand foo\==bar

В новой системе завершения в стиле -это обрабатывается внутри_default. Если вы хотите получить завершение имени файла после =без включения magic_equal_subst, вам нужно переопределить или обернуть _default, чтобы получить тот же эффект. Например:

autoload +X -U _default
functions[_default]="setopt local_options magic_equal_subst; $functions[_default]"
5
18.03.2021, 23:18

Теги

Похожие вопросы