changeset 867:f120dd3a71b0

Initial revision
author Eric S. Raymond <esr@snark.thyrsus.com>
date Fri, 24 Jul 1992 20:55:13 +0000
parents ae5c412a32ec
children 0cda1f7b154e
files lisp/finder.el
diffstat 1 files changed, 156 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/finder.el	Fri Jul 24 20:55:13 1992 +0000
@@ -0,0 +1,156 @@
+;;; finder.el --- topic & keyword-based code finder
+
+;; Copyright (C) 1992 Free Software Foundation, Inc.
+
+;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
+;; Created: 16 Jun 1992
+;; Version: 1.0
+;; Keywords: help
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 1, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;; Commentary:
+
+;; This mode uses the Keywords library header to provide code-finding
+;; services by keyword.
+;;
+;; Things to do:
+;;    1. Support multiple keywords per search.  This could be extremely hairy;
+;; there doesn't seem to be any way to get completing-read to exit on
+;; an EOL with no substring pending, which is what we'd want to end the loop.
+;;    2. Search by string in synopsis line?
+;;    3. Function to check finder-package-info for unknown keywords.
+
+;;; Code:
+
+(require 'lisp-mnt)
+(require 'finder-inf)
+(require 'picture)
+
+(defvar finder-known-keywords
+  '(
+    (bib	. "code related to the bib(1) bibliography processor")
+    (c		. "C and C++ language support")
+    (calendar	. "calendar and time management support")
+    (docs	. "support for Emacs documentation")
+    (emulations	. "emulations of other editors")
+    (extensions	. "Emacs Lisp language extensions")
+    (games	. "games, jokes and amusements")
+    (hardware	. "support for interfacing with exotic hardware")
+    (help	. "support for on-line help systems")
+    (i14n	. "internationalization and alternate character-set support")
+    (internal	. "code for Emacs internals, build process, defaults")
+    (languages	. "specialized modes for editing programming languages")
+    (lisp	. "Lisp support, including Emacs Lisp")
+    (local	. "code local to your site")
+    (maint	. "maintenance aids for the Emacs development group")
+    (mail	. "modes for electronic-mail handling")
+    (news	. "support for netnews reading and posting")
+    (processes	. "process, subshell, compilation, and job control support")
+    (terminals	. "support for terminal types")
+    (tex	. "code related to the TeX formatter")
+    (tools	. "programming tools")
+    (unix	. "front-ends/assistants for, or emulators of, UNIX features")
+    (vms	. "support code for vms")
+    (wp		. "word processing")
+    ))
+
+;;; Code for regenerating the keyword list.
+
+(defvar finder-package-info nil
+  "Assoc list mapping file names to description & keyword lists.")
+
+(defun finder-compile-keywords (&rest dirs)
+  "Regenerate the keywords association list into the file finder-inf.el.
+Optional arguments are a list of Emacs Lisp directories to compile from; no
+arguments compiles from load-path."
+  (save-excursion
+    (find-file "finder-inf.el")
+    (erase-buffer)
+    (insert ";;; Don't edit this file.  It's generated by finder.el\n\n")
+    (insert "\n(setq finder-package-info '(\n")
+    (mapcar
+     (function (lambda (d)
+	(mapcar
+	 (function (lambda (f) 
+	    (if (string-match "\\.el$" f) 
+		(let (summary keystart)
+		  (save-excursion
+		    (set-buffer (get-buffer-create "*finder-scratch*"))
+		    (erase-buffer)
+		    (insert-file-contents
+		     (concat (file-name-as-directory d) f))
+		    (setq summary (lm-synopsis))
+		    (setq keywords (lm-keywords)))
+		  (insert
+		   (format "    (\"%s\"\n        " f)
+		   (if summary (format "\"%s\"" summary) "nil")
+		   "\n        ")
+		  (setq keystart (point))
+		  (insert
+		   (if keywords (format "(%s)" keywords) "nil")
+		   ")\n")
+		  (subst-char-in-region keystart (point) ?, ? )
+		  )
+	      )))
+	 (directory-files (or d ".")))
+	))
+     (or dirs load-path))
+    (insert "))\n\n(provide 'finder-inf)\n")
+    (kill-buffer "*finder-scratch*")
+    (basic-save-buffer)
+    ))
+
+;;; Now the retrieval code
+
+(defun finder-by-keyword ()
+  "Find packages matching a given keyword."
+  (interactive)
+  (pop-to-buffer "*Help*")
+  (erase-buffer)
+  (mapcar
+   (function (lambda (x)
+	       (insert (symbol-name (car x)))
+	       (insert-at-column 14 (cdr x) "\n")
+	       ))
+   finder-known-keywords)
+  (goto-char (point-min))
+  (let (key
+	(known (mapcar (function (lambda (x) (car x))) finder-known-keywords)))
+    (let ((key (intern (completing-read
+		"Package keyword: "
+		(vconcat known)
+		(function (lambda (arg) (memq arg known)))
+		t))))
+      (erase-buffer)
+      (insert
+       "The following packages match the keyword `" (symbol-name key) "':\n\n")
+      (mapcar
+       (function (lambda (x)
+		   (if (memq key (car (cdr (cdr x))))
+		       (progn
+			 (insert (car x))
+			 (insert-at-column 16 (car (cdr x)) "\n")
+			 ))
+		   ))
+       finder-package-info)
+      (goto-char (point-min))
+  )))
+
+(provide 'finder)
+
+;;; finder.el ends here