Isso pode ser feito fazendo coisas horríveis com accept-line :
function _accept-line() {
if [[ $BUFFER == "." ]]; then
BUFFER="source ~/.zshrc"
fi
zle .accept-line
}
zle -N accept-line _accept-line
Gostaria de pesquisar meu ~/.zshrc executando . sem argumentos. Então isso:
$ .
deve fazer isso:
$ . ~/.zshrc
Gostaria que a funcionalidade normal de . permanecesse inalterada. A única diferença deve ser quando . é invocado sem argumentos.
Isso é possível?
Eu tentei algumas abordagens diferentes. Aqui está um deles:
dot_zshrc_or_args() {
if [[ $# == 0 ]]; then
\. ~/.zshrc
else
filename=$1
shift
\. $filename $@
fi
}
alias .=dot_zshrc_or_args
Aqui está um exemplo mostrando por que não funciona:
$ echo 'echo $#' > count_args.sh
$ delegate() { . ./count_args.sh }
$ delegate foo bar baz
O último comando deve ecoar 3 , mas ecoa 0 se o alias acima para . tiver sido definido.
O problema fundamental parece ser que . é tratado especialmente pelo shell, permitindo que o script que ele invoca tenha acesso a todas as variáveis locais, incluindo $1 , $2 e assim por diante. Então, se eu tentar envolver . em outra função, vou perder esse comportamento (como no exemplo acima).
As duas abordagens em que eu estava pensando eram:
. tenha apenas um alias no shell interativo, ao contrário de quando é executado a partir de outra função. Eu não consigo fazer isso funcionar, não importa o que eu tente. É possível? (Se não, quais são as alternativas mais próximas que eu poderia usar? Meu objetivo final é poder rapidamente obter meu ~/.zshrc de um shell, de preferência de maneira intuitiva e fácil de lembrar.)
Escreva um function para . que chama o . incorporado conforme apropriado. Além disso, == está incorreto para comparações numéricas de shell ( test é estranho assim e precisa de -eq ou -ne ).
function . {
if [[ $# -eq 0 ]]; then
builtin . ~/.zshrc
else
builtin . "$@"
fi
}