Xterm.js: L'exécution de clear dans le terminal supprime le contenu de la fenêtre de la mémoire tampon au lieu de le cacher

Créé le 9 juin 2016  ·  31Commentaires  ·  Source: xtermjs/xterm.js

Étapes à suivre pour reproduire:

  1. Exécutez ll deux fois pour remplir la fenêtre
  2. Exécutez clear
  3. Faites défiler vers le haut et notez qu'un nombre de lignes égal à la hauteur du terminal a été supprimé du tampon.
duplicate typbug

Commentaire le plus utile

J'apprécierais beaucoup une solution, je dois continuer à tuer les fenêtres du terminal et à les rouvrir pour effacer. C'est très fluide.

Tous les 31 commentaires

gnome-terminal semble être bogué à cet égard, il supprime autant de lignes depuis le tout début du tampon, pas l'ancienne fenêtre.

Voici les spécifications du signal reçu (2):

ED – Erase In Display

ESC [ Ps J  default value: 0
This sequence erases some or all of the characters in the display according to the parameter. Any complete line erased by this sequence will return that line to single width mode. Editor Function

Parameter   Parameter Meaning
0   Erase from the active position to the end of the screen, inclusive (default)
1   Erase from start of the screen to the active position, inclusive
2   Erase all of the display – all lines are erased, changed to single-width, and the cursor does not move.

http://www.vt100.net/docs/vt100-ug/chapter3.html

La bonne chose pourrait être d'effacer absolument tout comme le fait xterm .

Devrions-nous donc aller de l'avant en fermant ce problème et laisser le comportement de nettoyage tel quel?

@parisk bien cela ressemble à un bogue pour moi, peut-être que faire ce que fait xterm serait mieux étant donné que c'est ce que cela essaie d'imiter?

Eh bien, j'ai fait quelques tests. Je pense que votre proposition de "déplacer les lignes vers le haut" au lieu de les supprimer de la mémoire tampon offre le meilleur UX, même si ce n'est pas 100% conforme à xterm.

Je viens de rencontrer ceci avec: https://github.com/Microsoft/vscode/issues/19934

Je voudrais coller mon cas d'utilisation ici pour examen:

Mon cas d'utilisation (également comment fonctionne PowerShell):

J'aime cls puis lancer npm test . Ensuite, le début de mon terminal est l'endroit où commence ma sortie de test.
Maintenant, je cls , mais je n'ai aucune idée du début de ma sortie de test.

Par conséquent, je ne suis pas d'accord avec le simple fait de déplacer les lignes vers le haut.

Voici un résumé du comportement de divers émulateurs de terminaux lorsqu'ils reçoivent un signal Erase All ED ( \e[2J ):

  • xterm. [email protected] : garder tout, il suffit de pousser vers le haut
  • gnome-terminal: efface tout ce qui se trouve en haut de la fenêtre courante, puis pousse la fenêtre courante vers le haut
  • Terminal Fedora: identique à gnome-terminal
  • xterm: effacer tout le tampon
  • Terminal.app: identique à xterm. [email protected]
  • iTerm2 v3: identique à xterm. [email protected]

Sur la base de certaines références que j'ai trouvées, il semble ambigu de savoir exactement ce que cette séquence d'échappement est censée être puisque celle-ci dit "Effacer tout", et celle-ci dit "Effacer l'écran". Le comportement réel de xterm semble cependant indiquer que cela signifie tout effacer.

Le comportement de xterm me semble le plus raisonnable, en particulier lorsque nous implémentons la recherche (https://github.com/sourcelair/xterm.js/issues/553), mais je peux voir pourquoi le comportement actuel peut être bon pour certains utilisateurs. @parisk qu'en pensez-vous? Devrait-il s'agir d'un paramètre (tout effacer ou push up) ou devrions-nous passer au comportement de xterm?

Sur la base du nom du signal, je pense également que l'implémentation de xterm est la plus raisonnable.

Mais, je pense aussi que l'implémentation de xterm.js est celle que vous regretterez le moins, si c'est fait accidentellement 😅, donc pour moi (personnellement) c'est plus souhaitable.

Dans quel cas une personne préférerait-elle que la totalité du tampon soit effacée à masquée?

@CoenraadS en mentionne un gros:

  1. clair
  2. Exécuter une commande avec une sortie longue
  3. Aller au début du tampon pour voir le début de la commande

Un autre est que lorsque nous effectuons une recherche, ne pas pouvoir effacer entraînera des problèmes pour des raisons similaires, car un tas d'anciens mots clés explicitement effacés seront mis en correspondance.

Je pense que cela devrait être un paramètre car les shells Windows et Linux se comportent différemment et je ne vois pas cela répertorié dans le résumé.

Cmd et Powershell effacent le tampon lorsque cls est appelé afin que vous ne puissiez pas faire défiler pour voir l'historique.
CentOS utilisant Bash, la commande clear efface l'écran mais maintient la mémoire tampon afin que vous puissiez faire défiler vers le haut pour voir l'historique.

Voici ce que je pense nécessaire pour résoudre complètement ce problème:

  • Définissez une valeur par défaut basée sur le système d'exploitation pour maintenir les attentes en fonction de la plate-forme.
  • Autoriser l'utilisateur à remplacer par shell. De cette façon, les utilisateurs de Windows Bash peuvent le modifier pour conserver la mémoire tampon.
  • Autorisez la création de raccourcis ou de boutons d'interface utilisateur afin qu'un utilisateur puisse effectuer l'un ou l'autre indépendamment du paramètre. Quelque chose comme ClearBuffer vs ClearScreen fonctionnerait.

Cela m'amène à une très belle idée de plugin: si vous effacez, le tampon est effacé, mais si vous faites défiler vers le haut au-delà du pli actuel, vous verrez une ligne "La sortie précédente a été effacée, cliquez ici pour voir", qui restaure le résultat. Il se comporterait comme un éditeur de code où vous pouvez développer / réduire les sections, mais nos sections sont regroupées par des commandes claires. Est-ce que modifier le scrollback comme ça fonctionnerait réellement comme un plugin actuellement?

fold-clear

@mofux CircularList devrait probablement être informé des régions réductibles pour quelque chose comme ça.

+1 pour effacer réellement l'écran. Je partage le cas d'utilisation de @CoenraadS où je l'utilise pour des tests unitaires

Version VS Code | OS
------------------ | ----
1.10.2 | Win x64 pro (français)

Je confirme que l'exécution de cls depuis le terminal intégré n'efface pas vraiment le terminal. Vous pouvez toujours faire défiler vers le haut et voir les commandes précédentes. Ceci avec powershell.exe ou cmd.exe.

Cette commande Code produira le même résultat

{ "key": "ctrl+k", "command": "workbench.action.terminal.clear", "when": "terminalFocus" }

Solution de contournement, utilisez la commande _clear terminal_ de la palette ou modifiez le raccourci clavier en supprimant le terminalFocus comme

{ "key": "ctrl+k k", "command": "workbench.action.terminal.clear" }

Malheureusement, vous ne pourrez pas exécuter ce raccourci avec succès lorsque le terminal aura le focus.

Cela doit être corrigé.

J'apprécierais beaucoup une solution, je dois continuer à tuer les fenêtres du terminal et à les rouvrir pour effacer. C'est très fluide.

Alors, y a-t-il une intention de résoudre ce problème prochainement? C'est la seule chose qui m'empêche d'abandonner ISE et de passer à VSCode. J'attends une solution depuis environ un an maintenant: - /

@CookieCrumbles cela a été corrigé pour moi dans la version de VSCode Insider depuis des mois

@chrisdothtml

J'ai eu le problème dans Insiders 1.8, c'était le dernier que j'avais. Je vais télécharger la dernière version et essayer.
Merci de m'avoir répondu. Je posterai dès que possible.

@chrisdothtml
Je suis désolé de le dire, mais si je fais cela avec PowerShell:

gci c:\temp cls gci c:\temp cls gci c:\temp cls gci c:\temp cls gci c:\temp

Je suis toujours en mesure de faire défiler vers le haut et de voir le GCI précédent de c: temp.
Donc ce n'est pas réglé.

Ah, je suis sur un Mac. Probablement pas encore corrigé pour Windows

Je suppose que ce n'est pas une priorité sur leur liste. Kinda a abandonné VSCode juste à cause de cela. De retour à ISE, je reviendrai dans six mois environ, en espérant que cela soit réglé d'ici là. #FeelsBadMan

Nous prenons en charge à la fois l'effacement de la fenêtre (2J) et du tampon de défilement (3J), pas sûr qu'il existe un correctif pour cela pour Linux / macOS autre que l'inclusion de xterm.js dans terminfo, voir https://unix.stackexchange.com/questions / 375743 / pourquoi-effacer-ne-pas-effacer-tout-l'écran

Quant à Windows, je ne suis pas sûr qu'il y ait quoi que ce soit qui puisse être fait de notre côté. @rprichard des idées pour lesquelles winpty n'enverrait que \e[2J et pas un \e[3J aussi bien quand un clear est fait dans PowerShell?

@Tyriar fix s'il vous plaît dès que possible. C'est le comportement attendu 101 depuis plus de 20 ans des terminaux Windows. Est-il vraiment difficile de faire en sorte que Windows efface toute sa mémoire tampon de ce signal?

winpty remarque définitivement quand la commande CLS est exécutée - la fenêtre de la console revient en haut de la mémoire tampon de l'écran de la console. Lorsque cela se produit, winpty réinitialise le terminal. Il devrait peut-être envoyer une commande différente de celle qu'il envoie actuellement.

J'ai l'impression que l'effacement de l'écran ne réinitialise pas le défilement, mais il semble que je me sois trompé, alors peut-être que winpty doit être modifié ici.

@rprichard Je pense que sur Windows en particulier, cls efface systématiquement le défilement, c'est sur les autres plates-formes que cela diffère et je pense que la raison en est que terminfo ne déclare pas le support de 3J pour certains terminaux.

Eh bien, je suis content de voir qu'il est à l'étude. J'espère que vous pourrez le réparer dans un proche avenir.

Une mise à jour @Tyriar ?

y a-t-il un moyen de faire cela avec un drapeau? car, pour les sorties longues, ça tue vraiment l'UX, là où je compte effacer l'écran, pas le pousser vers le haut. Ou pouvez-vous détecter le système d'exploitation et vous comporter de cette façon?

cls --force
cls -f

Les mises à jour? Encore un problème dans VS Code et ils semblent attendre cela plutôt que de le réparer dans VS Code.

Cls devrait certainement effacer le tampon et l'écran à mon avis, comme cela se fait avec cmd.exe sous Windows.

Mise à jour: Je m'attends à ce que cela soit corrigé lorsque https://github.com/Microsoft/vscode/issues/45693 sera traité, ce sur quoi je travaillerai probablement dans les mois à venir.

Fermer ceci car il n'est pas lié à xterm.js mais à l'émulation pty sous Windows. Les problèmes Windows pty sont suivis dans https://github.com/Microsoft/vscode/issues/45693

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

pfitzseb picture pfitzseb  ·  3Commentaires

jerch picture jerch  ·  3Commentaires

circuitry2 picture circuitry2  ·  4Commentaires

parisk picture parisk  ·  3Commentaires

Tyriar picture Tyriar  ·  4Commentaires