2017-09-19 5 views
10

Selon le haskeline documentation, en tapant CTRL + Y devrait apparaître l'entrée la plus récente de la kill-ring (par exemple la ligne que je viens de supprimer via CTRL + U). Je trouve qu'au lieu de cela, il suspend le REPL, comme si j'avais tapé CTRL + Z.Haskell: GHCi traite Ctrl-Y comme Ctrl-Z

Pour contourner ce problème maladroit, j'ai trouvé que taper CTRL +VCTRL +Y pops de l'anneau kill comme une plaine CTRL +Y est censé faire.

Est-ce un bug connu, ou quelque chose d'autre est en jeu? Puis-je le réparer? Je cours la version 8.0.2 de GHC.

Je ne sais pas si c'est important, mais je cours GHCi via la pile (par exemple stack ghci), et je brasse la pile installée (macOS).

+0

Je suis assez sûr que Stack n'est pas pertinent, mais vous devriez signaler la version GHC. – dfeuer

Répondre

4

Les terminaux Mac OS/ttys ont un concept de clé "dsusp" ou "suspend suspended", et Ctrl-Y est la touche habituelle assignée. Au niveau de TTY, lorsqu'un CTRL +Y est lu, il agit un peu comme CTRL +Z. La différence est que CTRL + Z provoque une suspension immédiate lorsqu'il est tapé; CTRL +Y provoque le Suspend lorsque le processus sous-jacent essaie de lire les caractères et le marqueur CTRL +Y apparaît dans le flux d'entrée.

(CTRL + V est généralement attribué à la touche "lnext", qui sautille le traitement terminal en faisant le prochain "littéral" clé, qui est la raison pour laquelle CTRL + VCtrl + Y fonctionne.)

Idéalement, GHCi vérifierait la fonctionnalité "dsusp" (elle n'existe pas sous Linux, par exemple) et la désactiverait si elle était détectée, mais il semblerait que ce ne soit pas le cas.

En attendant, vous pouvez désactiver votre touche "dsusp" en exécutant:

stty dsusp undef 

avant de lancer GHCi. Coller ceci dans votre ".bashrc" et/ou ".profile" est une bonne idée, puisque la fonctionnalité est en grande partie inutile.

+0

Parfait, merci! Je suis curieux de savoir pourquoi cela n'a jamais empêché Ctrl-Y Yank comportement dans Bash. Je suppose que quand je suis déjà dans le shell parent, cela n'a pas de sens de suspendre le travail actuel? – ivan

+1

Eh bien, Bash contient un code spécifique pour empêcher Ctrl-Y (ou Ctrl-Z) d'avoir un effet à l'invite du shell elle-même.S'il ne le faisait pas, Bash suspendrait comme n'importe quel autre processus (et se bloquerait probablement en l'absence d'un processus parent préparé pour le gérer). –

+0

Cela prend tout son sens. Merci de clarifier. – ivan