diff options
author | Glenn Morris <rgm@gnu.org> | 2010-10-06 19:37:39 -0700 |
---|---|---|
committer | Glenn Morris <rgm@gnu.org> | 2010-10-06 19:37:39 -0700 |
commit | 7b9235ad958da061a3dc412c52ec28326d1a836d (patch) | |
tree | a5467d6b1eb3bd86fea0ea1373daf5475f8e23f7 /lisp/emacs-lisp | |
parent | 52da218259dcd25143ae5bc6fcd79b898ad15fab (diff) | |
download | emacs-7b9235ad958da061a3dc412c52ec28326d1a836d.tar.gz emacs-7b9235ad958da061a3dc412c52ec28326d1a836d.tar.bz2 emacs-7b9235ad958da061a3dc412c52ec28326d1a836d.zip |
Add a shadow-mode for load-path shadows.
* lisp/emacs-lisp/shadow.el (shadow-font-lock-keywords): New variable.
(shadow-mode): New mode.
(shadow-find-file): New button.
(list-load-path-shadows): Use shadow-mode and buttons.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/shadow.el | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/lisp/emacs-lisp/shadow.el b/lisp/emacs-lisp/shadow.el index a41db864a1b..630aadba1d4 100644 --- a/lisp/emacs-lisp/shadow.el +++ b/lisp/emacs-lisp/shadow.el @@ -151,6 +151,34 @@ See the documentation for `list-load-path-shadows' for further information." (and (= (nth 7 (file-attributes f1)) (nth 7 (file-attributes f2))) (eq 0 (call-process "cmp" nil nil nil "-s" f1 f2)))))))) + +(defvar shadow-font-lock-keywords + `((,(format "hides \\(%s.*\\)" + (file-name-directory (locate-library "simple.el"))) + . (1 font-lock-warning-face))) + "Keywords to highlight in `shadow-mode'.") + +(define-derived-mode shadow-mode fundamental-mode "Shadow" + "Major mode for load-path shadows buffer." + (set (make-local-variable 'font-lock-defaults) + '((shadow-font-lock-keywords))) + (setq buffer-undo-list t + buffer-read-only t)) + +;; TODO use text-properties instead, a la dired. +(require 'button) +(define-button-type 'shadow-find-file + 'follow-link t +;; 'face 'default + 'action (lambda (button) + (let ((file (concat (button-get button 'shadow-file) ".el"))) + (or (file-exists-p file) + (setq file (concat file ".gz"))) + (if (file-readable-p file) + (pop-to-buffer (find-file-noselect file)) + (error "Cannot read file")))) + 'help-echo "mouse-2, RET: find this file") + ;;;###autoload (defun list-load-path-shadows (&optional stringp) @@ -234,14 +262,20 @@ function, `find-emacs-lisp-shadows'." ;; Create the *Shadows* buffer and display shadowings there. (let ((string (buffer-string))) (with-current-buffer (get-buffer-create "*Shadows*") - (fundamental-mode) ;run after-change-major-mode-hook. (display-buffer (current-buffer)) - (setq buffer-undo-list t - buffer-read-only nil) - (erase-buffer) - (insert string) - (insert msg "\n") - (setq buffer-read-only t))) + (shadow-mode) ; run after-change-major-mode-hook + (let ((inhibit-read-only t)) + (erase-buffer) + (insert string) + (insert msg "\n") + (while (re-search-backward "\\(^.*\\) hides \\(.*$\\)" + nil t) + (dotimes (i 2) + (make-button (match-beginning (1+ i)) + (match-end (1+ i)) + 'type 'shadow-find-file 'shadow-file + (match-string (1+ i))))) + (goto-char (point-max))))) ;; We are non-interactive, print shadows via message. (unless (zerop n) (message "This site has duplicate Lisp libraries with the same name. @@ -259,5 +293,4 @@ version unless you know what you are doing.\n") (provide 'shadow) -;; arch-tag: 0480e8a7-62ed-4a12-a9f6-f44ded9b0830 ;;; shadow.el ends here |