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.


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)
        "")))))


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.