# HG changeset patch # User Eric S. Raymond # Date 734758479 0 # Node ID 93015b63b041a94641db650eee66fc07c739dbb1 # Parent bcba821c17bcb636cd06baf4a33314e00c4d6430 Rewritten. The Finder is now a major mode with the ability to browse package commentary sections. diff -r bcba821c17bc -r 93015b63b041 lisp/finder.el --- a/lisp/finder.el Tue Apr 13 05:54:19 1993 +0000 +++ b/lisp/finder.el Wed Apr 14 03:34:39 1993 +0000 @@ -23,7 +23,7 @@ ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -;; Commentary: +;;; Commentary: ;; This mode uses the Keywords library header to provide code-finding ;; services by keyword. @@ -71,6 +71,16 @@ (wp . "word processing") )) +(defvar finder-mode-map nil) +;(if finder-mode-map +; nil + (setq finder-mode-map (make-sparse-keymap)) + (define-key finder-mode-map " " 'finder-select) + (define-key finder-mode-map "?" 'finder-summary) + (define-key finder-mode-map "x" 'finder-exit) + (define-key finder-mode-map "f" 'finder-list-keywords) +; ) + ;;; Code for regenerating the keyword list. (defvar finder-package-info nil @@ -129,45 +139,121 @@ ;;; Now the retrieval code +(defun finder-list-keywords () + "Display descriptions of the keywords in the Finder buffer." + (interactive) + (setq buffer-read-only nil) + (erase-buffer) + (mapcar + (function (lambda (assoc) + (let ((keyword (car assoc))) + (insert (symbol-name keyword)) + (insert-at-column 14 (concat (cdr assoc) "\n")) + (cons (symbol-name keyword) keyword)))) + finder-known-keywords) + (goto-char (point-min)) + (setq headmark (point)) + (setq buffer-read-only t) + (set-buffer-modified-p nil) + (balance-windows) + (finder-summary)) + +(defun finder-list-matches (key) + (setq buffer-read-only nil) + (erase-buffer) + (let ((id (intern key))) + (insert + "The following packages match the keyword `" key "':\n\n") + (setq headmark (point)) + (mapcar + (function (lambda (x) + (if (memq id (car (cdr (cdr x)))) + (progn + (insert (car x)) + (insert-at-column 16 + (concat (car (cdr x)) "\n")) + )) + )) + finder-package-info) + (goto-char (point-min)) + (forward-line) + (setq buffer-read-only t) + (set-buffer-modified-p nil) + (shrink-window-if-larger-than-buffer) + (finder-summary))) + +(defun finder-commentary (file) + (interactive) + (let* ((str (lm-commentary file))) + (if (null str) + (error "Can't find any Commentary section.")) + (pop-to-buffer "*Finder*") + (setq buffer-read-only nil) + (erase-buffer) + (insert str) + (goto-char (point-min)) + (delete-blank-lines) + (goto-char (point-max)) + (delete-blank-lines) + (goto-char (point-min)) + (while (re-search-forward "^;+ ?" nil t) + (replace-match "" nil nil)) + (goto-char (point-min)) + (setq buffer-read-only t) + (set-buffer-modified-p nil) + (shrink-window-if-larger-than-buffer) + (finder-summary) + )) + +(defun finder-current-item () + (if (and headmark (< (point) headmark)) + (error "No keyword or filename on this line") + (save-excursion + (beginning-of-line) + (current-word)))) + +(defun finder-select () + (interactive) + (let ((key (finder-current-item))) + (if (string-match "\\.el$" key) + (finder-commentary key) + (finder-list-matches key)))) + (defun finder-by-keyword () "Find packages matching a given keyword." (interactive) - (set-buffer (get-buffer-create "*Help*")) - (erase-buffer) + (finder-mode) + (finder-list-keywords)) + +(defun finder-mode () + "Major mode for browsing package documentation. - ;; Display descriptions of the keywords in the help buffer, and - ;; build an assoc list mapping the names of known keywords to their - ;; symbols. - (let ((keyword-names - (mapcar (lambda (assoc) - (let ((keyword (car assoc))) - (insert (symbol-name keyword)) - (insert-at-column 14 (cdr assoc) "\n") - (cons (symbol-name keyword) keyword))) - finder-known-keywords))) - (let ((key - (save-window-excursion - (pop-to-buffer "*Help*") - (goto-char (point-min)) - (completing-read "Package keyword: " keyword-names nil t))) - id) - (or (equal key "") - (progn - (erase-buffer) - (pop-to-buffer "*Help*") - (setq id (intern key)) - (insert - "The following packages match the keyword `" key "':\n\n") - (mapcar - (function (lambda (x) - (if (memq id (car (cdr (cdr x)))) - (progn - (insert (car x)) - (insert-at-column 16 (car (cdr x)) "\n") - )) - )) - finder-package-info) - (goto-char (point-min))))))) +\\[finder-select] more help for the item on the current line +\\[finder-exit] exit Finder mode and fill the Finder buffer. +" + (interactive) + (pop-to-buffer "*Finder*") + (setq buffer-read-only nil) + (erase-buffer) + (use-local-map finder-mode-map) + (set-syntax-table emacs-lisp-mode-syntax-table) + (setq mode-name "Finder") + (setq major-mode 'finder-mode) + (make-local-variable 'headmark) + (setq headmark nil) +) + +(defun finder-summary () + "Summarize basic Finder commands." + (interactive) + (message + "SPC = select, f = back to Finder, x = eXit, ? = help")) + +(defun finder-exit () + "Exit Finder mode and kill the buffer" + (interactive) + (delete-window) + (kill-buffer "*Finder*")) (provide 'finder)