diff options
author | John Paul Wallington <jpw@pobox.com> | 2008-06-26 15:26:58 +0000 |
---|---|---|
committer | John Paul Wallington <jpw@pobox.com> | 2008-06-26 15:26:58 +0000 |
commit | c93addf59ea9bd82117b70a8a3ddc9428b3a1919 (patch) | |
tree | 3a59088a7e60f8f3107f95125f97d4908f1ebdc2 /lisp/ibuf-ext.el | |
parent | c9fc02c727886c8ca8863365a395c91024455789 (diff) | |
download | emacs-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.el | 67 |
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 () |