Як отримати документи з функцій та змінних?


11

Я намагаюся записати функцію, яка буде витягувати документи з будь-яких секпсів у файл, який відповідає (def.*).

Я хочу, щоб обидва могли отримати будь-які функції / макроси, а також будь-які визначені змінні. Для змінних я б хотів docstring, тоді як для будь-яких функцій я також хотів би список аргументів.


1
Для уточнення: чи є у вас вихідний файл Elisp (моя інтерпретація) чи у вас є маса змінних та функцій у поточному середовищі Emacs (інтерпретація Константина)? І якщо з першої інтерпретації, чи справді ви хочете, щоб усі (def…)сексопи, а не лише специфікації найвищого рівня? Або проміжна інтерпретація функцій та змінних, які були б визначені, якщо файл завантажений? Або більш спокійне визначення, яке включає такі форми вищого рівня, як (when nil (defun …)))?
Жил "ТАК - перестань бути злим"

Я спочатку хотів першого, однак на основі трактування Костянтина я зміг отримати функціональну реалізацію, яка отримала мені те, що мені потрібно. Мета - перетворити джерело elisp в документацію (написану в Org) на основі Docstrings.
Джонатан Ліч-Пепін

З другою інтерпретацією, вбудовані describe-functionта друзі роблять досить хорошу частину того, що ви хочете (docstring та аргумент список).
Т. Веррон

Відповіді:


10

Якщо мета - отримати інформацію про функції та змінні, які вже знаходяться в оточенні :

  • Документи про функції та макроси див. У documentationфункції.

  • Для змінних доктринів використовуйте documentation-property; наприклад:

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • Інформацію про суворість функції та список аргументів див. У цьому питанні , відповіді та коментарях до Emacs.SE та коментарях до цього питання.

(Я виявив це, натиснувши C-h k C-h fта знежиривши вихідний код describe-function(те саме для змінних документів, але вивчаючи 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 Навчання людей вчитися не зупиняє питань, а лише покращує їх.
Малабарба

3
+1 до Малабарби. Метою цього сайту (IMHO) має бути відповідь на те, що сам Emacs не може відповісти або не відповідає добре чи легко . Аналогія. Для веб-сайту англійська мова та використання причиною закриття питань є те, що " Питання, на які можна відповісти, використовуючи загальнодоступні посилання , поза темою". (StackOverflow схожий.) Нам не потрібно бути настільки екстремальними, кажучи, що питання, на які може відповісти сам Emacs, є поза темою , але повинна застосовуватися та ж ідея: змусити користувачів спробувати знайти відповідь першими . У нашому випадку це означає, запитавши Emacs .
Дрю

@Drew Fair points :)
Шон Алред
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.