함수와 변수에서 docstring을 검색하는 방법?


11

일치하는 파일의 sexps에서 docstring을 검색하는 함수를 작성하려고합니다 (def.*).

정의 된 변수뿐만 아니라 모든 함수 / 매크로를 검색 할 수 있기를 원합니다. 변수의 경우 docstring을 원하지만 모든 함수의 경우 인수 목록도 필요합니다.


1
명확히하기 위해 : Elisp 소스 파일이 있습니까 (내 해석), 현재 Emacs 환경에 여러 변수 및 기능이 있습니까 (Constantine의 해석)? 그리고 첫 번째 해석 (def…)이라면, 최상위 사양뿐만 아니라 모든 sexps 를 정말로 원 하십니까? 또는 파일이로드 된 경우 정의 될 함수 및 변수의 중간 해석? 또는)와 같은 최상위 양식을 포함하는 좀 더 편안한 정의 (when nil (defun …))입니까?
Gilles 'SO- 악마 그만해

나는 처음에 첫 번째를 원했지만 Constantine의 해석에 따라 필요한 기능을 갖춘 기능 구현을 얻을 수있었습니다. 목표는 문서 열을 기반으로 elisp 소스를 문서 (Org로 작성)로 변환하는 것입니다.
Jonathan Leech-Pepin

두 번째 해석에서는 내장 describe-function및 친구가 원하는 것 (docstring 및 arguments list)의 상당 부분을 수행합니다.
T. Verron

답변:


10

이미 환경에있는 함수 및 변수에 대한 정보를 얻는 것이 목표 인 경우 :

  • 함수 및 매크로의 docstring에 대해서는 함수를 참조하십시오 documentation.

  • 가변 docstring의 경우 documentation-property;를 사용하십시오 . 예를 들면 다음과 같습니다.

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • 기능 arity 및 인수 목록은 이 Emacs.SE 질문 , 답변 및 질문에 대한 주석을 참조하십시오.

( C-h k C-h f소스 코드를 누르고 스키밍하여 describe-function(가변 docstring과 동일하지만 공부하고 있음 describe-variable) 이것을 발견했습니다 .)

Emacs Lisp 소스 코드 파일을 분석하려면 최상위 def.*양식 에 대한 정보를 얻는 것이 목표라고 가정 하면 다음과 유사한 작업을 수행 할 수 있습니다.

(defun get-defun-info (buffer)
  "Get information about all `defun' top-level sexps in a buffer
BUFFER. Returns a list with elements of the form (symbol args docstring)."
  (with-current-buffer buffer
    (save-excursion
      (save-restriction
        (widen)
        (goto-char (point-min))
        (let (result)
          ;; keep going while reading succeeds
          (while (condition-case nil
                     (progn
                       (read (current-buffer))
                       (forward-sexp -1)
                       t)
                   (error nil))
            (let ((form (read (current-buffer))))
              (cond
               ((not (listp form))      ; if it's not a list, skip it
                nil)
               ((eq (nth 0 form) 'defun) ; if it's a defun, collect info
                (let ((sym (nth 1 form))
                      (args (nth 2 form))
                      (doc (when (stringp (nth 3 form)) (nth 3 form))))
                  (push (list sym args doc) result))))))
          result)))))

이것은 쉽게 확장 할 수 있습니다 defvar, defconst

처리하기 위해 defun나타나는 내부 최상위 폼 하나는 내려 것 으로 가능 재귀를 사용하여, 이러한 양식.


2
독자에게이 정보를 찾는 방법을 알려주는 +1 그것은 당신이 가르친 두 사람의 더 중요한 교훈입니다.
Drew

그것은 우리가 이상한 상황에 나타납니다 @ 드류 :이 사이트의 목적 자체가 쓸모 만드는 것입니다 ...이 : 채팅에서 흥미로운 토론 할 것
숀 알 레드

4
@SeanAllred 사람들에게 배우도록 가르치는 것은 질문을 멈추지 않으며 단지 더 나아지게합니다.
Malabarba

3
Malabarba +1 이 사이트의 목적은 (IMHO) Emacs 자체가 대답 할 수 없거나 또는 쉽게 대답 할 수없는 것에 대답하는 것이어야합니다 . 유추 : 사이트 영어 및 사용의 경우 질문을 마치는 이유는 " 일반적으로 사용 가능한 참조를 사용하여 답변 할 수있는 질문이 주제를 벗어난 것 *" 이기 때문입니다 . (StackOverflow도 비슷합니다.) 우리는 Emacs 자체가 대답 할 수있는 질문은 주제가 맞지 않다고 말하면서 극단적 인 것은 아니지만 사용자가 먼저 답을 찾도록하십시오 . 우리의 경우에는 Emacs에게 물어 보는 것 입니다.
Drew

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