Xterm.js: le défilement ne fonctionne pas comme prévu

Créé le 17 nov. 2016  ·  4Commentaires  ·  Source: xtermjs/xterm.js

Il semble que la taille totale du tampon veuille être de <viewport rows> + <scrollback> , mais lorsque je le branche dans vscode pour être 10 , je remarque que la quantité de défilement fournie n'est pas de 10 et semble alterner entre 2 valeurs.

En exécutant ll pour obtenir une partie de la sortie, j'obtiens 6 lignes de défilement la première fois, 8 la deuxième fois, 5 la troisième, 7 la quatrième, etc. Cela devrait être exactement 10 à chaque fois.

typbug

Tous les 4 commentaires

Cela semble se produire à cause de cette logique dans scroll :

  if (++this.ybase === this.scrollback) {
    this.ybase = this.ybase / 2 | 0;
    this.lines = this.lines.slice(-(this.ybase + this.rows) + 1);
  }

Voici quelques remarques/questions :

  • Il y a un bitwise bizarre ou qui je crois ne fait rien ( | 0 )
  • Un morceau de lignes est coupé lorsque scrollback est atteint
  • Pourquoi le rognage des lignes se fait-il sur scroll , ne devrait-il pas être fait quand this.lines est ajouté à ?
  • Le slice peut causer des problèmes de performances car il produit un nouveau tableau et supprime l'ancien

Et si au lieu de ce modèle où Terminal.lines est continuellement reconstruit, nous implémentions un tableau circulaire et réduisions la complexité à l'intérieur d'une classe ? Ainsi, un tableau est toujours de taille Terminal.rows + Terminal.scrollback , ce qui signifie qu'il n'y a pas de reconstruction de tableau ou de shift ing (ce qui peut poser des problèmes sur des tableaux suffisamment grands) et scrollback est géré pour nous comme les anciennes entrées du tableau seront remplacées.

Il serait probablement encore mieux d'utiliser simplement Terminal.scrollback , de cette façon Terminal.lines n'aurait besoin d'être redimensionné que lorsque Terminal.scrollback est modifié (par opposition à lorsque Terminal.rows change aussi). C'est un changement par rapport au modèle actuel, il pourrait être bon de changer le paramètre en bufferSize ou bufferLength si nous faisons cela.

J'ai une branche WIP qui implémente ce nouveau modèle en utilisant une classe CircularList , ça ne fonctionne pas encore à 100% et je vais le mettre en attente pour le moment pour me concentrer sur d'autres choses. https://github.com/Tyriar/xterm.js/tree/361_circular_list_scrollback

@Tyriar Je serais ravi de faire des tests sur votre branche et de donner votre avis si vous pensez que le moment est venu 🆗 .

C'est un peu trop cassé actuellement, va falloir trouver un peu de temps pour le finir

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