Обратите внимание, что Ctrl-Alt-E in bash
не только расширяет псевдонимы. Он также расширяет переменные, подстановку команд (!), Подстановку процессов (!), Арифметическое расширение и удаляет кавычки (он не выполняет генерацию имени файла (глобализация) или расширение тильды).
Не всегда удается расширить псевдонимы. Поэтому, несмотря на то, что он имеет свои применения, важно понимать, что его результат потенциально меняет смысл командной строки, имеет побочные эффекты и потенциально опасен.
Например, в:
$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done
Если я нажму M-C-E
здесь, это даст мне:
$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done
Что дает мне совершенно другую командную строку в целом (и представьте, что случилось бы, если бы я имел rm -rf *
вместо pwd
вышеупомянутого) и не расширяет foo
псевдоним.
С учетом записи zsh
Жиля о псевдонимах, расширенных внутри функций, вы можете сделать:
expand-aliases() {
unset 'functions[_expand-aliases]'
functions[_expand-aliases]=$BUFFER
(($+functions[_expand-aliases])) &&
BUFFER=${functions[_expand-aliases]#$'\t'} &&
CURSOR=$#BUFFER
}
zle -N expand-aliases
bindkey '\e^E' expand-aliases
Это расширит псевдонимы только в том случае, если текущая командная строка синтаксически допустима (поэтому она выполняет функцию проверки синтаксиса).
В отличие от bash
MCE, он также полностью разрешает псевдонимы. Например, если у вас есть:
$ alias ll='ls -l'; alias ls='ls --color'
$ ll
Будет расширен до:
$ ls --color -l
Обратите внимание, что он также канонизирует синтаксис, например:
$ for i (*) cmd $i; foo
будет изменено на:
$ for i in *
do
cmd $i
done
foo
C-x a
расширяет псевдоним под курсором (при условии, что вы используете систему завершения).