У меня есть вложенные псевдонимы, и я хочу разрешить все из них перед выполнением команды. Как мне это сделать?
Если есть функция, которая не привязана ни к каким клавишам, то M-x foobar
это тоже хорошо для меня. Я мог бы даже использовать внешнюю команду ( type
, command
, which
, что угодно). Я попробовал все из потока Почему бы не использовать "который"? Что использовать тогда? но ничего не работает.
C-x a
расширяет псевдоним под курсором (при условии, что вы используете систему завершения)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
. Это полезно, но, тем не менее, очень жаль, что в bash можно расширить всю строку, а в zsh - нет._expand_alias
до тех пор, пока буфер редактирования больше не изменится.Ответы:
Обратите внимание, что Ctrl-Alt-E in
bash
не только расширяет псевдонимы. Он также расширяет переменные, подстановку команд (!), Подстановку процессов (!), Арифметическое расширение и удаляет кавычки (он не выполняет генерацию имени файла (глобализация) или расширение тильды).Не всегда удается расширить псевдонимы. Поэтому, несмотря на то, что он имеет свои применения, важно понимать, что его результат потенциально меняет смысл командной строки, имеет побочные эффекты и потенциально опасен.
Например, в:
Если я нажму
M-C-E
здесь, это даст мне:Что дает мне совершенно другую командную строку в целом (и представьте, что случилось бы, если бы я имел
rm -rf *
вместоpwd
вышеупомянутого) и не расширяетfoo
псевдоним.С учетом записи
zsh
Жиля о псевдонимах, расширенных внутри функций, вы можете сделать:Это расширит псевдонимы только в том случае, если текущая командная строка синтаксически допустима (поэтому она выполняет функцию проверки синтаксиса).
В отличие от
bash
MCE, он также полностью разрешает псевдонимы. Например, если у вас есть:Будет расширен до:
Обратите внимание, что он также канонизирует синтаксис, например:
будет изменено на:
источник
alias ls='ls --color'
и введитеC-x a
болееls
, я получаю:\ls --color
(чтобы новоеls
не было неправильно истолковано как псевдоним). Но с твоейexpand-aliases
я получаюls --color
, делая результат неоднозначным.bash
эквивалент). Но это правда, что если вы запустите команду после этого, вы получите еще один раунд раскрытия псевдонимов (например, вbash
), поэтому в идеале вам нужно временно отключить раскрытие псевдонимов, например, обернуть его в a(){ setopt localoptions noexpandalias; ...; }
. Обратите внимание, что вы можете сказать, что_expand_alias
он глючит, так как он расширяет псевдоним при запуске\ls
._expand_alias
также легко обмануть, какalias 'foo=repeat 3 foo'
илиalias ls='ls --color'; alias '\ls=echo fooled'
. Здесь нет идеального решения._expand_alias
касаетсяalias 'foo=repeat 3 foo'
, я бы расценил отсутствующий обратный слеш как ошибку. Иalias '\ls=echo fooled'
не должно быть позволено; здесь я предпочитаю Баш, который говорит:bash: alias: '\ls': invalid alias name
.bash
. Если вам не нравятся псевдонимы с обратной косой чертой, не используйте их, но почему вы хотите, чтобы оболочка отклоняла их? В то время как псевдонимы являются заменой функций бедного человека в csh (откуда они берутся), в оболочках, подобных Bourne, они являются хакерами для выполнения трюков, которые не могут быть выполнены с помощью функций, некоторой формы раскрытия макросов, которая перехватывается на ранних этапах синтаксического анализатора оболочки. Я не вижу смысла ограничивать то, что он может сделать.Если вы введете командную строку в определение функции, а затем распечатаете функцию, псевдонимы будут расширены. Вы также получите нормализованный пробел.
Чтобы поместить все это в интерактивную команду, вы можете создать zle-виджет. Вы можете определить функцию напрямую, вставив ее код в запись в
functions
массиве; Вы получите эффект нормализации, когда будете читать обратно.Вы получаете тот же эффект нормализации в
preexec
крючке . Псевдонимы также раскрываются во время автозагрузки функции (autoload -U
обычно используется, чтобы избежать расширения псевдонимов).Функция
_expand_alias
завершения расширяет слово под курсором, если это псевдоним. Он используетaliases
массив . Это не рекурсивно. Вы можете реализовать более общий расширитель псевдонимов, используя егоaliases
, но это несколько сложно, потому что выяснение местоположений, в которых раскрываются псевдонимы, тесно связано с синтаксисом оболочки.источник
autoload -U
просто, потому что документация zsh рекомендует это, но я никогда не понимал, что на-U
самом деле делал, пока не прочитал это :). Кроме того, для тех , кто заинтересован, можно ссылаться на _expand_alias работать непосредственно введя свой псевдоним в командной строке, поражая<Esc>
,x
для запуска минибуфер, затем набрав_expand_alias<Enter>
Если у вас много вложенных необычных псевдонимов, и вы не уверены, что на самом деле делает с ними zsh и в каком порядке они передаются в команду, вы всегда можете запустить zsh с
-x
параметром. Это выведет команды и аргументы по мере их выполнения.Однако имейте в виду, что эта опция предназначена скорее для целей отладки, поэтому она печатает много бесполезных вещей сразу после
zsh -x
вызова (в основном, каждая функция / виджет / плагин вашего .zshrc), и во время выполнения команды она также может быть многословной, особенно если вы определилиpreexec
иprecmd
подключите.Следует также отметить, что он печатает только те команды, которые в конечном итоге выполняются, а отдельные команды печатаются отдельно, поэтому после
Ты увидишь
источник