comparison lisp/finder.el @ 95750:6c14c564fa23

(finder-font-lock-keywords): Handle ``quotes''. (finder-compile-keywords): Move let to where needed. (finder-mouse-face-on-line): Go back one more line if needed. (finder-list-matches): Use cadr. (finder-goto-xref): New function. (finder-commentary): Add buttons to jump to foo.el libraries.
author Glenn Morris <rgm@gnu.org>
date Tue, 10 Jun 2008 03:06:30 +0000
parents 470520f9b596
children afc4aa03c2d5
comparison
equal deleted inserted replaced
95749:7957e6e1f9b6 95750:6c14c564fa23
107 (modify-syntax-entry ?\; ". " st) 107 (modify-syntax-entry ?\; ". " st)
108 st) 108 st)
109 "Syntax table used while in `finder-mode'.") 109 "Syntax table used while in `finder-mode'.")
110 110
111 (defvar finder-font-lock-keywords 111 (defvar finder-font-lock-keywords
112 '(("`\\([^']+\\)'" 1 font-lock-constant-face prepend)) 112 '(("`\\([^'`]+\\)'" 1 font-lock-constant-face prepend))
113 "Font-lock keywords for Finder mode.") 113 "Font-lock keywords for Finder mode.")
114 114
115 (defvar finder-headmark nil 115 (defvar finder-headmark nil
116 "Internal finder-mode variable, local in finder buffer.") 116 "Internal finder-mode variable, local in finder buffer.")
117 117
136 (defun finder-compile-keywords (&rest dirs) 136 (defun finder-compile-keywords (&rest dirs)
137 "Regenerate the keywords association list into `generated-finder-keywords-file'. 137 "Regenerate the keywords association list into `generated-finder-keywords-file'.
138 Optional arguments DIRS are a list of Emacs Lisp directories to compile from; 138 Optional arguments DIRS are a list of Emacs Lisp directories to compile from;
139 no arguments compiles from `load-path'." 139 no arguments compiles from `load-path'."
140 (save-excursion 140 (save-excursion
141 (find-file generated-finder-keywords-file)
142 (setq buffer-undo-list t)
143 (erase-buffer)
144 (insert (autoload-rubric generated-finder-keywords-file
145 "keyword-to-package mapping"))
146 (search-backward " ")
147 (insert "(setq finder-package-info '(\n")
141 (let (processed summary keywords) 148 (let (processed summary keywords)
142 (find-file generated-finder-keywords-file)
143 (setq buffer-undo-list t)
144 (erase-buffer)
145 (insert (autoload-rubric generated-finder-keywords-file
146 "keyword-to-package mapping"))
147 (search-backward " ")
148 (insert "(setq finder-package-info '(\n")
149 (mapc 149 (mapc
150 (lambda (d) 150 (lambda (d)
151 (when (file-exists-p (directory-file-name d)) 151 (when (file-exists-p (directory-file-name d))
152 (message "Directory %s" d) 152 (message "Directory %s" d)
153 (mapc 153 (mapc
173 ;; Allow compressed files also. FIXME: 173 ;; Allow compressed files also. FIXME:
174 ;; generalize this, especially for 174 ;; generalize this, especially for
175 ;; MS-DOG-type filenames. 175 ;; MS-DOG-type filenames.
176 "^[^=].*\\.el\\(\\.\\(gz\\|Z\\)\\)?$" 176 "^[^=].*\\.el\\(\\.\\(gz\\|Z\\)\\)?$"
177 )))) 177 ))))
178 (or dirs load-path)) 178 (or dirs load-path)))
179 (insert " ))\n") 179 (insert " ))\n")
180 (eval-buffer) ; so we get the new keyword list immediately 180 (eval-buffer) ; so we get the new keyword list immediately
181 (basic-save-buffer)))) 181 (basic-save-buffer)))
182 182
183 (defun finder-compile-keywords-make-dist () 183 (defun finder-compile-keywords-make-dist ()
184 "Regenerate `finder-inf.el' for the Emacs distribution." 184 "Regenerate `finder-inf.el' for the Emacs distribution."
185 (apply 'finder-compile-keywords command-line-args-left) 185 (apply 'finder-compile-keywords command-line-args-left)
186 (kill-emacs)) 186 (kill-emacs))
197 197
198 (defun finder-mouse-face-on-line () 198 (defun finder-mouse-face-on-line ()
199 "Put `mouse-face' and `help-echo' properties on the previous line." 199 "Put `mouse-face' and `help-echo' properties on the previous line."
200 (save-excursion 200 (save-excursion
201 (forward-line -1) 201 (forward-line -1)
202 ;; If finder-insert-at-column moved us to a new line, go back one more.
203 (if (looking-at "[ \t]") (forward-line -1))
202 (unless finder-help-echo 204 (unless finder-help-echo
203 (setq finder-help-echo 205 (setq finder-help-echo
204 (let* ((keys1 (where-is-internal 'finder-select 206 (let* ((keys1 (where-is-internal 'finder-select
205 finder-mode-map)) 207 finder-mode-map))
206 (keys (nconc (where-is-internal 208 (keys (nconc (where-is-internal
248 (insert 250 (insert
249 "The following packages match the keyword `" key "':\n\n") 251 "The following packages match the keyword `" key "':\n\n")
250 (setq finder-headmark (point)) 252 (setq finder-headmark (point))
251 (mapc 253 (mapc
252 (lambda (x) 254 (lambda (x)
253 (if (memq id (car (cdr (cdr x)))) 255 (when (memq id (cadr (cdr x)))
254 (progn 256 (insert (car x))
255 (insert (car x)) 257 (finder-insert-at-column 16 (concat (cadr x) "\n"))
256 (finder-insert-at-column 16 (concat (nth 1 x) "\n")) 258 (finder-mouse-face-on-line)))
257 (finder-mouse-face-on-line))))
258 finder-package-info) 259 finder-package-info)
259 (goto-char (point-min)) 260 (goto-char (point-min))
260 (forward-line) 261 (forward-line)
261 (setq buffer-read-only t) 262 (setq buffer-read-only t)
262 (set-buffer-modified-p nil) 263 (set-buffer-modified-p nil)
263 (shrink-window-if-larger-than-buffer) 264 (shrink-window-if-larger-than-buffer)
264 (finder-summary))) 265 (finder-summary)))
266
267 (define-button-type 'finder-xref 'action #'finder-goto-xref)
268
269 (defun finder-goto-xref (button)
270 "Jump to a lisp file for the BUTTON at point."
271 (let* ((file (button-get button 'xref))
272 (lib (locate-library file)))
273 (if lib (finder-commentary lib)
274 (message "Unable to locate `%s'" file))))
265 275
266 ;;;###autoload 276 ;;;###autoload
267 (defun finder-commentary (file) 277 (defun finder-commentary (file)
268 "Display FILE's commentary section. 278 "Display FILE's commentary section.
269 FILE should be in a form suitable for passing to `locate-library'." 279 FILE should be in a form suitable for passing to `locate-library'."
289 (delete-blank-lines) 299 (delete-blank-lines)
290 (goto-char (point-min)) 300 (goto-char (point-min))
291 (while (re-search-forward "^;+ ?" nil t) 301 (while (re-search-forward "^;+ ?" nil t)
292 (replace-match "" nil nil)) 302 (replace-match "" nil nil))
293 (goto-char (point-min)) 303 (goto-char (point-min))
304 (while (re-search-forward "\\<\\([-[:alnum:]]+\\.el\\)\\>" nil t)
305 (if (locate-library (match-string 1))
306 (make-text-button (match-beginning 1) (match-end 1)
307 'xref (match-string-no-properties 1)
308 'help-echo "Read this file's commentary"
309 :type 'finder-xref)))
310 (goto-char (point-min))
294 (setq buffer-read-only t) 311 (setq buffer-read-only t)
295 (set-buffer-modified-p nil) 312 (set-buffer-modified-p nil)
296 (shrink-window-if-larger-than-buffer) 313 (shrink-window-if-larger-than-buffer)
297 (finder-mode) 314 (finder-mode)
298 (finder-summary))) 315 (finder-summary)))