Mercurial > emacs
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 |