X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f46305c86cd247b2396e73ce8bb064f69373834d..79a90058ec11dbb56665e85a6631e4b8b5e7a6c6:/lisp/ibuffer.el diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index 586c8306a3..5541bbb310 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -1,6 +1,6 @@ -;;; ibuffer.el --- operate on buffers like dired +;;; ibuffer.el --- operate on buffers like dired -*- lexical-binding:t -*- -;; Copyright (C) 2000-2013 Free Software Foundation, Inc. +;; Copyright (C) 2000-2014 Free Software Foundation, Inc. ;; Author: Colin Walters ;; Maintainer: John Paul Wallington @@ -53,6 +53,8 @@ (defvar ibuffer-tmp-hide-regexps) (defvar ibuffer-tmp-show-regexps) +(declare-function ibuffer-ext-visible-p "ibuf-ext" + (buf all &optional ibuffer-buf)) (declare-function ibuffer-mark-on-buffer "ibuf-ext" (func &optional ibuffer-mark-on-buffer-mark group)) (declare-function ibuffer-generate-filter-groups "ibuf-ext" @@ -154,7 +156,7 @@ elisp byte-compiler." (null buffer-file-name)) italic) (30 (memq major-mode ibuffer-help-buffer-modes) font-lock-comment-face) - (35 (eq major-mode 'dired-mode) font-lock-function-name-face)) + (35 (derived-mode-p 'dired-mode) font-lock-function-name-face)) "An alist describing how to fontify buffers. Each element should be of the form (PRIORITY FORM FACE), where PRIORITY is an integer, FORM is an arbitrary form to evaluate in the @@ -348,6 +350,7 @@ directory, like `default-directory'." (defcustom ibuffer-mode-hook nil "Hook run upon entry into `ibuffer-mode'." :type 'hook + :options '(ibuffer-auto-mode) :group 'ibuffer) (defcustom ibuffer-load-hook nil @@ -462,6 +465,7 @@ directory, like `default-directory'." (define-key map (kbd "M-g") 'ibuffer-jump-to-buffer) (define-key map (kbd "M-s a C-s") 'ibuffer-do-isearch) (define-key map (kbd "M-s a M-C-s") 'ibuffer-do-isearch-regexp) + (define-key map (kbd "M-s a C-o") 'ibuffer-do-occur) (define-key map (kbd "DEL") 'ibuffer-unmark-backward) (define-key map (kbd "M-DEL") 'ibuffer-unmark-all) (define-key map (kbd "* *") 'ibuffer-unmark-all) @@ -536,10 +540,6 @@ directory, like `default-directory'." (define-key map (kbd "/ X") 'ibuffer-delete-saved-filter-groups) (define-key map (kbd "/ \\") 'ibuffer-clear-filter-groups) - (define-key map (kbd "q") 'ibuffer-quit) - (define-key map (kbd "h") 'describe-mode) - (define-key map (kbd "?") 'describe-mode) - (define-key map (kbd "% n") 'ibuffer-mark-by-name-regexp) (define-key map (kbd "% m") 'ibuffer-mark-by-mode-regexp) (define-key map (kbd "% f") 'ibuffer-mark-by-file-name-regexp) @@ -703,7 +703,8 @@ directory, like `default-directory'." '(menu-item "Diff with file" ibuffer-diff-with-file :help "View the differences between this buffer and its file")) (define-key-after map [menu-bar view auto-mode] - '(menu-item "Toggle Auto Mode" ibuffer-auto-mode + '(menu-item "Auto Mode" ibuffer-auto-mode + :button (:toggle . ibuffer-auto-mode) :help "Attempt to automatically update the Ibuffer buffer")) (define-key-after map [menu-bar view customize] '(menu-item "Customize Ibuffer" ibuffer-customize @@ -873,12 +874,6 @@ directory, like `default-directory'." (define-key map [down-mouse-3] 'ibuffer-mouse-popup-menu) map)) -(defvar ibuffer-restore-window-config-on-quit nil - "If non-nil, restore previous window configuration upon exiting `ibuffer'.") - -(defvar ibuffer-prev-window-config nil - "Window configuration before starting Ibuffer.") - (defvar ibuffer-did-modification nil) (defvar ibuffer-compiled-formats nil) @@ -912,7 +907,7 @@ width and the longest string in LIST." (when (zerop columns) (setq columns 1)) (while list - (dotimes (i (1- columns)) + (dotimes (_ (1- columns)) (insert (concat (car list) (make-string (- max (length (car list))) ?\s))) (setq list (cdr list))) @@ -1197,7 +1192,7 @@ a new window in the current frame, splitting vertically." (and (stringp (cadr err)) ;; This definitely falls in the ;; ghetto hack category... - (not (string-match "too small" (cadr err))))) + (not (string-match-p "too small" (cadr err))))) (signal (car err) (cdr err)) (enlarge-window 3)))))) (select-window (next-window)) @@ -1280,7 +1275,7 @@ a new window in the current frame, splitting vertically." :modifier-p t) (set-buffer-modified-p (not (buffer-modified-p)))) -(define-ibuffer-op ibuffer-do-toggle-read-only (&optional arg) +(define-ibuffer-op ibuffer-do-toggle-read-only (&optional _arg);FIXME:arg unused! "Toggle read only status in marked buffers. With optional ARG, make read-only only if ARG is not negative." (:opstring "toggled read only status in" @@ -1525,7 +1520,7 @@ If point is on a group name, this function operates on that group." ;; We use these variables to keep track of which variables ;; inside the generated function we need to bind, since ;; binding variables in Emacs takes time. - str-used tmp1-used tmp2-used global-strlen-used) + (vars-used ())) (dolist (form format) (push ;; Generate a form based on a particular format entry, like @@ -1551,8 +1546,8 @@ If point is on a group name, this function operates on that group." ;; This is a complex case; they want it limited to a ;; minimum size. (setq min-used t) - (setq str-used t strlen-used t global-strlen-used t - tmp1-used t tmp2-used t) + (setq strlen-used t) + (setq vars-used '(str strlen tmp1 tmp2)) ;; Generate code to limit the string to a minimum size. (setq minform `(progn (setq str @@ -1564,7 +1559,8 @@ If point is on a group name, this function operates on that group." strlen) align))))) (when (or (not (integerp max)) (> max 0)) - (setq str-used t max-used t) + (setq max-used t) + (cl-pushnew 'str vars-used) ;; Generate code to limit the string to a maximum size. (setq maxform `(progn (setq str @@ -1592,8 +1588,9 @@ If point is on a group name, this function operates on that group." ;; don't even understand it, and I wrote it five ;; minutes ago. (insertgenfn - (ibuffer-aif (get sym 'ibuffer-column-summarizer) + (if (get sym 'ibuffer-column-summarizer) ;; I really, really wish Emacs Lisp had closures. + ;; FIXME: Elisp does have them now. (lambda (arg sym) `(insert (let ((ret ,arg)) @@ -1601,7 +1598,7 @@ If point is on a group name, this function operates on that group." (cons ret (get ',sym 'ibuffer-column-summary))) ret))) - (lambda (arg sym) + (lambda (arg _sym) `(insert ,arg)))) (mincompform `(< strlen ,(if (integerp min) min @@ -1629,10 +1626,9 @@ If point is on a group name, this function operates on that group." `(when ,maxcompform ,maxform))) outforms) - (push (append - `(setq str ,callform) - (when strlen-used - `(strlen (length str)))) + (push `(setq str ,callform + ,@(when strlen-used + `(strlen (length str)))) outforms) (setq outforms (append outforms @@ -1645,25 +1641,17 @@ If point is on a group name, this function operates on that group." `(let ,letbindings ,@outforms))))) result)) - (setq result - ;; We don't want to unconditionally load the byte-compiler. - (funcall (if (or ibuffer-always-compile-formats - (featurep 'bytecomp)) - #'byte-compile - #'identity) - ;; Here, we actually create a lambda form which - ;; inserts all the generated forms for each entry - ;; in the format string. - (nconc (list 'lambda '(buffer mark)) - `((let ,(append (when str-used - '(str)) - (when global-strlen-used - '(strlen)) - (when tmp1-used - '(tmp1)) - (when tmp2-used - '(tmp2))) - ,@(nreverse result)))))))) + ;; We don't want to unconditionally load the byte-compiler. + (funcall (if (or ibuffer-always-compile-formats + (featurep 'bytecomp)) + #'byte-compile + #'identity) + ;; Here, we actually create a lambda form which + ;; inserts all the generated forms for each entry + ;; in the format string. + `(lambda (buffer mark) + (let ,vars-used + ,@(nreverse result)))))) (defun ibuffer-recompile-formats () "Recompile `ibuffer-formats'." @@ -1681,8 +1669,8 @@ If point is on a group name, this function operates on that group." (defun ibuffer-clear-summary-columns (format) (dolist (form format) - (ibuffer-awhen (and (consp form) - (get (car form) 'ibuffer-column-summarizer)) + (when (and (consp form) + (get (car form) 'ibuffer-column-summarizer)) (put (car form) 'ibuffer-column-summary nil)))) (defun ibuffer-check-formats () @@ -2293,18 +2281,6 @@ If optional arg SILENT is non-nil, do not display progress messages." (goto-char (point-min)) (forward-line orig)))) -(defun ibuffer-quit () - "Quit this `ibuffer' session. -Try to restore the previous window configuration if -`ibuffer-restore-window-config-on-quit' is non-nil." - (interactive) - (if ibuffer-restore-window-config-on-quit - (progn - (bury-buffer) - (unless (= (count-windows) 1) - (set-window-configuration ibuffer-prev-window-config))) - (bury-buffer))) - ;;;###autoload (defun ibuffer-list-buffers (&optional files-only) "Display a list of buffers, in another window. @@ -2345,7 +2321,6 @@ FORMATS is the value to use for `ibuffer-formats'. (interactive "P") (when ibuffer-use-other-window (setq other-window-p t)) - (setq ibuffer-prev-window-config (current-window-configuration)) (let ((buf (get-buffer-create (or name "*Ibuffer*")))) (if other-window-p (funcall (if noselect (lambda (buf) (display-buffer buf t)) #'pop-to-buffer) buf) @@ -2355,10 +2330,9 @@ FORMATS is the value to use for `ibuffer-formats'. ;; We switch to the buffer's window in order to be able ;; to modify the value of point (select-window (get-buffer-window buf 0)) - (or (eq major-mode 'ibuffer-mode) + (or (derived-mode-p 'ibuffer-mode) (ibuffer-mode)) - (setq ibuffer-restore-window-config-on-quit other-window-p) - (when shrink + (when shrink (setq ibuffer-shrink-to-minimum-size shrink)) (when qualifiers (require 'ibuf-ext) @@ -2380,7 +2354,7 @@ FORMATS is the value to use for `ibuffer-formats'. (message "Commands: m, u, t, RET, g, k, S, D, Q; q to quit; h for help")))))) (put 'ibuffer-mode 'mode-class 'special) -(defun ibuffer-mode () +(define-derived-mode ibuffer-mode special-mode "IBuffer" "A major mode for viewing a list of buffers. In Ibuffer, you can conveniently perform many operations on the currently open buffers, in addition to filtering your view to a @@ -2496,7 +2470,6 @@ Other commands: '\\[ibuffer-switch-format]' - Change the current display format. '\\[forward-line]' - Move point to the next line. '\\[previous-line]' - Move point to the previous line. - '\\[ibuffer-quit]' - Bury the Ibuffer buffer. '\\[describe-mode]' - This help. '\\[ibuffer-diff-with-file]' - View the differences between this buffer and its associated file. @@ -2561,10 +2534,6 @@ filter groups are displayed in this order of precedence. You may rearrange filter groups by using the regular '\\[ibuffer-kill-line]' and '\\[ibuffer-yank]' pair. Yanked groups will be inserted before the group at point." - (kill-all-local-variables) - (use-local-map ibuffer-mode-map) - (setq major-mode 'ibuffer-mode) - (setq mode-name "Ibuffer") ;; Include state info next to the mode name. (set (make-local-variable 'mode-line-process) '(" by " @@ -2615,7 +2584,6 @@ will be inserted before the group at point." (set (make-local-variable 'ibuffer-cached-eliding-string) nil) (set (make-local-variable 'ibuffer-cached-elide-long-columns) nil) (set (make-local-variable 'ibuffer-current-format) nil) - (set (make-local-variable 'ibuffer-restore-window-config-on-quit) nil) (set (make-local-variable 'ibuffer-did-modification) nil) (set (make-local-variable 'ibuffer-tmp-hide-regexps) nil) (set (make-local-variable 'ibuffer-tmp-show-regexps) nil) @@ -2624,35 +2592,12 @@ will be inserted before the group at point." (ibuffer-update-format) (when ibuffer-default-directory (setq default-directory ibuffer-default-directory)) - (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) - (run-mode-hooks 'ibuffer-mode-hook)) + (add-hook 'change-major-mode-hook 'font-lock-defontify nil t)) ;;; Start of automatically extracted autoloads. -;;;### (autoloads (ibuffer-do-occur ibuffer-mark-dired-buffers ibuffer-mark-read-only-buffers -;;;;;; ibuffer-mark-special-buffers ibuffer-mark-old-buffers ibuffer-mark-compressed-file-buffers -;;;;;; ibuffer-mark-help-buffers ibuffer-mark-dissociated-buffers -;;;;;; ibuffer-mark-unsaved-buffers ibuffer-mark-modified-buffers -;;;;;; ibuffer-mark-by-mode ibuffer-mark-by-file-name-regexp ibuffer-mark-by-mode-regexp -;;;;;; ibuffer-mark-by-name-regexp ibuffer-copy-filename-as-kill -;;;;;; ibuffer-diff-with-file ibuffer-jump-to-buffer ibuffer-do-kill-lines -;;;;;; ibuffer-backwards-next-marked ibuffer-forward-next-marked -;;;;;; ibuffer-add-to-tmp-show ibuffer-add-to-tmp-hide ibuffer-bs-show -;;;;;; ibuffer-invert-sorting ibuffer-toggle-sorting-mode ibuffer-switch-to-saved-filters -;;;;;; ibuffer-add-saved-filters ibuffer-delete-saved-filters ibuffer-save-filters -;;;;;; ibuffer-or-filter ibuffer-negate-filter ibuffer-exchange-filters -;;;;;; ibuffer-decompose-filter ibuffer-pop-filter ibuffer-filter-disable -;;;;;; ibuffer-switch-to-saved-filter-groups ibuffer-delete-saved-filter-groups -;;;;;; ibuffer-save-filter-groups ibuffer-yank-filter-group ibuffer-yank -;;;;;; ibuffer-kill-line ibuffer-kill-filter-group ibuffer-jump-to-filter-group -;;;;;; ibuffer-clear-filter-groups ibuffer-decompose-filter-group -;;;;;; ibuffer-pop-filter-group ibuffer-set-filter-groups-by-mode -;;;;;; ibuffer-filters-to-filter-group ibuffer-included-in-filters-p -;;;;;; ibuffer-backward-filter-group ibuffer-forward-filter-group -;;;;;; ibuffer-toggle-filter-group ibuffer-mouse-toggle-filter-group -;;;;;; ibuffer-interactive-filter-by-mode ibuffer-mouse-filter-by-mode -;;;;;; ibuffer-auto-mode) "ibuf-ext" "ibuf-ext.el" "9950bdf995e4b5e962a17d754a35f2c6") +;;;### (autoloads nil "ibuf-ext" "ibuf-ext.el" "0d2393d1b47136bc7b1ac41593527f02") ;;; Generated autoloads from ibuf-ext.el (autoload 'ibuffer-auto-mode "ibuf-ext" "\ @@ -2984,7 +2929,7 @@ Mark all buffers whose associated file does not exist. \(fn)" t nil) (autoload 'ibuffer-mark-help-buffers "ibuf-ext" "\ -Mark buffers like *Help*, *Apropos*, *Info*. +Mark buffers whose major mode is in variable `ibuffer-help-buffer-modes'. \(fn)" t nil)