comparison lisp/finder.el @ 2527:93015b63b041

Rewritten. The Finder is now a major mode with the ability to browse package commentary sections.
author Eric S. Raymond <esr@snark.thyrsus.com>
date Wed, 14 Apr 1993 03:34:39 +0000
parents 190371d9bc2e
children acd678e58602
comparison
equal deleted inserted replaced
2526:bcba821c17bc 2527:93015b63b041
21 21
22 ;; You should have received a copy of the GNU General Public License 22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs; see the file COPYING. If not, write to 23 ;; along with GNU Emacs; see the file COPYING. If not, write to
24 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 24 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25 25
26 ;; Commentary: 26 ;;; Commentary:
27 27
28 ;; This mode uses the Keywords library header to provide code-finding 28 ;; This mode uses the Keywords library header to provide code-finding
29 ;; services by keyword. 29 ;; services by keyword.
30 ;; 30 ;;
31 ;; Things to do: 31 ;; Things to do:
68 (tools . "programming tools") 68 (tools . "programming tools")
69 (unix . "front-ends/assistants for, or emulators of, UNIX features") 69 (unix . "front-ends/assistants for, or emulators of, UNIX features")
70 (vms . "support code for vms") 70 (vms . "support code for vms")
71 (wp . "word processing") 71 (wp . "word processing")
72 )) 72 ))
73
74 (defvar finder-mode-map nil)
75 ;(if finder-mode-map
76 ; nil
77 (setq finder-mode-map (make-sparse-keymap))
78 (define-key finder-mode-map " " 'finder-select)
79 (define-key finder-mode-map "?" 'finder-summary)
80 (define-key finder-mode-map "x" 'finder-exit)
81 (define-key finder-mode-map "f" 'finder-list-keywords)
82 ; )
73 83
74 ;;; Code for regenerating the keyword list. 84 ;;; Code for regenerating the keyword list.
75 85
76 (defvar finder-package-info nil 86 (defvar finder-package-info nil
77 "Assoc list mapping file names to description & keyword lists.") 87 "Assoc list mapping file names to description & keyword lists.")
127 (basic-save-buffer) 137 (basic-save-buffer)
128 ))) 138 )))
129 139
130 ;;; Now the retrieval code 140 ;;; Now the retrieval code
131 141
142 (defun finder-list-keywords ()
143 "Display descriptions of the keywords in the Finder buffer."
144 (interactive)
145 (setq buffer-read-only nil)
146 (erase-buffer)
147 (mapcar
148 (function (lambda (assoc)
149 (let ((keyword (car assoc)))
150 (insert (symbol-name keyword))
151 (insert-at-column 14 (concat (cdr assoc) "\n"))
152 (cons (symbol-name keyword) keyword))))
153 finder-known-keywords)
154 (goto-char (point-min))
155 (setq headmark (point))
156 (setq buffer-read-only t)
157 (set-buffer-modified-p nil)
158 (balance-windows)
159 (finder-summary))
160
161 (defun finder-list-matches (key)
162 (setq buffer-read-only nil)
163 (erase-buffer)
164 (let ((id (intern key)))
165 (insert
166 "The following packages match the keyword `" key "':\n\n")
167 (setq headmark (point))
168 (mapcar
169 (function (lambda (x)
170 (if (memq id (car (cdr (cdr x))))
171 (progn
172 (insert (car x))
173 (insert-at-column 16
174 (concat (car (cdr x)) "\n"))
175 ))
176 ))
177 finder-package-info)
178 (goto-char (point-min))
179 (forward-line)
180 (setq buffer-read-only t)
181 (set-buffer-modified-p nil)
182 (shrink-window-if-larger-than-buffer)
183 (finder-summary)))
184
185 (defun finder-commentary (file)
186 (interactive)
187 (let* ((str (lm-commentary file)))
188 (if (null str)
189 (error "Can't find any Commentary section."))
190 (pop-to-buffer "*Finder*")
191 (setq buffer-read-only nil)
192 (erase-buffer)
193 (insert str)
194 (goto-char (point-min))
195 (delete-blank-lines)
196 (goto-char (point-max))
197 (delete-blank-lines)
198 (goto-char (point-min))
199 (while (re-search-forward "^;+ ?" nil t)
200 (replace-match "" nil nil))
201 (goto-char (point-min))
202 (setq buffer-read-only t)
203 (set-buffer-modified-p nil)
204 (shrink-window-if-larger-than-buffer)
205 (finder-summary)
206 ))
207
208 (defun finder-current-item ()
209 (if (and headmark (< (point) headmark))
210 (error "No keyword or filename on this line")
211 (save-excursion
212 (beginning-of-line)
213 (current-word))))
214
215 (defun finder-select ()
216 (interactive)
217 (let ((key (finder-current-item)))
218 (if (string-match "\\.el$" key)
219 (finder-commentary key)
220 (finder-list-matches key))))
221
132 (defun finder-by-keyword () 222 (defun finder-by-keyword ()
133 "Find packages matching a given keyword." 223 "Find packages matching a given keyword."
134 (interactive) 224 (interactive)
135 (set-buffer (get-buffer-create "*Help*")) 225 (finder-mode)
226 (finder-list-keywords))
227
228 (defun finder-mode ()
229 "Major mode for browsing package documentation.
230
231 \\[finder-select] more help for the item on the current line
232 \\[finder-exit] exit Finder mode and fill the Finder buffer.
233 "
234 (interactive)
235 (pop-to-buffer "*Finder*")
236 (setq buffer-read-only nil)
136 (erase-buffer) 237 (erase-buffer)
137 238 (use-local-map finder-mode-map)
138 ;; Display descriptions of the keywords in the help buffer, and 239 (set-syntax-table emacs-lisp-mode-syntax-table)
139 ;; build an assoc list mapping the names of known keywords to their 240 (setq mode-name "Finder")
140 ;; symbols. 241 (setq major-mode 'finder-mode)
141 (let ((keyword-names 242 (make-local-variable 'headmark)
142 (mapcar (lambda (assoc) 243 (setq headmark nil)
143 (let ((keyword (car assoc))) 244 )
144 (insert (symbol-name keyword)) 245
145 (insert-at-column 14 (cdr assoc) "\n") 246 (defun finder-summary ()
146 (cons (symbol-name keyword) keyword))) 247 "Summarize basic Finder commands."
147 finder-known-keywords))) 248 (interactive)
148 (let ((key 249 (message
149 (save-window-excursion 250 "SPC = select, f = back to Finder, x = eXit, ? = help"))
150 (pop-to-buffer "*Help*") 251
151 (goto-char (point-min)) 252 (defun finder-exit ()
152 (completing-read "Package keyword: " keyword-names nil t))) 253 "Exit Finder mode and kill the buffer"
153 id) 254 (interactive)
154 (or (equal key "") 255 (delete-window)
155 (progn 256 (kill-buffer "*Finder*"))
156 (erase-buffer)
157 (pop-to-buffer "*Help*")
158 (setq id (intern key))
159 (insert
160 "The following packages match the keyword `" key "':\n\n")
161 (mapcar
162 (function (lambda (x)
163 (if (memq id (car (cdr (cdr x))))
164 (progn
165 (insert (car x))
166 (insert-at-column 16 (car (cdr x)) "\n")
167 ))
168 ))
169 finder-package-info)
170 (goto-char (point-min)))))))
171 257
172 (provide 'finder) 258 (provide 'finder)
173 259
174 ;;; finder.el ends here 260 ;;; finder.el ends here