summaryrefslogtreecommitdiff
path: root/lisp/ibuf-ext.el
diff options
context:
space:
mode:
authorJohn Paul Wallington <jpw@pobox.com>2008-06-26 15:26:58 +0000
committerJohn Paul Wallington <jpw@pobox.com>2008-06-26 15:26:58 +0000
commitc93addf59ea9bd82117b70a8a3ddc9428b3a1919 (patch)
tree3a59088a7e60f8f3107f95125f97d4908f1ebdc2 /lisp/ibuf-ext.el
parentc9fc02c727886c8ca8863365a395c91024455789 (diff)
downloademacs-c93addf59ea9bd82117b70a8a3ddc9428b3a1919.tar.gz
(ibuffer-diff-buffer-with-file-1): New function.
(ibuffer-diff-with-file): Use it. Do diff on marked buffers (ibuffer-mark-on-buffer): Don't display message when removing marks. (ibuffer-mark-by-mode): Use `buffer-local-value'.
Diffstat (limited to 'lisp/ibuf-ext.el')
-rw-r--r--lisp/ibuf-ext.el67
1 files changed, 59 insertions, 8 deletions
diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el
index 257fe89c03b..2624fdaff69 100644
--- a/lisp/ibuf-ext.el
+++ b/lisp/ibuf-ext.el
@@ -1298,15 +1298,66 @@ a prefix argument reverses the meaning of that variable."
(error "No buffer with name %s" name)
(goto-char buf-point)))))
+(defun ibuffer-diff-buffer-with-file-1 (buffer)
+ (let ((bufferfile (buffer-local-value 'buffer-file-name buffer))
+ (tempfile (make-temp-file "buffer-content-")))
+ (when bufferfile
+ (unwind-protect
+ (progn
+ (with-current-buffer buffer
+ (write-region nil nil tempfile nil 'nomessage))
+ (let* ((old (expand-file-name bufferfile))
+ (new (expand-file-name tempfile))
+ (oldtmp (file-local-copy old))
+ (newtmp (file-local-copy new))
+ (switches diff-switches)
+ (command
+ (mapconcat
+ 'identity
+ `(,diff-command
+ ;; Use explicitly specified switches
+ ,@(if (listp switches) switches (list switches))
+ ,@(if (or old new)
+ (list "-L" old
+ "-L" (shell-quote-argument
+ (format "Buffer %s" (buffer-name buffer)))))
+ ,(shell-quote-argument (or oldtmp old))
+ ,(shell-quote-argument (or newtmp new)))
+ " "))
+ proc)
+ (let ((inhibit-read-only t))
+ (insert command "\n")
+ (diff-sentinel
+ (call-process shell-file-name nil
+ (current-buffer) nil
+ shell-command-switch command)))
+ (insert "\n"))))
+ (sit-for 0)
+ (when (file-exists-p tempfile)
+ (delete-file tempfile)))))
+
;;;###autoload
(defun ibuffer-diff-with-file ()
- "View the differences between this buffer and its associated file.
+ "View the differences between marked buffers and their associated files.
+If no buffers are marked, use buffer at point.
This requires the external program \"diff\" to be in your `exec-path'."
(interactive)
- (let ((buf (ibuffer-current-buffer)))
- (unless (buffer-live-p buf)
- (error "Buffer %s has been killed" buf))
- (diff-buffer-with-file buf)))
+ (require 'diff)
+ (let ((marked-bufs (ibuffer-get-marked-buffers)))
+ (when (null marked-bufs)
+ (setq marked-bufs (list (ibuffer-current-buffer t))))
+ (with-current-buffer (get-buffer-create "*Ibuffer Diff*")
+ (setq buffer-read-only nil)
+ (buffer-disable-undo (current-buffer))
+ (erase-buffer)
+ (buffer-enable-undo (current-buffer))
+ (diff-mode)
+ (dolist (buf marked-bufs)
+ (unless (buffer-live-p buf)
+ (error "Buffer %s has been killed" buf))
+ (ibuffer-diff-buffer-with-file-1 buf))
+ (setq buffer-read-only t)))
+ (switch-to-buffer "*Ibuffer Diff*"))
;;;###autoload
(defun ibuffer-copy-filename-as-kill (&optional arg)
@@ -1361,7 +1412,8 @@ You can then feed the file name(s) to other commands with \\[yank]."
nil
group)))
(ibuffer-redisplay t)
- (message "Marked %s buffers" count)))
+ (unless (eq ibuffer-mark-on-buffer-mark ?\s)
+ (message "Marked %s buffers" count))))
;;;###autoload
(defun ibuffer-mark-by-name-regexp (regexp)
@@ -1414,8 +1466,7 @@ You can then feed the file name(s) to other commands with \\[yank]."
""))))))
(ibuffer-mark-on-buffer
#'(lambda (buf)
- (with-current-buffer buf
- (eq major-mode mode)))))
+ (eq (buffer-local-value 'major-mode buf) mode))))
;;;###autoload
(defun ibuffer-mark-modified-buffers ()