Apakah ada yasnippet yang menghasilkan komentar doxygen terpopulasi?

10

Untuk fungsi C ++ berikut:

bool importantStuff(double a, double b);

Seharusnya menampilkan cuplikan berikut, mungkin tanpa tag:

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

Saya telah mencari-cari di internet, tetapi jawaban terdekat yang saya dapatkan adalah pertanyaan SO lama ini di mana jawabannya tergantung pada mode doxymacs yang tidak lagi dipertahankan.

Rovanion
sumber
Saya pikir c-sharp-modeada sesuatu yang melakukan ini.
erikstokes
Apakah Anda ingin melakukan ini untuk fungsi baru atau yang sudah ada?
itsjeyd
Ketika mengajukan pertanyaan, saya berpikir tentang komentar doxygen yang dihasilkan dari tanda tangan fungsi.
Rovanion

Jawaban:

4

Saya menggunakan yang berikut ini yang merupakan gabungan dari standar doxymacs berbasis satu dan semantik abo-abo yang disebutkan sebagai jawaban sudah - ini hanya memerlukan semantik dan yasnippet. Ini pra-mengisi beberapa placeholder yasnippet dengan info yang relevan juga dibandingkan dengan versi abo-abo juga.


# -*- 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
sumber
Solusi ini benar-benar berfungsi, tetapi harus menunggu mode semantik untuk menembus semua kode yang diperlukan sedikit rumit. Saya juga punya emacs terjebak dalam loop tanpa akhir jika saya menulis dox <tab> sebelum variabel sebagai gantinya. Tetapi seseorang tidak dapat memiliki segalanya di dunia ini: D
Rovanion
ini harus dipilih lebih tinggi daripada yang di atas, karena lebih kaya daripada moo-doxygen
Alejandro Erickson
3

Baru saja menambahkan fitur ini ke function-args .

Ini kodenya, jika Anda tertarik. Ini menggunakan 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))))

Anda juga perlu yasnippet otomatis . Kedua paket tersedia dalam MELPA.

abo-abo
sumber