éditeur de code .... [Algorithmie] - Programmation
Marsh Posté le 22-03-2002 à 21:20:10
Tu le fais parce que tu as besoin d'une zone de texte style éditeur de code, ou bien tu le fais par "défi" / "devoir" ?
Si c'est juste parce que tu en as besoin, ne te fatigue plus, utlise ça:
http://synedit.sourceforge.net/
Y a pas mieux je pense
C'est ce qu'utilise ConTEXT par exemple : http://fixedsys.com/context/
[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]
Marsh Posté le 22-03-2002 à 21:25:42
antp a écrit a écrit : Tu le fais parce que tu as besoin d'une zone de texte style éditeur de code, ou bien tu le fais par "défi" / "devoir" ? Si c'est juste parce que tu en as besoin, ne te fatigue plus, utlise ça: http://synedit.sourceforge.net/ Y a pas mieux je pense C'est ce qu'utilise ConTEXT par exemple : http://fixedsys.com/context/ |
en fait, c'était aussi par défi
mais je vais regarder tes adresses qd même, merci bcp
Marsh Posté le 22-03-2002 à 21:50:26
bon, comme j'ai pas envie de lire tout le code de synedit, je vais exposer mes idées ...
à chaque frappe, je recalcule toutes les couleurs pour tout le texte (ZOGZOG)
à chque frappe, je regarde quelle touche a été frappée et je réfléchie pour savoir quelle importance ça peut avoir...
exemple en C++:
on frappe un espace, pas grave, seulement une ligne à analyser !
on frappe une accolade gros bourdel ...
k'en pensez vous ?
ps est ce que partir d'un richedit est handicappant ?
(j'ai pas envie de ma lancer ds la prog de composants ... )
Marsh Posté le 22-03-2002 à 21:55:07
Ça ressemble quand même fort à la réinvention de la roue
Et SynEdit est pas difficile à utiliser...
Enfin bon
Pour le RichEdit je l'ai jamais utilisé donc je peux pas t'aider, mais je te souhaite bonne chance
Marsh Posté le 22-03-2002 à 21:56:04
ah ben bien, j'ai fait ca y'a deux semaine
bon, voila comment j'ai fait :
j'ai un abre N-aire qui contient les mots a colorier (chaque noeud a N-fils, avec un caractere par fils . de cette facon tu peux facilement verifier si un mot est a colorier ou non)
Ensuite a chaque input de l'utilisateur, je check le mot courant (tu prends la position actuelle, tu te deplace sur la gauche jusqu'a trouver un separateur (espace, entrée, ';' ...), idem sur la droite
je passe le mot dans mon arbre, je regarde si ca existe. Si oui, zou, en couleur !
Note que l'arbre est pratique pour autre chose, genre la completion automatique
Marsh Posté le 22-03-2002 à 22:37:18
chrisbk a écrit a écrit : ah ben bien, j'ai fait ca y'a deux semaine bon, voila comment j'ai fait : j'ai un abre N-aire qui contient les mots a colorier (chaque noeud a N-fils, avec un caractere par fils . de cette facon tu peux facilement verifier si un mot est a colorier ou non) Ensuite a chaque input de l'utilisateur, je check le mot courant (tu prends la position actuelle, tu te deplace sur la gauche jusqu'a trouver un separateur (espace, entrée, ';' ...), idem sur la droite je passe le mot dans mon arbre, je regarde si ca existe. Si oui, zou, en couleur ! Note que l'arbre est pratique pour autre chose, genre la completion automatique |
l'histoire de l'arbre, j'y avais pensé ce qui me pose problème, c'est de trouver les cas où il ya bcp de changements à faire sur les couleurs du texte ....
par exemple, tu tapes un " qqpart et ça te changes les couleurs de ton code sur 12 lignes ... ou pas
bon, je m'y remets
@+
Marsh Posté le 22-03-2002 à 23:38:27
trueslash a écrit a écrit : l'histoire de l'arbre, j'y avais pensé ce qui me pose problème, c'est de trouver les cas où il ya bcp de changements à faire sur les couleurs du texte .... par exemple, tu tapes un " qqpart et ça te changes les couleurs de ton code sur 12 lignes ... ou pas bon, je m'y remets @+ |
ah oui merde j'avais oublier ce cas (vu que je le gere pas
le " meparait assez chaud, vu qu'il faut savoir si c un ouvrant, ou un fermant ;
tu dois pouvoir verifier ca en cherchant la couleur du mot precedant (si coloré, alors fermant, sinon ouvrant)
a partir de la t'as plus qu'a aller en avant et chercher quand ca se ferme, colorier le tout
aucune idée de l'impact sur la vitesse
Marsh Posté le 23-03-2002 à 00:25:23
j'en avais commencé un, je m'étais arrêté aux tokens qui ne modifient que la ligne courante dans ce cas-là, c'était tout simple : chopper la position du curseur, chopper la ligne sur laquelle est le curseur, passer la ligne à un miniparser qui renvoie une liste chaîne de tokens avec leurs positions dans la chaîne, et update du richedit.
pour les tokens comme ", /*, */ en C, j'imagine qu'il n'y a pas de solution miracle : par ex pour */, parser toute la source jusqu'à tomber sur /* ou sur le premier token. peut-être garder un arbre en mémoire de tout le fichier pour accélérer le parsing & permettre des trucs sympas comme savoir dans quelle fonction / méthode on est, etc.
une chose est sûre, il ne faut PAS colorier tout le fichier lors de l'ouverture mais seulement la partie visible. j'ai essayé tout le fichier, j'ai eu des problèmes (ça rame très vite pour un nombre de lignes relativement peu important). donc en fait, colorier au fur et à mesure qu'on descend / remonte dans le fichier.
[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]
Marsh Posté le 23-03-2002 à 00:52:36
interessant l'histoire de colorier que la partie visible, cé pô con !
sinon, je crois que je vais partir de cette idée:
=> l'utilisateur tape qqchose
=> analyse du caractère inséré/supprimé
=> déduction de la portée maximale du changement
=> recoloriage
le problème, c qu'il faut réfléchir aux structures de données à utiliser et je me sens pas d'improviser
bon, au boulot
Marsh Posté le 23-03-2002 à 00:59:16
stp, tiens-nous au courant ! ça m'intéresse beaucoup de savoir comment tu vas faire pour les caractères qui changent plus d'une ligne de couleurs (/*, */, etc.).
[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]
Marsh Posté le 23-03-2002 à 01:08:56
youdontcare a écrit a écrit : une chose est sûre, il ne faut PAS colorier tout le fichier lors de l'ouverture mais seulement la partie visible. j'ai essayé tout le fichier, j'ai eu des problèmes (ça rame très vite pour un nombre de lignes relativement peu important). donc en fait, colorier au fur et à mesure qu'on descend / remonte dans le fichier. |
Ca ramait tant que ca ?
Sinon pour optimiser y'a deja un truc tout con : ne pas mettre ajour la fenetre a chaque changement de couleur
en MFC c'est :
setRedraw(FALSE);
changement de couleur
setRedraw(TRUE);
Invalidate(FALSE);
(redraw ou repaint ? je sais pu )
[jfdsdjhfuetppo]--Message édité par chrisbk--[/jfdsdjhfuetppo]
Marsh Posté le 23-03-2002 à 01:14:14
c'était assez terrible sur les 'gros fichiers', je me souviens de qq dizaines de secondes pour la coloration. visual l'ouvrait instantanément.
j'ai peut-être codé ça comme un pied aussi ... pour le setRedraw(), merci j'essaierai de tester si j'ai le temps de me replonger là-dedans (le code a presque un an et ma mémoire défaille ...)
[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]
Marsh Posté le 23-03-2002 à 01:16:19
t'avais fait ca avec un parser et tout et tout ? Clair que c la bonne solution (une fois qu'on a les token on doit pouvoir en tirer plein de chose interessantes ), mais la fo deja plus de tps pour coder ca
Marsh Posté le 23-03-2002 à 01:23:25
à la base, le parser était là car je testais la compilation d'un langage script.
du coup le code pour l'update était hyper simple :
TokenizerResult tr;
if (tknz.Tokenize(singleLine, length+1, tr))
{
Token* t = tr.root;
while (t)
{
if (t->type < Token_line)
SetColorRange(t->srcidx1+start, t->srcidx2+start, colors[t->type]);
t = t->next;
}
}
le 'tokenizer' convertit la ligne sur laquelle on tape en une liste chaînée de tokens, la méthode de coloration parcourt la liste et update les couleurs (SetColorRange) en fonction du type du token (t->type) et de sa position dans la ligne (srcidx1, srcidx2).
c'était juste un test bourrin et rapide, ça marchait assez bien.
en en reparlant, ça me redonne envie de tester ça plus en profondeur. bon, j'aimerai bien aussi me coder 'mon' richedit avec une lib de fontes comme freetype, permettre du html dans les commentaires de fonctions, génération automatique de la doc, pouvoir 'replier' certains bouts de code, marquer telle fonction comme 'à revoir', etc.
oui, ça doit déjà exister (genre emacs ) mais je suis sectaire
[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]
Marsh Posté le 23-03-2002 à 01:25:01
j'avais repompé le code de coloration sur un projet trouvé sur le net, qui faisait la syntaxe vb ... donc trueslash tu peux chercher de ce côté là aussi (parce que la doc, j'ai essayé ... j'ai encore eu des problèmes )
Marsh Posté le 23-03-2002 à 02:09:41
ben je vais plutôt le faire en delphi
pour le moment, je réfléchis à comment hiérarchiser un fichier texte contenant du code par rapport à la portée des modifications que l'on peut y faire
ouh là, c pas tres clair ce que je viens de dire ...
au lit !
Marsh Posté le 23-03-2002 à 02:16:50
trueslash a écrit a écrit : ben je vais plutôt le faire en delphi pour le moment, je réfléchis à comment hiérarchiser un fichier texte contenant du code par rapport à la portée des modifications que l'on peut y faire ouh là, c pas tres clair ce que je viens de dire ... au lit ! |
je confirme ! g rien pigé !
Marsh Posté le 23-03-2002 à 12:12:47
HappyHarry a écrit a écrit : je confirme ! g rien pigé ! |
Moi j'ai compris
ca risque d'etre assez sport, non, ta hierarchie .......... quoique c'est a essayer
Marsh Posté le 23-03-2002 à 12:14:18
trueslash : pour ton editeur te faudra aussi l'identation automatique ....
Je te laisse chercher car en fait c'est tres con comme truc
Marsh Posté le 23-03-2002 à 12:36:39
chrisbk a écrit a écrit : trueslash : pour ton editeur te faudra aussi l'identation automatique .... Je te laisse chercher car en fait c'est tres con comme truc |
en fait un de mes autres projets, c'est de définir des guides de style... ça paraît assez chaud comme ça mais si j'arrive à hiérarchiser, ça devrait être faisable
Marsh Posté le 23-03-2002 à 12:45:20
trueslash a écrit a écrit : en fait un de mes autres projets, c'est de définir des guides de style |
c'est quoi ?
Marsh Posté le 23-03-2002 à 13:20:26
youdontcare a écrit a écrit : c'est quoi ? |
qqchose qui met ton code en forme automatiquement, exemple:
tu tapes:
for(unsigned int i=0; i<10; i++)
{tab[i] = tab2[i];
k++;
AppelFonction();}
et il te transformes ça en:
for(unsigned int i=0; i<10; i++)
{
tab[i] = tab2[i];
k++;
AppelFonction();
}
Marsh Posté le 23-03-2002 à 13:46:44
sympa !
idéal pour chambouler la syntaxe de tes collègues et imposer ta loi
Marsh Posté le 23-03-2002 à 14:01:50
trueslash a écrit a écrit : qqchose qui met ton code en forme automatiquement, exemple: tu tapes: for(unsigned int i=0; i<10; i++) {tab[i] = tab2[i]; k++; AppelFonction();} et il te transformes ça en: for(unsigned int i=0; i<10; i++) { tab[i] = tab2[i]; k++; AppelFonction(); } |
ca devraitpas etre bien sur, enfin, en "post processing" (genre tu tape tout ton code et il te le formate apres)
Globalement l'idée c'est qu'a chaque retour a la ligne, tu compte le nombre d'espace qu'il y a au debut de la ligne précédente. A ceci tu ajoute des espaces suivantle nombre de '{' de la ligne précédente et vala !
Marsh Posté le 22-03-2002 à 20:54:15
voilà, j'ai décidé de programmer un éditeur de code en delphi ...
j'ai utilisé un richedit, j'ai fait une fonction qui permet de colorier du texte mais je sais pas comment gérer la MAJ des couleurs au fur et à mesure des frappes de l'utilisateur.
je dois tout recontroller le texte à chque frappe ?
essayer de mettre en place un contrôle local ?
j'aimerais des idées paske chuis bloké là ...