Có một yasnippet tạo ra một nhận xét doxygen được chuẩn bị trước?


10

Đối với chức năng C ++ sau:

bool importantStuff(double a, double b);

Nó sẽ xuất đoạn mã sau, có lẽ không có các thẻ:

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

Tôi đã tìm kiếm trên mạng, nhưng câu trả lời gần nhất mà tôi nhận được là câu hỏi SO cũ này trong đó câu trả lời phụ thuộc vào chế độ doxymacs không còn được duy trì.


Tôi nghĩ rằng c-sharp-modecó một cái gì đó làm điều này.
erikstokes

Bạn có muốn làm điều này cho các chức năng mới hoặc những chức năng hiện có?
itjeyd 6/2/2015

Khi đặt câu hỏi tôi đã suy nghĩ về nhận xét doxygen được tạo ra từ chữ ký của hàm.
Rovmate 6/2/2015

Câu trả lời:


4

Tôi sử dụng sau đây là một bản hòa trộn của các doxymac tiêu chuẩn dựa trên một và một ngữ nghĩa dựa trên ngữ nghĩa của abo-abo đã được đề cập như một câu trả lời - điều này chỉ yêu cầu ngữ nghĩa và yasnippet. Điều này đã điền trước một số chỗ dành cho yasnippet với thông tin liên quan cũng như so với phiên bản của 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)
        "")))))


Giải pháp này hoàn toàn hoạt động, nhưng phải chờ chế độ ngữ nghĩa để chug qua tất cả các mã yêu cầu thì hơi cồng kềnh. Tôi cũng đã có emacs bị mắc kẹt trong các vòng lặp vô tận nếu tôi viết dox <tab> trước một biến. Nhưng người ta không thể có mọi thứ trên thế giới này: D
Rovmate 19/2/2015

điều này nên được bình chọn cao hơn so với ở trên, vì nó giàu hơn moo-doxygen
Alejandro Erickson

3

Chỉ cần thêm tính năng này vào chức năng-args .

Đây là mã, nếu bạn quan tâm. Đó là sử dụng 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))))

Bạn cũng cần tự động yasnippet . Cả hai gói đều có sẵn trong MELPA.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.