Y a-t-il un yasnippet produisant un commentaire doxygen pré-rempli?

10

Pour la fonction C ++ suivante:

bool importantStuff(double a, double b);

Il devrait sortir l'extrait suivant, peut-être sans les balises:

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

J'ai regardé autour du net, mais le plus proche que j'ai obtenu d'une réponse est cette vieille question SO où la réponse dépend du mode doxymacs plus maintenu.

Rovanion
la source
Je pense qu'il y c-sharp-modea quelque chose qui fait ça.
erikstokes
Voulez-vous le faire pour de nouvelles fonctions ou pour des fonctions existantes?
itsjeyd
En posant la question, je pensais au commentaire doxygen généré à partir de la signature de la fonction.
Rovanion

Réponses:

4

J'utilise ce qui suit qui est un mashup du doxymacs standard basé sur celui basé sur abo-abo et déjà mentionné comme réponse - cela ne nécessite que la sémantique et le yasnippet. Cela préremplit également quelques-uns des espaces réservés yasnippet avec des informations pertinentes par rapport à la version d'abo-abo.


# -*- 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
la source
Cette solution fonctionne absolument, mais avoir à attendre le mode sémantique pour parcourir tout le code requis est légèrement lourd. J'ai également eu des emacs coincés dans des boucles sans fin si j'écris dox <tab> avant une variable à la place. Mais on ne peut pas tout avoir dans ce monde: D
Rovanion
cela devrait être voté plus haut que ce qui précède, car il est plus riche que moo-doxygen
Alejandro Erickson
3

Je viens d'ajouter cette fonctionnalité aux arguments de fonction .

Voici le code, si vous êtes intéressé. Il utilise 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))))

Vous avez également besoin d'un auto-yasnippet . Les deux packages sont disponibles dans MELPA.

abo-abo
la source