2010-03-02 4 views
17

Cette question est liée à l'autre, Emacs :TODO indicator at left side. Je suis récemment tombé sur un mode mineur que j'aime beaucoup appelé FixmeMode. Il prend en charge la surbrillance automatique des repères TODO et de naviguer entre eux. Cependant, je pense qu'il est plus logique de reconnaître les chaînes "TODO" seulement dans les commentaires, plutôt que de polluer le fichier entier. C'est possible?Emacs: en surbrillance TODO * seulement * dans les commentaires

Répondre

24

la biblio fic-mode.el, il a été vérifié en C++ et Emacs Lisp.

Il a été écrit spécifiquement pour répondre à cette question.

L'installation est comme tout paquet standard:

(require 'fic-mode) 
(add-hook 'c++-mode-hook 'turn-on-fic-mode) 

Bien que Wei Hu ne demande un moyen facile d'ajouter à plusieurs modes, va ici:

(defun add-something-to-mode-hooks (mode-list something) 
    "helper function to add a callback to multiple hooks" 
    (dolist (mode mode-list) 
    (add-hook (intern (concat (symbol-name mode) "-mode-hook")) something))) 

(add-something-to-mode-hooks '(c++ tcl emacs-lisp) 'turn-on-fic-mode) 
+0

Beau travail, merci! Pourriez-vous expliquer brièvement comment vous avez réussi à résoudre cette tâche avec si peu de code? En outre, il serait bien d'avoir une variable personnalisable 'fic-modes' qui peut être utilisée pour définir tous les modes activés, au lieu d'avoir à ajouter au mode hooks un par un. –

+1

@WeiHu Quant à savoir comment il a été résolu avec si peu de code, cela vaut la peine de lire le code - font-lock fournit un cadre assez riche pour résoudre le problème. La vraie clé était d'utiliser un paramètre de verrouillage de police qui appelle une routine (par opposition à une expression rationnelle) qui détermine les chaînes à mettre en évidence (ce qui serait "fic-search-for-keyword"), et cette routine vérifie juste que la chaîne est dans un commentaire/une chaîne. –

+0

Vous utilisez donc le fait que les chaînes et les commentaires utilisent des polices spéciales. Pourrait-il y avoir des faux positifs? –

3

C'est possible mais un peu plus compliqué. Le mode Fixme utilise font-lock pour faire sa mise en surbrillance, de sorte qu'il fonctionne au fur et à mesure pour mettre en surbrillance les mots-clés. Font-lock se bloque à un niveau très bas, essentiellement après chaque modification apportée au contenu du tampon. Il est hautement optimisé, ce qui lui permet d'apparaître instantanément sur les ordinateurs modernes.

L'indicateur TODO dans la frange gauche est statique. Exécuter la fonction et tous les TODO actuels sont en surbrillance; changer le tampon (ajouter ou supprimer des TODO) ne change pas l'indicateur de frange; c'est seulement changé quand la fonction s'exécute à nouveau.

Votre approche devrait entrer dans les tables de syntaxe, en déterminant d'abord quand vous êtes dans un commentaire et ensuite en cherchant les mots-clés. La partie délicate vient de le faire de manière interactive (c'est-à-dire lorsque vous tapez). Vous devriez être en mesure de vous connecter aux constructions font-lock pour ce faire, mais la fonction que vous fournissez pour rechercher la table de syntaxe des commentaires, puis pour les mots-clés, sera très efficace car elle sera exécutée chaque fois qu'un tampon change (bien que il ne fonctionnera que sur la région changée, je pense). Vous devez placer tout cela dans font-lock-syntactic-keywords plutôt que font-lock-keywords car la passe de mot-clé syntaxique se produit avant la passe syntaxique (qui se produit avant le mot-clé passe) et vous devez définir TODO dans les commentaires avant que les commentaires eux-mêmes soient définis.

Désolé ce n'est pas une réponse complète code de travail .....

+0

Wow. C'est beaucoup plus délicat que j'aurais pensé. –

+0

C'est à la fois plus facile et plus délicat que je ne le pensais. Plus facile dans le sens où tout le crochet de font-lock et tie-in n'était pas si difficile, mais bien plus difficile car il est vraiment difficile de savoir si vous êtes dans un commentaire. Au moins, je n'ai pas été capable de le comprendre jusqu'à présent. Donc, pas encore d'exemple de code ..... –

2

Peut-être que cela va aider: il y a une note de bas c-in-literal dans cc-mode, et un csharp-in-literal similaire en mode csharp. La valeur de retour est c si dans un commentaire de style C, c++ si dans un commentaire de style C++ . Vous pouvez ajouter cela au code Emacs :TODO indicator at left side pour obtenir ce que vous voulez.

(defun annotate-todo() 
    "put fringe marker on TODO: lines in the curent buffer" 
    (interactive) 
    (let (lit) 
    (save-excursion 
    (goto-char (point-min)) 
    (while (re-search-forward "TODO:" nil t) 
     (progn 
     (setq lit (c-in-literal)) ;; or csharp-in-literal 
     (if (or (eq lit 'c) (eq lit 'c++)) 
      (let ((overlay (make-overlay (- (point) 5) (point)))) 
       (overlay-put overlay 'before-string 
          (propertize "A" 
             'display 
             '(left-fringe ;; right 
             horizontal-bar 
             better-fringes-important-bitmap)))))))))) 
+0

Merci pour votre réponse. Je voudrais vraiment une réponse qui améliore sur le mode Fixme, car cela fonctionne sur une base de type, comme l'a dit @Joe. –

+0

Oui, cela a du sens.En passant, je pense que mettre en évidence les choses qui sont déjà à l'écran n'est pas aussi utile que de fournir une indication visuelle de l'emplacement approximatif de FIXME dans le code source. Les outils de diff visuel font cela, tout comme Eclipse lorsqu'il montre des erreurs de compilation, et Visual Studio aussi, je pense. J'ai demandé à ce sujet séparément: http://stackoverflow.com/questions/2348679/emacs-todo-indicator-on-left-fringe-has-a-strange-side-effect-deleting-charact – Cheeso

Questions connexes