Éditeur

WARNING Document de travail / notes.

Présentation

L'édieur est la partie qui permet la saisie, la sauvegarde et le chargement du code machine. Il doit interagir, en permanence, avec le module d'assemblage et ce à des fins fonctionnelles:

  • valider la ligne saisie.
  • vérifier la déclaration d'un label.
  • indentation et formatage de la ligne.
  • Validation du mnémonique.
  • etc…

Inspiré à la fois de DAMS et de certaines fonctionnalités de VI.

Il faut aussi permettre de basculer vers d'autres outils (moniteur…).
TODO : définir comment. (ESC pour revenir à un menu principal ?)

L'éditeur est la partie qui gère la saisie et l'affichage du texte. Le codec interprète chaque ligne saisie, se charge de la stocker et de la regénérer à la demande.

Exemple de codec :
- null codec. Il stocke les lignes telles quelles. S'occupe simplement de la gestion mémoire.
- assembleur/désassembleur. Il vérifie la validité de la ligne au moment de la saisie, et stocke la version assemblée.

Aussi, l'éditeur n'a aucun texte à stocker. Typiquement, il ne gardera en mémoire que le texte actuellement affiché, pour des raisons de performance.

Implications

Il est possible les conversions du codec ne soit pas réversibles. Par exemple, en stockant uniquement l'opcode, l'assembleur est incapable de retrouver la casse d'origine. De même, il ne stocke pas l'espacement ("tabulation") utilisé.
Lors de la génération de la ligne, un choix arbitraire doit donc se voir appliqué (eg, tabulation 10 et opcode en majuscule).
Ce n'est pas une limitation mais au contraire une fonctionnalité :

  • assure une totale cohérence de présentation
  • auto-formatage à la volée (et de manière plus ingénieuse qu'en insérant naïvement des espaces)
  • réduit le stockage : on se stocke pas les espaces !

Voir aussi le chapitre 'tabulation'.

Que faire si le codec est incapable d'encoder du texte (eg: un opcode invalide) ?
Pour ce cas de figure, chaque codec devra être capable de stocker la version littérale, tout en indiquant l'échec de l'encodage.

Notion de LIGNE

L'unité principale est la ligne de texte "complète", par opposition à une ligne à l'écran (une longue ligne complète peut se voir /wrappée/ sur plusieurs lignes à l'écran).
Sans précision, par "ligne" on entendra toujours la ligne complète.

La longueur d'une ligne de code se limite à 71 caractères.

V1: On limite le nombre de lignes supportées à 2^16-1 = 65535.

Numérotation des lignes

Il serait avantageux de réserver 6 caractères, dont 5 pour les numéros de lignes (en les justifiant à droite). Le caractère restant servira d'affichage sur le statut de la ligne (error, warning, etc…) (From madram: J'ai déjà une routine de conversion 16 bits->valeur décimale en ASCII. Rappelle-moi de te l'envoyer !)

Pas d'affichage en V1 !
voir Notes

Tabulations

Dans l'exemple de l'assembleur, on souhaite que des éléments de même type (eg : label, opcodes, commentaires) soient verticalement alignés.
Or, il est ridicule d'avoir soi-même à mettre en page à l'aide de la touche espace.
Mais en creusant plus loin, il est tout aussi ridicule de conserver les espaces générés par l'éditeur. TODO : expliquer pourquoi !

V1 : Alignement fixe décidé par codec. Le défaut précédant est évité dans la sauvegardé de la version encodée.
V2 : Le codec renvoi un charactère pour signifier la tabulation.
!!! A définir : concept d'indentation (incrément et décrement) plutôt que de tabulation !!!
Cf Python : quand on bout de code est déplacé, il faut recalculer les tabulations en fonction du niveau d'indentation. Pas fameux !
En C, ce sont les accolades qui délimitent les niveaux de hierarchies.
Le concept évoqué plus haut coïnciderait donc à des marqueurs ouvrants/fermants non visibles.

Ainsi la stucture

toto
  plop
  cafloutis
    isegoria
dada

Serait codé :

toto
>plop
cafloutis
>isegoria
<<dada

L'absence de code devant 'cafloutis' signifiant qu'il est au même niveau que la ligne précédente. Simple commme coucou !

V2 : Alignement d'autres éléments.

Exemple1 : données

defb 1, 2,  3, 4,  5
defb 2, 5, 15, 9, -1

Autocomplétion

Repenser l'autocomplétion !
Automatique, non intrusive, réversible, exhaustive.

Automatique :

  • La fonctionnalité est tellement pratique (même en programmation assembleur) qu'il semble curieux d'avoir à l'invoquer explicitement. Nous choisissons donc de proposer systématiquement les complétions possible. Couplé à la qualité "non-intrusive", nous obtenons le meilleur des deux mondes. On gagne en passant une touche : sans besoin d'appuyer sur "TAB" pour déclencher l'auto-complétion, la touche peut servir à un autre but (eg, valider l'auto-complétion).

Non intrusive :

Réversible

  • Rien de plus chiant que d'avoir à effacer une floppée de caractère

Sélection automatique du premier choix et démocratie.

Sauvegarde

On propose deux types de sauvegardes :

  1. Sauvegarde du fichier encodé (eg, source précompilé. Cf Concepts:Codec).
  2. Un dump du texte ASCII (itérer sur toutes les lignes, mais sortir sur fichier plutôt qu'à l'écran).

Avantages respectifs (avec l'exemple du codec assembleur/désassembleur) :

  • Taille réduite du fichier (jusqu'à 1/10 de l'équivalent texte)
  • Compilation immédiate (car le gros de la compilation a été effectué lors de la saisie !)
  • Format texte classique lisible par d'autres outils.
  • Plus robuste en tant que back-up

Séparation

Une isolation totale n'est pas toujours souhaitable.
Exemple recherche token plutôt que texte. TODO : développer !

Dans le même ordre d'idée : le couper-coller se ferait idéalement de manière générique. Mais cela n'est pas efficace en pratique :

  • cela implique de convertir en texte la partie coupée, et de la réinjecter en tant que texte (convertion opposée).
  • si l'opération est faite en bloc, la partie texte peut dépasser la mémoire disponible, rendant l'opération impossible.
  • si l'opération est faite itérativement (déplacement des lignes une à une par cette double conversion), on perd encore en efficacité (car il est plus rapide d'insérer un bloc de 100 lignes que 100 fois une ligne seule).

Visuel

L'éditeur sera découpé en plusieurs zones (numéros de ligne/labels/informations divers/saisi du code).

  • Laisser plusieurs colonnes libres pour les signes (warning, error, program counter, …) et la numérotation des lignes.

Vue multiples

Si certaines fonctionnalités (édition multiple, écran d'aide) peuvent se contenter d'écrans distincts, on souhaite en revanche pouvoir afficher des informations supplémentaires sur un même écran, soit dans une fenêtre séparée, soit en incrustation.
Exemples :

  • Status généraux (nom du fichier éditer, taux de satisfaction…)
  • Canevas.
  • Suggestions autocomplétion.
  • Aperçu d'une routine appelée.
  • Messages d'erreur de l'assembleur.
  • Fenêtre pour débuggeur.
  • Diff.

Scrolling

Tout déplacement hors de la page courante devrait être matérialisé par un scrolling dans le sens du déplacement, et idéalement de vitesse proportionnelle à la distance couverte. Cela fourni un indice très intuitif sur la nouvelle position dans le fichier par rapport à l'ancienne, aidant ainsi à mieux appréhender un gros fichier.
Cela ne signifie absolument pas qu'il faille afficher toutes les lignes séparant le point de départ de celui d'arrivé. Sur un exemple (écran de 7 lignes de haut), le passage de la ligne 1 à la ligne 100 pourra se faire de la manière suivante :

  1    4    7    100
  2    5    ---- 101
  3    6    100  102
  4    7    101  103
  5    ---- 102  104
  6    100  103  105
  7    101  104  106

Où "----" symbolise une ligne spéciale (eg "********" sur toute la longueur) signifiant la discontinuité entre les deux parties de texte.
Pour le passage de la ligne 100 à la ligne 1 : rejouer le schéma à l'envers !

Commandes

Navigation/édition

Un seul mode de prévu : l'insertion !

  • Si RETURN en milieu de ligne, on découpe la ligne (ie : ce qui est à droite du curseur passe à la ligne suivante).

Justification : on est en mode insertion, donc "Return" revient naturellement à insérer un "retour chariot".
C'est le comportement attendu d'un éditeur moderne.
TurboAssembler le permet également, mais via CONTROL-RETURN, ce qui est moins intuitif.

Du reste c'est fort pratique (permet de détacher un commentaire, ou de découper une série DEFB qui devient un peu trop longue).
Commande inverse : CONTROL-J (comme join).

Copier/Couper/Coller

Voir la section GestionBloc

Table des raccourcis clavier

Les raccourcis doivent être configurables :

  • Satisfait les goûts et habitudes de chacun.
  • Plus simple à programmer : stocker les correspondances "touche <-> nom de l'opération <-> adresse routine" dans une table plutôt que coder cela en dur.
  • Bonus : la table pourra être affiché en guise d'aide.

Les raccourcis seront stockés dans une table avec leurs codes et leurs descriptifs. L'idée est donc de chercher la combinaison saisie dans une table telle que :

     defb #f8
     defw PageUp
     defb #f9
     defw PageDown
     defb 0

     defb "G"+#80 ;Marqueur debut chaine
     defm o page up
PageUp
     ld hl,topLine
     ld a,(hl)
     sub pgShift ; typiquement 23
     jr nc,okpageup
     xor a
okpageup
     ld (hl),a
     jp pgDisp  ;reaffichage page à partir de nouvelle position (pas de gestion de scrolling ici).

     defb "G"+#80 ;Marqueur debut chaine
     defm o page down
PageDown
     ld hl,bottomLine
     ld a,(hl)
     sub pgShift ; typiquement 23
     jr nc,okpagedown
     xor a
okpagedown
     ld (hl),a
     jp pgDisp  ;reaffichage page à partir de nouvelle position (pas de gestion de scrolling ici).

Avant de tester si la combinaison saisie est dans la table, tester s'il s'agit d'un caractère normal, ie : compris entre 32 inclus (espace) et 126 (tilde).

Editeur - To Do(s)

[à compléter]

Sauf mention contraire, le contenu de cette page est protégé par la licence Creative Commons Attribution-ShareAlike 3.0 License