Если целью является получение информации о функциях и переменных уже в среде :
Строки документации по функциям и макросам см. В 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
появление в формах верхнего уровня, нужно спуститься в эти формы, возможно, используя рекурсию.
(def…)
полы, а не только спецификации высшего уровня? Или промежуточная интерпретация функций и переменных, которые будут определены, если файл загружен? Или более смягченное определение, которое включает такие формы высшего уровня как(when nil (defun …))
)?