@comingstorm est fondamentalement correct. Pour l'affichage, vous commencez par le curseur et balayez en arrière jusqu'à ce que vous soyez sûr que vous avez dépassé le haut de l'écran. Ensuite, vous revenez en arrière jusqu'à la fin d'une ligne, en supposant que vous pouvez identifier une extrémité de ligne en arrière. Maintenant, vous numérisez en avant, en calculant et en sauvegardant les positions de départ de la ligne d'écran jusqu'à ce que vous soyez allé assez loin. Enfin, vous choisissez la ligne que vous voulez commencer à afficher et vous partez.
Pour un texte simple, cela peut être fait sur un processeur archaïque assez rapidement pour redessiner un affichage vidéo mappé en mémoire à chaque frappe. [J'ai inventé cette technologie il y a 30 ans]. La bonne façon de faire est de fixer le curseur sur la ligne médiane de l'écran.
Pour modifier réellement les fichiers, vous pouvez utiliser les cordes de Gnu. Une corde est essentiellement une liste chaînée de tampons.L'idée est que toutes les modifications locales peuvent être effectuées dans un seul petit tampon, en ajoutant de temps en temps un nouveau tampon, et parfois en fusionnant les tampons adjacents.
Je considérerais combiner cette technologie avec le stockage différentiel: le genre de chose que font tous les systèmes modernes de contrôle de source. Vous avez pour utiliser ce type d'édition basée sur les transactions si vous souhaitez implémenter la fonction undo.
La clé de cette transaction est les transactions inversibles, c'est-à-dire celles qui contiennent suffisamment d'informations pour être appliquées à rebours pour annuler ce qu'elles ont fait lorsqu'elles ont été appliquées. L'opération de l'éditeur de base est:
at pos p replace old with new
qui a inverse
at pos p replace new with old
Cet insert poignées (ancien est vide) et supprimer (nouveau est vide), ainsi que remplacer. Étant donné une liste de transactions, vous pouvez annuler les modifications apportées à une chaîne en appliquant l'inverse de la liste des transactions inverses. Maintenant, vous utilisez l'ancien concept de point de contrôle: vous stockez une image modifiée du fichier assez récente avec quelques transactions récentes qui n'ont pas encore été appliquées. Pour afficher, vous appliquez les transactions à la volée. Pour annuler, vous venez de jeter certaines transactions. De temps en temps, vous appliquez réellement les transactions, en faisant une image "checkpoint". Cela accélère l'affichage, au prix de ralentir l'annulation. Enfin: pour réécrire un énorme fichier texte séquentiel, vous devez normalement réécrire le texte entier, ce qui est horrible. Si vous pouvez tricher un peu et autoriser des caractères arbitraires de 0 dans le texte et que vous avez accès au gestionnaire de page du système de mémoire virtuelle et à l'accès au disque, vous pouvez faire beaucoup mieux en conservant toutes les pages de texte inchangées. Autrement dit, l'idée de cordes sur le disque.
+1 pour l'explication et la note à la fin, je n'avais pas pensé à cette partie. :) Juste une note, cependant: Et si ce n'est pas UTF-8, et c'est, disons, UTF-16? Est-ce aussi facile à analyser en arrière? – Mehrdad
Bien sûr; si quoi que ce soit, UTF-16 est plus simple. La seule chose que vous devez faire attention est les "paires de substitution" (en supposant que vous voulez les gérer du tout ...). Ils sont faciles à localiser si vous savez quel encodage vous recherchez en premier lieu. – comingstorm
Cool, merci beaucoup! – Mehrdad