Questa domanda è correlata a un'altra, Emacs :TODO indicator at left side. Recentemente mi sono imbattuto in una modalità minore che mi piace molto chiamata FixmeMode. Supporta l'evidenziazione automatica dei segni TODO e la navigazione tra di essi. Tuttavia, penso che abbia più senso riconoscere le stringhe "TODO" solo nei commenti, piuttosto che inquinare l'intero file. È possibile?Emacs: evidenziando TODO * solo * nei commenti
risposta
Partenza biblioteca fic-mode.el, è stato verificato in C++ e Emacs-Lisp.
E 'stato scritto appositamente per rispondere a questa domanda.
L'installazione è come qualsiasi pacchetto standard:
(require 'fic-mode)
(add-hook 'c++-mode-hook 'turn-on-fic-mode)
Anche se Wei Hu ha chiesto di un modo semplice per aggiungerlo alla molteplici modalità, quindi ecco qui:
(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)
È possibile ma è un po 'più complicato. La modalità Fixme utilizza font-lock
per evidenziare le parole chiave, in modo che funzioni in base al tipo di utente. Il blocco dei font si aggancia a un livello molto basso, in pratica dopo ogni modifica apportata al contenuto del buffer. È altamente ottimizzato, tuttavia, il che gli consente di apparire istantaneo sui computer moderni.
L'indicatore TODO nella frangia sinistra è statico. Esegui la funzione e tutti i TODO correnti sono evidenziati; cambiare il buffer (aggiungendo o rimuovendo TODO) non cambia l'indicatore della frangia; questo è cambiato solo quando la funzione viene eseguita di nuovo.
Il tuo approccio dovrebbe entrare nelle tabelle di sintassi, determinando prima quando sei in un commento e poi cercando le parole chiave. La parte difficile arriva a farlo in modo interattivo (cioè mentre scrivi). Dovresti essere in grado di collegarti ai costrutti font-lock
per fare ciò, ma la funzione che fornisci per cercare la tabella di sintassi dei commenti e quindi per le parole chiave sarà molto efficiente, poiché verrà eseguita ogni volta che cambia un buffer (sebbene penso che funzionerà solo sulla regione cambiata). Si consiglia di inserire tutto questo in font-lock-syntactic-keywords
anziché font-lock-keywords
perché il passaggio parola chiave sintattica si verifica prima del passaggio sintattico (che avviene prima del passaggio parola chiave) e occorre impostare TODO nei commenti prima che vengano impostati i commenti.
Ci dispiace non è una risposta completa di lavoro-codice .....
Wow. Questo è molto più complicato che avrei pensato. –
È sia più facile che più complicato di quanto pensassi. Più facile nel senso che l'intero hook di font-lock e il tie-in non sono stati così difficili, ma molto, molto più difficile perché è molto difficile scoprire se si è in un commento. Almeno non sono stato in grado di capirlo fino ad ora. Quindi nessun esempio di codice ancora ... –
Forse questo aiuterà: c'è un fn c-in-literal
in cc-mode, ed un simile csharp-in-literal
in modalità csharp. Il valore di ritorno è c
se in un commento in stile C, c++
se in un commento di stile C++ . Puoi aggiungerlo al codice allo Emacs :TODO indicator at left side per ottenere ciò che desideri.
(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))))))))))
Grazie per la risposta. Mi piacerebbe davvero una risposta che migliora su FixmeMode, perché funziona su base personale, come ha detto @Joe. –
Sì, questo ha senso.Come punto di vista, penso che mettere in evidenza le cose che sono già sullo schermo, non è così utile come fornire un'indicazione visiva della posizione approssimativa di FIXME nel codice sorgente. strumenti di visualizzazione vis fanno questo, così come Eclipse quando mostra errori di compilazione, e anche Visual Studio, penso. L'ho chiesto separatamente: http://stackoverflow.com/questions/2348679/emacs-todo-indicator-on-left-fringe-has-a-strange-side-effect-deleting-charact – Cheeso
Bel lavoro, grazie! Potresti spiegare brevemente come sei riuscito a risolvere questo compito con così poco codice? Inoltre, sarebbe bello avere una variabile personalizzabile 'fic-modes' che può essere usata per definire tutte le modalità abilitate, invece di dover aggiungere alla modalità hook una alla volta. –
@WeiHu Per quanto riguarda il modo in cui è stato risolto con un codice così piccolo, vale la pena semplicemente leggere il codice - font-lock fornisce un framework abbastanza ricco per risolvere il problema. La vera chiave era usare un'impostazione di tipo "font-lock" che chiama una routine (al contrario di una regexp) che determina quali stringhe evidenziare (che sarebbe "fic-search-for-keyword"), e quella routine si limita a verificare che la stringa è in un commento/stringa. –
Quindi stai facendo uso del fatto che stringhe e commenti usano facce di caratteri speciali. Potrebbero esserci falsi positivi? –