Делать это в preexec
было бы слишком поздно. К тому моменту код уже был разобран. Если вы измените его, его нужно будет снова проанализировать (и, возможно, zsh
потребуется запросить дополнительные строки для завершения кода).
Возможно, здесь вы можете сделать это в виджете accept-line
, то есть непосредственно перед тем, как редактор строки передаст строку парсеру оболочки:
accept-line() {
emulate -L zsh # default zsh behaviour locally
set -o extendedglob # with extendedglob for ## (= ERE +) below
BUFFER=${BUFFER##[[:blank:]]##} # remove leading blanks
# remove blanks after newlines in case a multiline buffer is accepted
# for instance after a safe-paste or a newline entered with <Alt+Ret>
BUFFER=${BUFFER//$'\n'[[:blank:]]##/$'\n'}
# call original accept-line
zle .$WIDGET
}
zle -N accept-line
псевдонимы не могут иметь аргументов, используйте функцию:
function SU { sudo $*; }