Fonksiyonlardan ve değişkenlerden docstrings nasıl alınır?


11

Eşleşen bir dosyada herhangi bir sexps docstrings alacak bir işlev yazmaya çalışıyorum (def.*).

Ben de tanımlanmış herhangi bir değişkenin yanı sıra, herhangi bir fonksiyon / makro almak mümkün istiyorum. Değişkenler için docstring'i isterken, herhangi bir fonksiyon için argüman listelerini de isterim.


1
Açıklığa kavuşturmak için: Elisp kaynak dosyanız var (yorumum) veya geçerli Emacs ortamında (Constantine'ın yorumu) bir sürü değişken ve fonksiyonunuz var mı? Ve eğer ilk yorum, (def…)sadece üst düzey özellikler değil, tüm sexps'leri gerçekten istiyor musunuz? Veya dosya yüklenirse tanımlanacak fonksiyonların ve değişkenlerin ara yorumu? Ya da gibi üst düzey formları içeren daha rahat bir tanım (when nil (defun …))?
Gilles 'SO- kötü olmayı kes

Başlangıçta ilkini istemiştim, ancak Constantine'ın yorumuna dayanarak, ihtiyacım olanı elde eden fonksiyonel bir uygulama elde edebildim. Amaç, elisp kaynağını Docstrings temel alınarak belgelere (Org ile yazılmış) dönüştürmektir.
Jonathan Leech-Pepin

İkinci yorumla, yerleşik describe-functionve arkadaşlar istediğinizin oldukça iyi bir bölümünü yaparlar (doktora ve argümanlar listesi).
T. Verron

Yanıtlar:


10

Amaç, ortamdaki işlevler ve değişkenler hakkında bilgi almaksa :

  • Fonksiyonlar ve makrolar için bkz. documentationFonksiyon.

  • Değişken öğretiler için documentation-property; Örneğin:

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • İşlevselliği ve bağımsız değişken listesi için bu Emacs.SE sorusuna , sorunun cevabına ve sorunun yorumlarına bakın.

(Bunu C-h k C-h f, kaynak koduna basıp gözden geçirerek buldum describe-function(değişken doktrinler için aynı, ama çalışıyorum describe-variable).)

Amacın üst düzey def.*formlar hakkında bilgi edinmek olduğunu kabul ederek bir Emacs Lisp kaynak kodu dosyasını analiz etmek için aşağıdakine benzer bir şey yapılabilir.

(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)))))

Bu kolayca uzatılabilir defvar, defconstvb

İşlemek için defungörünen üst düzey formları tek inerek olurdu içine muhtemelen özyineleme kullanılarak bu formların.


2
Okuyuculara bu bilgileri nasıl bulabileceklerini söylemek için +1. Bu öğrettiğiniz iki dersin en önemli dersidir.
Drew

Görünüşe göre garip bir durumdayız: Bu sitenin amacı kendini eski yapmaktır… Bu sohbetle ilginç bir tartışma yapacaktır :)
Sean Allred

4
@SeanAllred İnsanlara öğrenmeyi öğretmek soruları durdurmaz, sadece onları daha iyi yapar.
Malabarba

3
Malabarba'ya +1. Bu sitenin amacı (IMHO), Emacs'in kendisinin neyi cevaplayamadığını ya da iyi ya da kolay cevaplamadığını cevaplamak olmalıdır . Analoji: Site İngilizcesi ve Kullanımı için soruların kapatılmasının bir nedeni " Yaygın olarak bulunan referanslar kullanılarak cevaplanabilecek sorular konu dışıdır *" dır . (StackOverflow benzerdir.) Emacs'ın kendisinin cevaplayabileceği soruların konu dışı olduğunu söylerken aşırı olmamıza gerek yok , ancak aynı fikir geçerli olmalı: kullanıcıları önce cevabı bulmaya çalışın . Bizim durumumuzda, bu Emacs'a sorar .
Drew

@Drew Fuar puanları :)
Sean Allred
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.