Emacs: destacando TODO*solo*en los comentarios
comments elisp (3)
Esta pregunta está relacionada con otra, indicador de Emacs: TODO en el lado izquierdo . Recientemente encontré un modo menor que me gusta mucho llamado FixmeMode . Admite el resaltado automático de las marcas TODO y la navegación entre ellas. Sin embargo, creo que tiene más sentido reconocer las cadenas "TODO" solo en los comentarios, en lugar de contaminar todo el archivo. ¿Es posible?
Echa un vistazo a la biblioteca fic-mode.el , que se ha verificado en C ++ y Emacs-Lisp.
Fue escrito específicamente para responder a esta pregunta.
La instalación es como cualquier paquete estándar:
(require ''fic-mode)
(add-hook ''c++-mode-hook ''turn-on-fic-mode)
Aunque pidió una forma fácil de agregarlo a múltiples modos, así que aquí va:
(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)
Es posible pero un poco más complicado. El modo Fixme utiliza font-lock
para hacer su resaltado, por lo que funciona como usted lo escribe para resaltar las palabras clave. El bloqueo de fuente se enlaza a un nivel muy bajo, básicamente se ejecuta después de cada cambio realizado en el contenido del búfer. Sin embargo, está altamente optimizado, lo que le permite aparecer instantáneamente en las computadoras modernas.
El indicador TODO en la franja izquierda es estático. Ejecute la función y se resaltan todos los TODO actuales; cambiar el búfer (agregar o eliminar TODO) no cambia el indicador de franja; eso solo cambia cuando la función se ejecuta de nuevo.
Su enfoque tendría que ingresar a las tablas de sintaxis, determinando primero cuándo está en un comentario y luego buscando las palabras clave. La parte difícil viene al hacer esto de manera interactiva (es decir, a medida que escribe). Debería poder enlazar las construcciones de font-lock
para hacer esto, pero la función que proporcione para buscar la tabla de sintaxis de comentarios y luego las palabras clave será muy eficiente, ya que se ejecutará cada vez que cambie un búfer. (aunque solo se ejecutará en la región modificada, creo). Desearía rellenar todo esto en font-lock-syntactic-keywords
lugar de font-lock-keywords
porque el paso de syntactic-keyword pasa antes del paso de syntactic (que sucede antes de la palabra clave pass), y debe establecer TODO dentro comentarios antes de que se establezcan los comentarios.
Lo siento, no es una respuesta completa de código de trabajo .....
Tal vez esto ayude: hay un fn c-in-literal
en cc-mode, y un csharp-in-literal
similar en csharp mode. El valor de retorno es c
si en un comentario de estilo C, c++
si está en un comentario de estilo C ++. Puede agregar eso al código de Emacs: TODO en el lado izquierdo para obtener lo que desea.
(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))))))))))