Une meilleure façon de lire une ligne d'entrée utilisateur en zsh? (par exemple avec zle?)

11

readPour une raison quelconque, Zsh fait écho ^Mà celui de les accepter comme <Enter>touches. (Si -dest défini, alors ils sont reconnus comme <Enter>des, mais toujours en écho.) Il ne prend pas en charge les bases comme la touche de retour arrière.

Je peux contourner cela en piratant / en cours d'exécution 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

mais je me demande s'il y a une façon plus propre.

Nicholas Tung
la source
Impossible de confirmer une nouvelle zshinstallation 4.3.10; % read afonctionne bien ici.
user1686
Ceci utilise iterm sur OS X; readfonctionne sur les machines Linux.
Nicholas Tung

Réponses:

19

Pour saisir une ligne de texte confortablement sous zsh, utilisez vared. Utiliser varedau lieu d' readinvoquer zle , ce qui équivaut à passer -een bash pour appeler readline.

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

Le comportement que vous décrivez avec plain readressemble à un terminal mal configuré plutôt qu'à un problème de shell. Exécutez stty -apour afficher les paramètres de votre terminal et assurez-vous qu'il eolest défini sur ^Met eraseest défini sur ce que votre Backspaceclé envoie. Selon le système d'exploitation et la façon dont il est configuré et sur le terminal, Backspaceenvoie soit ^Hou ^?. Le paramètre de retour arrière se passe généralement mal en raison d'un fichier de configuration qui essaie de le définir manuellement, donc la première chose que vous devez faire est de suivre et de supprimer une telle mauvaise configuration. Si vous n'en trouvez aucun, passez en revue les paramètres de votre émulateur de terminal pour vérifier qu'il n'est pas défini dans un mode de compatibilité historique. Si tout le reste échoue, ajoutez quelque chose comme ceci à votre ~/.zshrc:

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi
Gilles 'SO- arrête d'être méchant'
la source
1
vared -p 'Que voudriez-vous faire?:' -c tmp
zzapper
Trop cool! Je ne connaissais pas la fonction varedintégrée. Il s'avère zshzleque la page de manuel vaut au moins le coup d'œil.
ratijas