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
}