Quando é necessário incluir 'emulate -LR zsh' em uma função invocada por um widget zsh?

1

Eu incluí no meu ~/.zshrc o seguinte código:

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

... que eu encontrei em uma resposta para a pergunta Lembre-se de um comando meio digitado enquanto eu verifico algo .

Funciona, mas originalmente o código continha esta afirmação:

emulate -LR zsh

Procurei o comando emulate dentro de man zshbuiltins para entender as opções -L e -R .

Parece que emulate -R zsh redefine todas as opções para os valores padrão, que verifiquei com este comando:

vimdiff <(setopt) <(emulate -R zsh; setopt)

No entanto, se eu executar emulate -R zsh em um shell interativo, ele redefinirá as opções definitivamente, portanto, suponho que seja onde o sinalizador -L seja necessário:
para tornar os novos valores das opções locais para a função atual (se houver).

Também parece implicar que as opções podem ter um valor local, além de um global, e que, no caso de um conflito, o local tem prioridade.

Portanto, emulate -LR zsh é usado para recriar um ambiente local com valores padrão e previsíveis para as opções, nas quais o autor de um widget não precisa se perguntar quais serão as opções quando sua função for invocada, ou para salvar (no início da função), em seguida, restaurar (no final) todas as opções que podem alterar o comportamento desejado do widget.

Eu não copiei a linha porque parece funcionar sem ela. No entanto, gostaria de saber se meu entendimento desse comando está correto e se alguém poderia fornecer um ou dois exemplos simples, em que emulate -LR zsh é necessário para evitar efeitos colaterais.

    
por user547381 22.06.2017 / 19:43

1 resposta

1

Seu entendimento está correto.

emulate -R zsh redefine todas as opções para os padrões zsh. O -L flag torna este local na função de contenção (e geralmente torna todas as mudanças de opções locais para a função).

Colocar emulate -LR zsh perto do início de uma definição de função é uma boa higiene quando a função é usada em contextos onde as opções são potencialmente diferentes, especialmente em shells interativos.

Nesta instância específica, emulate -LR zsh não é necessário, porque o código não é afetado por nenhuma opção. Mas não faz mal nenhum.

Aqui estão alguns exemplos de opções que um usuário pode definir em seu arquivo de inicialização, ou que podem ser desativadas pelo código circundante que chama a função, e que pode quebrar uma função:

  • Desativar bare_glob_qual interrompe o uso de qualificadores glob.
  • Desativando care_glob ou case_match faria com que alguns padrões não dessem distinção entre maiúsculas e minúsculas, mesmo que isso não fizesse sentido na função.
  • null_glob e csh_null_glob afeta o comportamento de padrões glob que não correspondem a nenhum arquivo.
  • numeric_glob_sort pode interromper uma função que exige que os padrões sejam expandidos em ordem lexicográfica.
  • err_exit e unset pode causar erros onde o código da função pretendia o comportamento padrão (ignorar o status de um comando, tratar uma variável indefinida como vazia).
por 23.06.2017 / 04:24

Tags