¿Hay un yasnippet que produce un comentario de doxygen prepoblado?

10

Para la siguiente función de C ++:

bool importantStuff(double a, double b);

Debería generar el siguiente fragmento, quizás sin las etiquetas:

/**
 * <Insert description of importantStuff>
 *
 * @param a <Insert description of a>
 * @param b <Insert description of b>
 * @return <Insert description of the return value>
 */

He mirado alrededor de la red, pero lo más cerca que he estado de una respuesta es esta vieja pregunta SO donde la respuesta depende del modo doxymacs que ya no se mantiene.

Rovanion
fuente
Creo que c-sharp-modetiene algo que hace esto.
erikstokes
¿Desea hacer esto para funciones nuevas o existentes?
itsjeyd
Al hacer la pregunta, estaba pensando en el comentario de doxygen generado a partir de la firma de la función.
Rovanion

Respuestas:

4

Utilizo lo siguiente, que es un mashup del estándar basado en doxymacs y el basado en semántica de abo-abo que ya se menciona como respuesta, esto solo requiere semántica y yasnippet. Esto rellena previamente algunos de los marcadores de posición de yasnippet con información relevante, en comparación con la versión de abo-abo también.


# -*- mode: snippet -*-
# name: dox
# key: dox
# type: command
# --
(unless (and (fboundp 'semantic-current-tag)
             semantic-mode)
  (error "Semantic required to use dox snippet"))
(let ((tag (senator-next-tag)))
  (while (or (null tag)
             (not (semantic-tag-of-class-p tag 'function)))
    (setq tag (senator-next-tag)))
  (let* ((name (semantic-tag-name tag))
         (attrs (semantic-tag-attributes tag))
         (args (plist-get attrs :arguments))
         (return-name (plist-get attrs :type))
         (idx 1))
    (if (listp return-name)
      (setq return-name (car return-name)))
    (yas/expand-snippet
     (format
      "/**
* @brief ${1:%s}
*
%s
%s*/
"
      name
      (mapconcat
       (lambda (x)
         (format "* @param %s ${%d:Description of %s}"
                 (car x) (incf idx) (car x)))
       args
       "\n")
      (if (and return-name (not (string-equal "void" return-name)))
          (format " * @return ${%d:%s}\n" (incf idx) return-name)
        "")))))

alexmurray
fuente
Esta solución funciona absolutamente, pero tener que esperar a que el modo semántico atraviese todo el código requerido es un poco engorroso. También he tenido emacs atascado en bucles sin fin si escribo dox <tab> antes de una variable. Pero no se puede tener todo en este mundo: D
Rovanion
esto debería ser votado más alto que el anterior, ya que es más rico que el moo-doxygen
Alejandro Erickson
3

Acabo de agregar esta característica a function-args .

Aquí está el código, si estás interesado. Está usando CEDET:

(defun moo-doxygen ()
  "Generate a doxygen yasnippet and expand it with `aya-expand'.
The point should be on the top-level function name."
  (interactive)
  (move-beginning-of-line nil)
  (let ((tag (semantic-current-tag)))
    (unless (semantic-tag-of-class-p tag 'function)
      (error "Expected function, got %S" tag))
    (let* ((name (semantic-tag-name tag))
           (attrs (semantic-tag-attributes tag))
           (args (plist-get attrs :arguments))
           (ord 1))
      (setq aya-current
            (format
             "/**
* $1
*
%s
* @return $%d
*/
"
             (mapconcat
              (lambda (x)
                (format "* @param %s $%d"
                        (car x) (incf ord)))
              args
              "\n")
             (incf ord)))
      (aya-expand))))

También necesitas auto-yasnippet . Ambos paquetes están disponibles en MELPA.

abo-abo
fuente