미리 채워진 독소 주석을 생성하는 yasnippet이 있습니까?


10

다음 C ++ 함수의 경우 :

bool importantStuff(double a, double b);

태그없이 다음과 같은 스 니펫을 출력해야합니다.

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

나는 인터넷을 둘러 보았지만 대답에 가장 가까운 것은 오래된 SO 질문입니다.이 답변은 더 이상 유지 관리되지 않는 doxymacs 모드에 달려 있습니다.


나는 이것을하는 c-sharp-mode무언가가 있다고 생각 합니다.
erikstokes

새로운 기능이나 기존 기능에 대해이 작업을 수행 하시겠습니까?
itsjeyd 2019

질문을 할 때 함수의 서명에서 생성되는 doxygen 주석에 대해 생각하고있었습니다.
Rovanion

답변:


4

나는 표준 doxymacs 기반 하나와 abo-abo의 의미 기반 기반의 매시업을 이미 대답으로 언급 한 다음을 사용합니다. 이는 의미론과 yasnippet 만 필요합니다. 이것은 abo-abo의 버전과 비교할 때 관련 정보가있는 yasnippet 자리 표시 자 중 일부를 미리 채 웁니다.


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


이 솔루션은 절대적으로 작동하지만 의미있는 모드가 필요한 모든 코드를 통과 할 때까지 기다려야하는 것은 약간 성가시다. 변수 앞에 dox <tab>을 쓰면 이맥스가 무한 루프에 빠졌습니다. 그러나이 세상에서 모든 것을 가질 수는 없습니다 : D
Rovanion

이것은 moo-doxygen보다 풍부하기 때문에 상기보다 더 높은 표를 받아야합니다.
Alejandro Erickson

3

이 기능을 function-args에 추가했습니다 .

관심있는 코드는 다음과 같습니다. 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))))

auto-yasnippet 도 필요합니다 . 두 패키지 모두 MELPA로 제공됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.