dsill@RELAY.NSWC.NAVY.MIL (Dave Sill) (02/23/89)
Since I've received so many requests for this and I'm not sure it's gotten to everyone that asked for it, not to mention that it's recently been overhauled, I thought I'd just send it out to everyone. There are now two functions for use with the Lisp Code Directory, format-lisp-code-directory and lisp-dir-apropos. The former produces a report containing all entries in the directory while the latter reports on only those that pertain to a given topic. Both functions are now equipped with hooks. In addition, there are three different formatting styles that can used. (Write your own if you don't like any of these, it's easy!) The first format (format-lcd-line-Ram) tries to fit as much as it can into the first 80 columns. Example: Name Description Author Date /Version Contact -------------------------------------------------------------------------------------------- ada-mode Ada-mode, environment Lynn Slater /1.05 lrs@esl.com align-equals Align equals signs in C code Paul Hudson 88-11-18 / (U) ukc!acorn!moncam!paul : balance-windows Make all visible windows the same size Eric Raible, Ashwin Ram 89-01-18 / raible@orville.nas.nasa.gov batch-doc Batch DOC processor Randal Schwartz 88-09-09 / merlyn@intelob.biin.com,@intelob.intel.com,(U)...!tektronix!inteloa[!intelob]!merlyn better-keypad Handle VT200-mode keyboard Stephen Gildea / gildea@bbn.com : The second format (format-lcd-line-tale) is similar, but tries its darndest not to write past column 79 while displaying all fields. Example: Name Description Author Contact Date Version ------------------------------------------------------------------------------- ada-mode Ada-mode, environment Lynn Slater lrs@esl.com 1.05 align-equals Align equals signs in C code Paul Hudson (U) ukc!acorn!moncam!paul 88-11-18 array Array mode David M. Brown (U) morgoth!dmb asm-mode Major mode for assembler Martin Neitzel (B)neitzel@dbsinf6.bitnet,(U)unido!infbs!neitzel 89-01-03 : The third format (format-lcd-line-Sill) is totally different. It's not even column-oriented. Each entry takes three lines and very few are wider than a screen. I think it's the easiest to read, but I'm biased. Example: ada-mode (1.05) Lynn Slater, <lrs@esl.com> Ada-mode, environment align-equals 88-11-18 Paul Hudson, <(U) ukc!acorn!moncam!paul> Align equals signs in C code array David M. Brown, <(U) morgoth!dmb> Array mode : There are two variables, format-lisp-code-directory-line and lisp-code-directory-header, that you must set to the appropriate function to achieve the formatting style you prefer. Oh, and don't forget to set lisp-code-directory to the name of the file containing the raw datafile. ;;;;;;;;;;;;;;;;;;;;;;;;;;; -*- Mode: Emacs-Lisp -*- ;;;;;;;;;;;;;;;;;;;;;;;;;; ;; lispdir.el --- Lisp code directory formatter and apropos ;; Authors : Ashwin Ram (Ram-Ashwin@cs.yale.edu) ;; ; Dave Sill (dsill@relay.nswc.navy.mil) ;; ; David Lawrence (tale@pawl.rpi.edu) ;; Created On : Wed Jan 25, 1989 ;; Last Modified By: dsill ;; Last Modified On: Wed Feb 22 14:17:38 1989 ;; Update Count : 6 ;; Status : No known bugs. ;; Version : 2.0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; History ;; 22-Feb-1989 dsill ;; Changed format-lisp-code-directory and lisp-dir-apropos to call the ;; line formatter indirectly. The variable ;; format-lisp-code-directory-line contains a function to format a single ;; line, and format-lcd-line-Ram, format-lcd-line-tale, and ;; format-lcd-line-Sill are the three possibilities at this time. ;; 20-Feb-1989 tale ;; changed file's name to lispdir.el ;; format-lisp-code-directory makes separate buffer ;; removed lisp-dir-apropos-buffer -- why use more space in memory? ;; added lisp-dir-[apropos-]hook ;; (I like (setq lisp-dir-hook 'delete-other-windows)) ;; other aesthetic changes ;; 16-Feb-1989 dsill ;; Added lisp-dir-apropos function (require 'picture) ;provides move-to-column-force (defvar lisp-code-directory "~/gelcd/datafile" "Database of free lisp code. Entries are in the form: Name|Author|Contact|Description|Date|Version") (defvar format-lisp-code-directory-line 'format-lcd-line-Sill "Function that formats one line of GNU Emacs Lisp code directory.\n Provided as a variable for customizability. Should not insert final newline.") (defvar lisp-code-directory-header 'lcd-header-Sill "Function that inserts header appropriate for format-lisp-code-directory-line.") (defun format-lisp-code-directory () "Convert GNU Emacs Lisp code directory into something a human could read. Calls value of lisp-dir-hook with no args if that value is non-nil." (interactive) (pop-to-buffer "*Lisp Code Directory*") (fundamental-mode) (setq buffer-read-only nil) (erase-buffer) (buffer-flush-undo (current-buffer)) (insert-file lisp-code-directory) (insert " GNU Emacs Lisp code directory. " (current-time-string) ".\n\n") (message "Formatting %s ..." lisp-code-directory) (delete-region (progn (beginning-of-line) (point)) (progn (end-of-line) (point))) (funcall lisp-code-directory-header) (while (re-search-forward "\\(.*\\)|\\(.*\\)|\\(.*\\)|\\(.*\\)|\\(.*\\)|\\(.*\\)" nil t) (let ((name (buffer-substring (match-beginning 1) (match-end 1))) (author (buffer-substring (match-beginning 2) (match-end 2))) (contact (buffer-substring (match-beginning 3) (match-end 3))) (description (buffer-substring (match-beginning 4) (match-end 4))) (date (buffer-substring (match-beginning 5) (match-end 5))) (version (buffer-substring (match-beginning 6) (match-end 6)))) (delete-region (progn (beginning-of-line) (point)) (progn (end-of-line) (point))) (funcall format-lisp-code-directory-line name author contact description date version))) (goto-char (point-min)) (center-line) (message "Formatting %s ... done" lisp-code-directory) (set-buffer-modified-p nil) (run-hooks 'lisp-dir-hook)) (defun lisp-dir-apropos (topic) "Display entries in Lisp Code Directory for TOPIC in separate window. Calls value of lisp-dir-apropos-hook with no args if that value is non-nil." (interactive (list (read-string (concat "Lisp Directory apropos (" (current-word) "): ")))) (if (equal "" topic) (setq topic (current-word))) (save-excursion (set-buffer (get-buffer-create "*Lisp Directory Apropos*")) (fundamental-mode) (setq buffer-read-only nil) (erase-buffer) (buffer-flush-undo (current-buffer)) (insert-file lisp-code-directory) (message "Searching for %s ..." topic) (delete-non-matching-lines topic) (insert "Emacs Lisp Code Apropos -- \"" topic "\"\n\n\n") (backward-char 1) (funcall lisp-code-directory-header) (while (re-search-forward "\\(.*\\)|\\(.*\\)|\\(.*\\)|\\(.*\\)|\\(.*\\)|\\(.*\\)" nil t) (let ((name (buffer-substring (match-beginning 1) (match-end 1))) (author (buffer-substring (match-beginning 2) (match-end 2))) (contact (buffer-substring (match-beginning 3) (match-end 3))) (description (buffer-substring (match-beginning 4) (match-end 4))) (date (buffer-substring (match-beginning 5) (match-end 5))) (version (buffer-substring (match-beginning 6) (match-end 6)))) (delete-region (progn (beginning-of-line) (point)) (progn (end-of-line) (point))) (funcall format-lisp-code-directory-line name author contact description date version))) (goto-char (point-min)) (center-line) (message "Searching for %s ... done" topic) (set-buffer-modified-p nil)) (display-buffer "*Lisp Directory Apropos*") (run-hooks 'lisp-dir-apropos-hook)) (defun format-lcd-line-Ram (name author contact description date version) "Columnar formatter for Lisp code directory that tries to use as few lines as possible. Doesn't fit Contact within first 80 columns." (insert-at-column 1 name) (insert-at-column 17 description) (insert-at-column 49 author) (insert-at-column 65 date) (insert-at-column 74 "/") (insert-at-column 75 version) (insert-at-column 84 contact)) (defun format-lcd-line-tale (name author contact description date version) "Multi-line columnar formatter for Lisp code directory that tries not to write anything past column 79." (insert-at-column 0 name) (insert-at-column 17 description) (insert-at-column 56 author) (insert-at-column 4 contact) (insert-at-column 56 date) (insert-at-column 72 version)) (defun format-lcd-line-Sill (name author contact description date version) "Multi-line non-columnar line formatter for Lisp code directory." (insert-at-column 0 name) (if (not (equal version "")) (insert " (" version ")")) (insert "\t\t" date "\n") (insert-at-column 5 author) (insert ", <" contact ">\n") (insert-at-column 5 description)) (defun lcd-header-Ram/tale () "Inserts header for column-formatted Lisp code directory." (funcall format-lisp-code-directory-line "Name" "Author" "Contact" "Description" "Date" "Version") (insert "\n") (insert-char ?- 79) ) (defun lcd-header-Sill () "Inserts empty header for non-columnar Lisp code directory" ) (defun insert-at-column (col string) (if (> (current-column) col) (insert "\n")) (move-to-column-force col) (insert string)) ;; Snatched from unix-apropos by Henry Kautz (defun current-word () "Word cursor is over, as a string." (save-excursion (let (beg end) (re-search-backward "\\w" nil 2) (re-search-backward "\\b" nil 2) (setq beg (point)) (re-search-forward "\\w*\\b" nil 2) (setq end (point)) (buffer-substring beg end))))