Melhor maneira de ler uma linha de entrada do usuário em zsh? (por exemplo, com zle?)

7

O read de Zsh, por algum motivo, está ecoando ^M em vez de aceitá-lo como <Enter> de pressionamentos de tecla. (Se -d for definido, eles serão reconhecidos como <Enter> , mas ainda serão reproduzidos.) Ele também não suporta os princípios básicos, como a tecla de retrocesso.

Eu posso contornar isso hackeando / executando bash

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

mas eu estou querendo saber se há uma maneira mais limpa.

    
por Nicholas Tung 22.05.2012 / 23:58

1 resposta

15

Para inserir uma linha de texto confortavelmente em zsh, use vared . Usar vared em vez de read invoca zle , que é o equivalente a passar -e no bash para invocar readline.

vared -p 'What would you like to do?: ' -c tmp

O comportamento que você descreve com read simples parece um terminal configurado incorretamente, em vez de um problema de shell. Execute stty -a para mostrar suas configurações de terminal e certifique-se de que eol esteja definido como ^M e erase esteja definido com o que sua chave Backspace envia. Dependendo do sistema operacional e de como ele está configurado e no terminal, Backspace envia ^H ou ^? . A configuração de backspace geralmente dá errado por causa de algum arquivo de configuração que tenta configurá-lo manualmente, então a primeira coisa que você deve fazer é rastrear e remover qualquer configuração incorreta. Se você não encontrar nenhum, revise as configurações do emulador de terminal para verificar se ele não está definido em algum modo de compatibilidade histórica. Se tudo mais falhar, adicione algo assim ao seu ~/.zshrc :

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi
    
por 23.05.2012 / 23:05

Tags