2010-10-04 6 views
4

Je veux savoir l'idée d'éditeurs de texte avancés des fonctionnalités telles que la mise en évidence de texte, la complétion de code, l'indentation automatique, etc.L'idée de texte en surbrillance, la complétion de code, etc. dans la programmation

Pour faire mon idée claire je pense que la mise en évidence du texte est la lecture du texte entier dans une chaîne, puis le remplacement d'expression régulière des mots-clés avec des mots-clés + codes de couleur et de remplacer le texte à nouveau. Cela semble logique mais il serait tellement inefficace de le faire à chaque frappe lorsque votre fichier est de 4000 lignes par exemple! Donc, je veux connaître l'idée de la mise en œuvre d'une telle chose en C# par exemple (toute autre langue serait bien aussi mais c'est ce que j'expérimente en ce moment). Je pense par exemple à

+0

Voulez-vous dire "mise en œuvre" plutôt que "l'idée"? – BoltClock

+0

Lors de la numérisation pour l'achèvement, il suffit de revenir en arrière d'où ils tapent jusqu'à ce que vous frappiez des espaces ou un caractère spécial, car ce serait le début de ce qu'ils sont en train de taper. '5 + mushroom' Le bit" 5 + "peut être ignoré, car aucun nom de variable/fonction ne contient d'espaces ou un +. – TaslemGuy

+0

+1 Bonne question, je me suis demandé la même chose ces derniers temps – helpermethod

Répondre

1

La mise en évidence de la syntaxe: This me vient en tête. Je n'ai pas vraiment essayé l'exemple, donc je ne peux rien dire sur la performance, mais il semble que ce soit la manière la plus simple d'obtenir une mise en évidence de la syntaxe de base.

Auto-complétion: Étant donné une liste de mots-clés possibles (qui pourraient être filtrés en fonction du contexte), vous pouvez rapidement éliminer tout ce qui ne correspond pas à ce que l'utilisateur est en cours de frappe. Dans la plupart des langues, vous pouvez vous limiter à un «mot», puisque les espaces ne sont généralement pas légaux dans un identifiant. Par exemple, si je commence à taper "li", la base de données d'auto-complétion peut rejeter tout ce qui ne commence pas par les lettres 'l' et 'i' (en ignorant la casse). Au fur et à mesure que l'utilisateur continue à taper, de plus en plus d'options peuvent être supprimées jusqu'à ce qu'il n'en reste plus qu'une ou, du moins, quelques-unes. Puisque vous regardez juste un mot à la fois, ce serait très rapide en effet.

Indentation: Une approche rapide et sale qui (genre de) travailler dans les langues de type C est d'avoir un compteur qui vous incrémenter une fois pour chaque « { » et décrément une fois pour toutes « } '. Lorsque vous appuyez sur Entrée pour commencer une nouvelle ligne, le niveau d'indentation est alors counter * indentWidth, où indentWidth est un nombre constant d'espaces ou d'onglets à indenter. Cela souffre d'un sérieux inconvénient, mais - considérer les points suivants:

if(foo) 
    bar(); // This line should be indented, but how does the computer know? 

Pour faire face à cela, vous pouvez rechercher des lignes qui se terminent par un «) », et non un point-virgule.

1

Une ressource ancienne mais toujours applicable pour les composants internes de l'éditeur est The Craft of Text Editing. Le chapitre 7 aborde la question des stratégies de redisplay directement.

1

Afin de faire une mise en évidence de la syntaxe "avancée" - c'est-à-dire, mettre en évidence qui nécessite des connaissances contextuelles, un analyseur est souvent nécessaire. La plupart des parseurs sont construits sur une sorte de formal grammar qui existent dans diverses variétés: LL, LALR, et LR sont communs.

Cependant, la plupart des parseurs fonctionnent sur des fichiers entiers, ce qui est assez inefficace pour l'édition de texte, donc nous nous tournons plutôt vers incremental parsers. Les parseurs incrémentaux utilisent la connaissance de la langue et la structure de ce qui a été précédemment traité afin de refaire le moins de travail possible.

Voici quelques références à l'analyse incrémentale:

Questions connexes