2010-03-02 12 views

Respuesta

24

Mira la biblioteca fic-mode.el, se ha verificado en C++ y Emacs-Lisp.

Fue escrito específicamente para responder esta pregunta.

La instalación es como cualquier paquete estándar:

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

Aunque Wei Hu hizo pedir una forma fácil de añadir 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) 
+0

¡Buen trabajo, gracias! ¿Podría explicar brevemente cómo logró resolver esta tarea con tan poco código? Además, sería bueno tener una variable personalizable 'fic-modes' que se pueda usar para definir todos los modos habilitados, en lugar de tener que agregar ganchos al modo uno por uno. –

+1

@WeiHu En cuanto a cómo se resolvió con tan poco código, vale la pena simplemente leer el código - font-lock proporciona un marco suficientemente rico para resolver el problema. La clave real era usar una configuración de bloqueo de fuente que llama a una rutina (en lugar de solo una expresión regular) que determina qué cadenas resaltar (que sería ''fic-search-for-keyword'), y esa rutina simplemente verifica que la cadena está en un comentario/cadena. –

+0

Así que está aprovechando el hecho de que las cadenas y los comentarios usan caras de fuente especiales. ¿Podría haber falsos positivos? –

3

Es posible, pero un poco más complicado. El modo Fixme usa font-lock para resaltar, por lo que funciona según el tipo de letra para resaltar las palabras clave. Font-lock se engancha en un nivel muy bajo, básicamente se ejecuta después de cada cambio se realiza 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 el margen izquierdo es estático. Ejecute la función y todos los TODO actuales están resaltados; cambiar el buffer (agregar o eliminar TODO's) no cambia el indicador de flecos; eso solo se cambia cuando la función se ejecuta nuevamente.

Su enfoque tendría que entrar en las tablas de sintaxis, determinar primero cuando se encuentra en un comentario y luego buscar las palabras clave. La parte difícil es hacer esto de manera interactiva (es decir, a medida que escribe). Debería poder engancharse en las construcciones 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á mucho más eficiente, ya que se ejecutará cada vez que cambie un búfer (aunque solo se ejecutará en la región modificada, creo). Desea rellenar todo esto en font-lock-syntactic-keywords en lugar de font-lock-keywords porque la contraseña sintáctica pasa antes del pase sintáctico (que ocurre antes del paso de palabra clave), y debe establecer TODO dentro de los comentarios antes de que se establezcan los comentarios.

sentimos que no es una respuesta de código completo de trabajo .....

+0

Wow. Eso es mucho más complicado de lo que hubiera pensado. –

+0

Es más fácil y más complicado de lo que pensaba. Más fácil en el sentido de que todo el enganche y el enlace de font-lock no eran tan difíciles, pero mucho más difíciles porque es realmente difícil averiguar si estás en un comentario. Al menos no he podido descifrarlo hasta ahora. Así que no hay ningún ejemplo de código todavía ... –

2

Tal vez esto ayude: hay un fn c-in-literal en cc-mode, y similares csharp-in-literal en modo CSharp. El valor de retorno es c si en un comentario de estilo C, c++ si en un comentario de estilo C++ . Puede agregar eso al código en Emacs :TODO indicator at left side 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)))))))))) 
+0

Gracias por su respuesta. Realmente me gustaría una respuesta que mejore el FixmeMode, ya que funciona según el tipo, como dijo @Joe. –

+0

Sí, eso tiene sentido.Como punto secundario, creo que resaltar las cosas que ya están en la pantalla no es tan útil como proporcionar una indicación visual de la ubicación aproximada de FIXME en el código fuente. las herramientas de diferencia visual hacen esto, al igual que Eclipse al mostrar errores de compilación, y Visual Studio, también, creo. Pregunté sobre eso por separado: http://stackoverflow.com/questions/2348679/emacs-todo-indicator-on-left-fringe-has-a-strange-side-effect-deleting-charact – Cheeso

Cuestiones relacionadas