From 601a0cfe861eac8ed706a2bb3380c5788a1ef701 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 22 Sep 2014 10:10:53 -0400 Subject: [PATCH] Use lexical-bindin in Ibuffer. * lisp/ibuffer.el (ibuffer-do-toggle-read-only): `arg' is unused. (ibuffer-compile-format): Simplify. (ibuffer-clear-summary-columns): Simplify. * lisp/ibuf-ext.el (ibuffer-generate-filter-groups): Don't use the third elem of dotimes when we don't refer to the iteration var from it. (ibuffer-toggle-sorting-mode): Avoid add-to-list. * lisp/ibuf-macs.el (define-ibuffer-column, define-ibuffer-op): Silence byte-compiler. --- lisp/ChangeLog | 12 ++++++++++ lisp/ibuf-ext.el | 19 ++++++++------- lisp/ibuf-macs.el | 9 +++++-- lisp/ibuffer.el | 61 +++++++++++++++++++++-------------------------- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index e79080ab3d8..3fa8ca5a749 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,15 @@ +2014-09-22 Stefan Monnier + + Use lexical-bindin in Ibuffer. + * ibuffer.el (ibuffer-do-toggle-read-only): `arg' is unused. + (ibuffer-compile-format): Simplify. + (ibuffer-clear-summary-columns): Simplify. + * ibuf-ext.el (ibuffer-generate-filter-groups): Don't use the third + elem of dotimes when we don't refer to the iteration var from it. + (ibuffer-toggle-sorting-mode): Avoid add-to-list. + * ibuf-macs.el (define-ibuffer-column, define-ibuffer-op): + Silence byte-compiler. + 2014-09-22 Stefan Monnier * font-lock.el (font-lock-compile-keyword): Don't confuse a lambda diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el index a3c5b062401..4b13b9ab11b 100644 --- a/lisp/ibuf-ext.el +++ b/lisp/ibuf-ext.el @@ -1,4 +1,4 @@ -;;; ibuf-ext.el --- extensions for ibuffer +;;; ibuf-ext.el --- extensions for ibuffer -*- lexical-binding:t -*- ;; Copyright (C) 2000-2014 Free Software Foundation, Inc. @@ -523,9 +523,9 @@ To evaluate a form without viewing the buffer, see `ibuffer-do-eval'." ibuffer-filter-groups (append ibuffer-filter-groups (list (cons "Default" nil)))))) -;; (dolist (hidden ibuffer-hidden-filter-groups) -;; (setq filter-group-alist (ibuffer-delete-alist -;; hidden filter-group-alist))) + ;; (dolist (hidden ibuffer-hidden-filter-groups) + ;; (setq filter-group-alist (ibuffer-delete-alist + ;; hidden filter-group-alist))) (let ((vec (make-vector (length filter-group-alist) nil)) (i 0)) (dolist (filtergroup filter-group-alist) @@ -540,12 +540,13 @@ To evaluate a form without viewing the buffer, see `ibuffer-do-eval'." (cl-incf i) (setq bmarklist lamers)))) (let (ret) - (dotimes (j i ret) + (dotimes (j i) (let ((bufs (aref vec j))) (unless (and noempty (null bufs)) (push (cons (car (nth j filter-group-alist)) bufs) - ret)))))))) + ret)))) + ret)))) ;;;###autoload (defun ibuffer-filters-to-filter-group (name) @@ -1100,9 +1101,9 @@ Default sorting modes are: Major Mode - the name of the major mode of the buffer Size - the size of the buffer" (interactive) - (let ((modes (mapcar 'car ibuffer-sorting-functions-alist))) - (add-to-list 'modes 'recency) - (setq modes (sort modes 'string-lessp)) + (let ((modes (mapcar #'car ibuffer-sorting-functions-alist))) + (cl-pushnew 'recency modes) + (setq modes (sort modes #'string-lessp)) (let ((next (or (car-safe (cdr-safe (memq ibuffer-sorting-mode modes))) (car modes)))) (setq ibuffer-sorting-mode next) diff --git a/lisp/ibuf-macs.el b/lisp/ibuf-macs.el index a475e1eccb9..96701ee4d39 100644 --- a/lisp/ibuf-macs.el +++ b/lisp/ibuf-macs.el @@ -1,4 +1,4 @@ -;;; ibuf-macs.el --- macros for ibuffer +;;; ibuf-macs.el --- macros for ibuffer -*- lexical-binding:t -*- ;; Copyright (C) 2000-2014 Free Software Foundation, Inc. @@ -111,6 +111,7 @@ change its definition, you should explicitly call ,(if inline `(push '(,sym ,bod) ibuffer-inline-columns) `(defun ,sym (buffer mark) + (ignore mark) ;Silence byte-compiler if mark is unused. ,bod)) (put (quote ,sym) 'ibuffer-column-name ,(if (stringp name) @@ -204,7 +205,8 @@ macro for exactly what it does. (declare (indent 2) (doc-string 3)) `(progn (defun ,(intern (concat (if (string-match "^ibuffer-do" (symbol-name op)) - "" "ibuffer-do-") (symbol-name op))) + "" "ibuffer-do-") + (symbol-name op))) ,args ,(if (stringp documentation) documentation @@ -247,6 +249,9 @@ macro for exactly what it does. (_ 'ibuffer-map-marked-lines)) #'(lambda (buf mark) + ;; Silence warning for code that doesn't + ;; use `mark'. + (ignore mark) ,(if (eq modifier-p :maybe) `(let ((ibuffer-tmp-previous-buffer-modification (buffer-modified-p buf))) diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index 0f219e143b2..2bff41b8024 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -1,4 +1,4 @@ -;;; ibuffer.el --- operate on buffers like dired +;;; ibuffer.el --- operate on buffers like dired -*- lexical-binding:t -*- ;; Copyright (C) 2000-2014 Free Software Foundation, Inc. @@ -907,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))) @@ -1275,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" @@ -1520,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 @@ -1546,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 @@ -1559,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 @@ -1587,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)) @@ -1596,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 @@ -1624,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 @@ -1640,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'." @@ -1676,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 () -- 2.39.5