Faça com que “.” e “source” padrão seja ~ / .zshrc

3

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:

  1. use um alias em vez de uma função
  2. faz com que . 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.)

    
por Radon Rosborough 29.11.2016 / 22:15

2 respostas

6

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
    
por 30.11.2016 / 00:56
1

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
}
    
por 29.11.2016 / 23:02

Tags