help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Generating a listing of all symbols (16K+) and labeling subsets


From: Hans BKK
Subject: Re: Generating a listing of all symbols (16K+) and labeling subsets
Date: Fri, 18 Apr 2014 19:50:27 -0700 (PDT)
User-agent: G2/1.0

> > The currently-in-development Emacs 24.4 includes `macrop'[1]. I can't
> > vouch for what (if any) other versions it's appropriate for, but it did
> > succeed in a couple very basic experiments on 24.3.1.
> > [1]
> > http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/subr.el?h=emacs-24#n2664

OK, just dropped that snippet at the top of my listing.el file and macrop works 
a treat, thanks!


Here's a shortened listing of the cond-tree for each symbol type and my 
taxonomy if anyone cares to comment further on my terminology:

           ((fboundp sym)                  ; ALL functions
             ((commandp sym)
               ((keymapp sym)
                (princ "command - keymap:\t\t\t\t\t")
               ((subrp (symbol-function sym))
                (princ "command - built-in primitive:\t\t")
               ((byte-code-function-p (symbol-function sym))
                (princ "command - byte-code:\t\t\t")
               ((functionp sym)
                (princ "command - elisp:\t\t\t")
             (t                            ; (non-command) functions
               ((macrop sym)
                (princ "function - macro:\t\t\t")
               ((keymapp sym)
                (princ "function - keymap:\t\t\t\t")
               ((subrp (symbol-function sym))
                (princ "function - built-in primitive:\t\t")
               ((byte-code-function-p (symbol-function sym))
                (princ "function - byte-code:\t\t\t")
               ((functionp sym)
                (princ "function - elisp:\t\t\t")
               (t
                (princ "other ~function (aliases??):\t"))) 
            )
           ((boundp sym)                  ; ALL variables
             ((custom-variable-p sym)
              (princ "user (custom) option:\t\t\t")
             ((keywordp sym)
              (princ "keyword:\t\t\t\t\t")
             (t
                (princ "non-user (setq) variable:\t\t"))
            )
           ((facep sym)
            (princ "face:\t\t\t\t\t")
           (t
            (princ "other (misc) symbol:\t\t\t")
           )

----------------------
And current counts - note will probably drop outputting the first category to 
the list unless someone suggests another meaningful symbol type to track 

other (misc): 8734
keyword: 323
faces: 50
variables: 2542
        user (custom) option: 659
        non-user (setq) variable: 1183
functions
        (non-command): 4277
                keymap: 34
                built-in primitive: 1022
                byte-code: 2342
                other (bound?) function: 335
   
        command: 2373
                keymap:3
                built-in primitive: 88
                byte-code: 762
                other command: 1561
                macro:298

===================
and finally the code itself if anyone wants to suggest other improvements or to 
give it a whirl on their setup.


-------------------
(defun macrop (object)
  "Non-nil if and only if OBJECT is a macro."
  (let ((def (indirect-function object t)))
    (when (consp def)
      (or (eq 'macro (car def))
          (and (autoloadp def) (memq (nth 4 def) '(macro t)))))))

(defun list-hh-symbols ()
  "Display a list of Emacs symbols - names only"
  (interactive)
  (message "Looking up all symbols...")
  (with-output-to-temp-buffer "*List Symbols*"
    (let (vars)
      (mapatoms (function (lambda (sym)
                            (setq vars (cons sym vars)))))
      (setq vars (sort vars 'string-lessp))
      (while vars
        (let ((sym (car vars)))
          (cond 
           ((fboundp sym)                  ; ALL functions
            (cond
             ((commandp sym)
              (cond
               ((keymapp sym)
                (princ "=======\n")
                (princ "\n")
                (princ "command - keymap:\t\t\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((subrp (symbol-function sym))
                (princ "=============================\n")
                (princ "command - built-in primitive:\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((byte-code-function-p (symbol-function sym))
                (princ "====================\n")
                (princ "command - byte-code:\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((functionp sym)
                (princ "================\n")
                (princ "command - elisp:\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               (t
                (princ "===============\n")
                (princ "other command:\t\t\t\t")
                (prin1 sym)
                (princ "\n\n"))                
               ) 
             )
             (t                            ; (non-command) functions
              (cond
               ((macrop sym)
                (princ "================\n")
                (princ "function - macro:\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((keymapp sym)
                (princ "==================\n")
                (princ "\n")
                (princ "function - keymap:\t\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((subrp (symbol-function sym))
                (princ "==============================\n")
                (princ "function - built-in primitive:\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((byte-code-function-p (symbol-function sym))
                (princ "=====================\n")
                (princ "function - byte-code:\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               ((functionp sym)
                (princ "=================\n")
                (princ "function - elisp:\t\t\t")
                (prin1 sym)
                (princ "\n\n"))
               (t
                (princ "============================\n")
                (princ "other ~function (aliases??):\t")
                (prin1 sym)
                (princ "\n\n"))                
               )
              ) 
             ) 
            )
           ((boundp sym)                  ; ALL variables
            (cond
             ((custom-variable-p sym)
              (princ "=====================\n")
              (princ "user (custom) option:\t\t\t")
              (prin1 sym)
              (princ "\n\n"))
             ((keywordp sym)
              (princ "========\n")
              (princ "\n")
              (princ "keyword:\t\t\t\t\t")
              (prin1 sym)
              (princ "\n\n"))
             (t
                (princ "=========================\n")
                (princ "non-user (setq) variable:\t\t")
                (prin1 sym)
                (princ "\n\n"))
             )
            )
           ((facep sym)
            (princ "=====\n")
            (princ "\n")
            (princ "face:\t\t\t\t\t")
            (prin1 sym)
            (princ "\n\n"))
           (t
            (princ "====================\n")
            (princ "other (misc) symbol:\t\t\t")
            (prin1 sym)
            (princ "\n\n"))
           )
        (setq vars (cdr vars))))
      (message "Looking up all symbols...done")
      (with-current-buffer "*List Symbols*"
        (setq buffer-read-only t)))))

;;;;;;;;;;;;;;;;;;;;;;;

(provide 'hh-list-symbols)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; hh-list-symbols.el ends here


reply via email to

[Prev in Thread] Current Thread [Next in Thread]