2010-05-29 17 views
5

Utilizo la sintaxis triple de Doxygen para marcar mi código C++. Hay dos casos importantes que surgen:Emacs ocultar/mostrar soporte para C++ triple-slash Doxygen marcado?

1) comentarios de marcado de bloque que son el único elemento en la línea y pueden o no pueden comenzar a ras del lado izquierdo; p.ej.

class foo 
/// A one sentence brief description of foo. The elaboration can 
/// continue on for many lines. 
{ 
    ... 
}; 

void foo::bar 
    /// A one sentence brief description of bar. The elaboration can 
    /// continue on for many lines. 
    () const 
{ 
    ... 
} 

2) arrastra comentarios de marca que siempre sigue algunas número de C++ tokens anteriormente en la primera línea, pero todavía puede desbordarse sobre las posteriores; p.ej.

class foo 
{ 
    int _var1;     ///< A brief description of _var1. 
    int _var2;     ///< A brief description of _var2 
           ///< requiring additional lines. 
} 

void foo::bar 
    (int arg1     ///< A brief description of arg1. 
    , int arg2     ///< A brief description of arg2 
           ///< requiring additional lines. 
    ) const 
{ 
    ... 
} 

Me pregunto qué compatibilidad con ocultar/mostrar existe para tratar con estas convenciones. Los casos más importantes son los comentarios de marcado de bloque. Lo ideal sería como para poder eliminarlos por completo, lo que significa que preferiría no perder una línea simplemente para indicar la presencia de un comentario de marcado de bloque doblado , prefiriendo un marcador marginal, a la hideshowvis.el.

Respuesta

3

Tal vez, como una respuesta parcial, el siguiente fragmento de código sería el truco. Presione M-s M-s en modo C++ y oculta todos los comentarios del tipo que describió. Nuevamente presionando M-s M-s revela los comentarios nuevamente. Sé que el código abreviado tiene sus limitaciones:

  1. Sería bueno si uno pudiera ocultar/mostrar cada comentario especial por separado.

  2. Dado que todos los comentarios especiales están ocultos, necesitaría M-s M-s con bastante frecuencia. Por lo tanto, hs1-mode debería ser más efectivo en archivos grandes de C++ (tal vez, debería estar implementado a través de jit-font-lock).

  3. Las líneas consecutivas de comentarios especiales se deben unir a un bloque oculto.


(defvar hs1-regexp 
    "\\(\n[[:blank:]]*///\\|///<\\).*$" 
    "List of regular expressions of blocks to be hidden.") 

(define-minor-mode hs1-mode 
    "Hide/show predefined blocks." 
    :lighter " hs1" 
    (if hs1-mode 
     (let (ol) 
    (save-excursion 
     (goto-char (point-min)) 
     (while (search-forward-regexp hs1-regexp nil 'noErr) 
     (when (eq (syntax-ppss-context (syntax-ppss (match-end 1))) 'comment) 
      (setq ol (make-overlay (match-beginning 0) (match-end 0))) 
      (overlay-put ol 'hs1 t) 
      (overlay-put ol 'invisible t) 
     )))) 
    (remove-overlays (point-min) (point-max) 'hs1 t) 
    )) 

(add-hook 'c++-mode-hook '(lambda() (local-set-key (kbd "M-s M-s") 'hs1-mode))) 
+0

muchas gracias. Esto logra exactamente lo que yo quería. –

+0

Por alguna razón, no sucede nada cuando presiono Alt + s (una o dos veces), pero puedo cambiar al modo haciendo Alt + x hs1-mode. – AlwaysLearning