Meilleure réponse
Je narrive pas à croire que personne nait encore dit Vim. Vim!
Une fois que vous avez dépassé la courbe dapprentissage initiale, cest un outil incroyable pour automatiser les tâches de programmation banales. Je vais vous donner un exemple que j’ai utilisé plus tôt dans la journée.
Je créais une classe de lecteur XML (héritée d’une classe XML de base) pour un composant de notre base de code. Le .xml ressemblait à quelque chose comme ceci.
...
Le problème était (en raison de larchitecture existante) que ces valeurs de champ devaient toutes être des données privées membres de Some\_XML\_Class dans le code. Ce qui signifiait que jétais sur le point de faire beaucoup de travail sans signification pour convertir field-one en std :: string m\_field\_one , pour chacun de ces champs.
Cest là que Vim entre en jeu. Au lieu de tuer 20 minutes, faites-le à la dure. Jai collé la section de code ci-dessus et enregistré une macro.
^xistd::string m\_
Cette série de commandes vim fait ce qui suit. Accède au premier caractère de la ligne et le supprime (« est supprimé). Passe en mode insertion et ajoute std :: string m\_ à . Ensuite, il trouve la première occurrence de «-» et la remplace par «\_». Ensuite, il saute à la fin du mot field\_N , passe en mode ajout, ajoute un point-virgule et déplace le curseur dun vers la droite. Alors que maintenant nous avons
std::string m\_field\_one;value="value1" />
Mais nous navons pas terminé. Nous passons ensuite en mode commande, supprimons le reste de la ligne et passons à la suivante. Pour avoir:
std::string m\_field\_one;
Notez que la première ligne est parfaitement formatée et que le curseur est actuellement sur la ligne deux.
Cette partie suivante si la magie entre en jeu. Avant dexécuter cette commande, nous avons commencé à enregistrer une macro pour enregistrer «a» . Utilisez la commande q suivie de a . Ainsi, la commande complète est la suivante (où le q final est utilisé pour indiquer la fin de la macro).
qa^xistd::string m\_
Maintenant, si bien, appelez cette macro en utilisant la commande Vim:
@a
Il réexécute la macro et formate automatiquement votre ligne suivante:
std::string m\_field\_one;
std::string m\_field\_two;
Mais attendez, nous avons toujours N-2 lignes avec une structure similaire! Supposons dans ce cas que N était égal à 100. Pas de problème. Nous tapons simplement la commande:
98@a
Ceci exécute la macro ci-dessus 98 fois de plus, formatant automatiquement le reste de votre code !! Nous avons maintenant:
std::string m\_field\_one;
std::string m\_field\_two;
std::string m\_field\_three;
...
std::string m\_field\_ninetynine
std::string m\_field\_onehundered;
Stupendieux .
* PS: Au début, ces commandes peuvent vous sembler étrangères et effrayantes, mais une fois que vous avez passé du temps avec Vim en tant quéditeur principal, elles deviennent une seconde nature. Lexemple de macro ma pris 10 secondes à écrire et a gagné énormément de temps.
* PPS: Je sais que lexemple de code est assez stupide, mais je lai utilisé juste pour illustrer un point. Cependant, dans le monde réel, vous rencontrerez des cas similaires.
Réponse
Merci davoir posé la question.
Je suis venu ici initialement pour mettre en garde contre un tel objectif, basé uniquement sur le titre … En gros, aujourdhui vous écririez un éditeur de texte car:
- Vous avez un besoin très spécifique (mais dans ce cas, il vaut mieux partir dune base existante, plutôt que partir de zéro, sauf si vous avez des idées très nouvelles);
- OU vous pensez que cest un exercice de programmation intéressant; ce qui est en effet votre objectif.
Parce que, franchement, si vous ne trouvez pas votre éditeur de rêve parmi les centaines, sinon les milliers, vous êtes très pointilleux!; -)
Jétais aussi tenté de dire quécrire un éditeur de texte à partir de zéro peut être un peu intimidant pour un débutant; disons que cest une tâche de niveau intermédiaire: un peu difficile pour un débutant absolu, faisable une fois vous avez de lexpérience.
Cela dit, jai écrit mon propre éditeur de texte alors que jétais encore un débutant: fraîchement sorti de luniversité, codé seulement un peu en C, sans réel projet. Mais jétais sur un PC avec SCO Unix nayant que vi comme éditeur. Et je ne laime pas à cause de ses deux modes (navigation vs édition) qui me déroutent toujours (commencer à taper, ne voir mon texte quaprès le premier i …).
Jai donc commencé à coder mon éditeur en C, en utilisant Curses comme interface, en créant mes propres structures de données (probablement inefficaces, mais nous avons traité de petits fichiers à lépoque), etc.
Je me suis beaucoup amusé, jai beaucoup appris, et quand dautres utilisateurs ont commencé à lutiliser aussi, jai découvert quils faisaient toujours des choses inattendues, comme mélanger des onglets et des espaces … 🙂
Encore une fois, si vous êtes un débutant total, vous devriez commencer par des projets plus petits, pour en apprendre davantage sur les bases du langage (boucles, tableaux, etc.), sur les structures de données, comment lire et écrire des fichiers texte, etc.
Il est difficile de conseiller pour un seul langage … Pour un projet basé sur JVM, jutiliserais Ceylon, peut-être avec JavaFX ou SWT. Pour un projet « proche du métal », jutiliserais Rust (il y a un projet de départ sur lécriture dun éditeur de texte dans Rust, semble prometteur), tandis que dautres conseilleraient dutiliser C ++ (ce qui peut être accablant pour un débutant!). Pour un langage plus simple, Lua conviendrait peut-être (dautres conseilleraient dutiliser Python, mais je nai aucune expérience avec lui). Ou peut-être JavaScript, avec Node.js et la plate-forme Electron, une option tendance … (Atom, Visual Studio Code et Brackets ont été écrits avec ça. Mais cest à peine « à partir de zéro » car ils utilisent des éditeurs de code JS existants. )
Conseil général: commencez par concevoir votre structure de données (la stratégie en deux parties utilisée par le projet Scintilla est bonne; les cordes, telles quutilisées par le projet Rust, sont un peu plus / trop avancées), comment vous manipulez des données: comment ajouter ou supprimer un caractère, une ligne, une sélection, etc.
Pensez ensuite à linterface utilisateur. Idéalement, séparez les deux (traitement et affichage des données). De cette façon, un jour vous pouvez changer la cible de linterface utilisateur (de Swing à JavaFX, de GTK + à Qt, peu importe) avec peu ou pas de changements à votre logique de base. Bon pour la portabilité.