Gibt es einen Yasnippet, der einen vorab ausgefüllten Sauerstoffkommentar erzeugt?

10

Für die folgende C ++ - Funktion:

bool importantStuff(double a, double b);

Es sollte das folgende Snippet ausgeben, möglicherweise ohne die Tags:

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

Ich habe mich im Internet umgesehen , aber am nächsten an einer Antwort ist diese alte SO-Frage, deren Antwort vom nicht mehr gepflegten Doxymacs-Modus abhängt.

Rovanion
quelle
Ich denke, c-sharp-modehat etwas, das dies tut.
Erikstokes
Möchten Sie dies für neue oder vorhandene Funktionen tun?
Itsjeyd
Als ich die Frage stellte, dachte ich an den Sauerstoffkommentar, der aus der Signatur der Funktion generiert wurde.
Rovanion

Antworten:

4

Ich verwende das Folgende, das ein Mashup des Standard-Doxymacs-basierten und des Abo-Abo-Semantik-basierten ist, das bereits als Antwort erwähnt wurde - dies erfordert nur Semantik und Yasnippet. Dies füllt einige weitere Yasnippet-Platzhalter mit relevanten Informationen vor, verglichen mit der Version von 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
quelle
Diese Lösung funktioniert absolut, aber es ist etwas umständlich, warten zu müssen, bis der semantische Modus den gesamten erforderlichen Code durchläuft. Ich hatte auch Emacs, die in Endlosschleifen stecken blieben, wenn ich stattdessen dox <tab> vor eine Variable schreibe. Aber man kann nicht alles auf dieser Welt haben: D
Rovanion
Dies sollte höher als oben gewählt werden, da es reicher als Moo-Sauerstoff ist
Alejandro Erickson
3

Ich habe diese Funktion gerade zu function-args hinzugefügt .

Hier ist der Code, wenn Sie interessiert sind. Es verwendet 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))))

Sie benötigen auch Auto-Yasnippet . Beide Pakete sind in MELPA verfügbar.

abo-abo
quelle