From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Filipp Gunbin Newsgroups: gmane.emacs.bugs Subject: bug#20463: 25.0.50; New deletion commands in buffer-menu [PATCH] Date: Wed, 29 Apr 2015 20:55:42 +0300 Message-ID: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1430330249 3919 80.91.229.3 (29 Apr 2015 17:57:29 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 29 Apr 2015 17:57:29 +0000 (UTC) To: 20463@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Apr 29 19:57:13 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YnWET-0004Gj-03 for geb-bug-gnu-emacs@m.gmane.org; Wed, 29 Apr 2015 19:57:13 +0200 Original-Received: from localhost ([::1]:40387 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnWES-0002RH-2H for geb-bug-gnu-emacs@m.gmane.org; Wed, 29 Apr 2015 13:57:12 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:49768) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnWEN-0002Ov-Up for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:57:09 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YnWEI-0004ER-RY for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:57:07 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:46691) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnWEI-0004EN-OQ for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:57:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YnWEI-0005wg-Fv for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:57:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Filipp Gunbin Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 29 Apr 2015 17:57:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 20463 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.143033016522776 (code B ref -1); Wed, 29 Apr 2015 17:57:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 29 Apr 2015 17:56:05 +0000 Original-Received: from localhost ([127.0.0.1]:56666 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YnWDL-0005vG-CR for submit@debbugs.gnu.org; Wed, 29 Apr 2015 13:56:04 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:36046) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YnWDI-0005uk-4R for submit@debbugs.gnu.org; Wed, 29 Apr 2015 13:56:01 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YnWDB-000464-A5 for submit@debbugs.gnu.org; Wed, 29 Apr 2015 13:55:54 -0400 Original-Received: from lists.gnu.org ([208.118.235.17]:35417) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnWDB-000460-73 for submit@debbugs.gnu.org; Wed, 29 Apr 2015 13:55:53 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:49552) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnWD9-00020F-QC for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:55:53 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YnWD4-000445-Hc for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:55:51 -0400 Original-Received: from out1-smtp.messagingengine.com ([66.111.4.25]:43738) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnWD4-00043i-9J for bug-gnu-emacs@gnu.org; Wed, 29 Apr 2015 13:55:46 -0400 Original-Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 940A3208B6 for ; Wed, 29 Apr 2015 13:55:44 -0400 (EDT) Original-Received: from frontend2 ([10.202.2.161]) by compute4.internal (MEProxy); Wed, 29 Apr 2015 13:55:44 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=fastmail.fm; h= content-type:date:from:message-id:mime-version:subject:to :x-sasl-enc:x-sasl-enc; s=mesmtp; bh=FJ7Wjb0akL1EZtpoKCFg0r1hfDs =; b=Y+ejT1UqkjTleOB35l3T3lOdJe1G45a53yGU0n9DyG0yGY3v+AvlDG/eHrN lk7gP5Np7cjGKU6IQHggK0XKBVnt0YcrEMG56XbRU53xBotFN/mOo+weiW/e5d83 U6pZUQs38AZ2oBPZM9MOEELX+oNXB//jsiHEVFF/YdYNk+YI= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:message-id :mime-version:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=FJ 7Wjb0akL1EZtpoKCFg0r1hfDs=; b=nebJJ+rozTf0JsIAk7yWyMi/a+N2asqrh+ lmW9c/7ktE92GVt/zv7vhAGELZaYs7S7/h8crnlZF5YpASLAweTS2VeBbwi1Uyly cts0d0uMyI+NkH9Z/7ka/G+OfRUgznPB5WkvYbtA9YQ2N75n8FRLunaJKQjx3Zso fTW5rZABA= X-Sasl-enc: Y51YSprZ6NmzE1hjA6Zf1qkNxaAK7HFb3UOQlOiYXjPw 1430330144 Original-Received: from fgunbin.local (unknown [94.25.218.10]) by mail.messagingengine.com (Postfix) with ESMTPA id 07947680143 for ; Wed, 29 Apr 2015 13:55:43 -0400 (EDT) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:102250 Archived-At: --=-=-= Content-Type: text/plain What about these new commands in buffer-menu? I find these useful in sessions with lots of buffers. `D m' Prompt for major mode name and delete all buffers in that mode. `D b' Prompt for regexp and mark for deletion all buffers with matching names. `D f' Prompt for regexp and mark for deletion all buffers with mathing file names. Filipp --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=buf-menu-by-mode.patch diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 91bc038..18264f2 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -96,6 +96,9 @@ This is set by the prefix argument to `buffer-menu' and related commands.") (make-variable-buffer-local 'Buffer-menu-files-only) +(defvar Buffer-menu--regexp-history nil + "History list for buffer name regular expressions.") + (defvar Info-current-file) ; from info.el (defvar Info-current-node) ; from info.el @@ -130,6 +133,9 @@ commands.") (define-key map (kbd "M-s a C-s") 'Buffer-menu-isearch-buffers) (define-key map (kbd "M-s a M-C-s") 'Buffer-menu-isearch-buffers-regexp) (define-key map (kbd "M-s a C-o") 'Buffer-menu-multi-occur) + (define-key map (kbd "D m") 'Buffer-menu-delete-by-major-mode) + (define-key map (kbd "D b") 'Buffer-menu-delete-by-buffer-name-regexp) + (define-key map (kbd "D f") 'Buffer-menu-delete-by-file-name-regexp) (define-key map [mouse-2] 'Buffer-menu-mouse-select) (define-key map [follow-link] 'mouse-face) @@ -243,7 +249,13 @@ In Buffer Menu mode, the following commands are defined: \\[Buffer-menu-toggle-read-only] Toggle read-only status of buffer on this line. \\[revert-buffer] Update the list of buffers. \\[Buffer-menu-toggle-files-only] Toggle whether the menu displays only file buffers. -\\[Buffer-menu-bury] Bury the buffer listed on this line." +\\[Buffer-menu-bury] Bury the buffer listed on this line. +\\[Buffer-menu-delete-by-major-mode] Prompt for major mode name and + delete all buffers in that mode. +\\[Buffer-menu-delete-by-buffer-name-regexp] Prompt for regexp and + mark for deletion all buffers with matching names. +\\[Buffer-menu-delete-by-file-name-regexp] Prompt for regexp and + mark for deletion all buffers with mathing file names." (set (make-local-variable 'buffer-stale-function) (lambda (&optional _noconfirm) 'fast)) (add-hook 'tabulated-list-revert-hook 'list-buffers--refresh nil t)) @@ -270,7 +282,7 @@ Menu." (interactive "P") (switch-to-buffer (list-buffers-noselect arg)) (message - "Commands: d, s, x, u; f, o, 1, 2, m, v; ~, %%; q to quit; ? for help.")) + "Commands: d, s, x, u; f, o, 1, 2, m, v; ~, %%; D m, D b, D f; q to quit; ? for help.")) (defun buffer-menu-other-window (&optional arg) "Display the Buffer Menu in another window. @@ -282,7 +294,7 @@ ARG, show only buffers that are visiting files." (interactive "P") (switch-to-buffer-other-window (list-buffers-noselect arg)) (message - "Commands: d, s, x, u; f, o, 1, 2, m, v; ~, %%; q to quit; ? for help.")) + "Commands: d, s, x, u; f, o, 1, 2, m, v; ~, %%; D m, D b, D f; q to quit; ? for help.")) ;;;###autoload (defun list-buffers (&optional arg) @@ -651,6 +663,70 @@ means list those buffers and no others." (setq tabulated-list-entries (nreverse entries))) (tabulated-list-init-header)) +(defun Buffer-menu--delete-by-predicate (pred) + (let ((count 0)) + (save-excursion + (Buffer-menu-beginning) + (while (not (eobp)) + (let ((buffer (tabulated-list-get-id)) + (entry (tabulated-list-get-entry))) + (if (funcall pred buffer entry) + (progn + (Buffer-menu-delete 1) + (setq count (1+ count))) + (forward-line 1))))) + (message "Marked %d buffers" count))) + +(defun Buffer-menu-delete-by-major-mode (mode) + "Mark for deletion all buffers whose mode symbol's name is MODE. Interactively, +ask for the MODE, providing completion." + (interactive + (list + (let ((this-line-buffer (tabulated-list-get-id)) + modes) + (save-excursion + (Buffer-menu-beginning) + (while (not (eobp)) + (let ((buffer (tabulated-list-get-id))) + (add-to-list 'modes (with-current-buffer buffer + (symbol-name major-mode)))) + (forward-line 1))) + (completing-read + "Buffer major mode: " (sort modes (function string<)) + nil t nil nil + (when this-line-buffer + (with-current-buffer this-line-buffer + (symbol-name major-mode))))))) + (or mode (error "MODE is nil")) + (Buffer-menu--delete-by-predicate + (lambda (buf entry) + (string= (with-current-buffer buf + (symbol-name major-mode)) + mode)))) + +(defun Buffer-menu-delete-by-buffer-name-regexp (regexp) + "Mark for deletion all buffers whose buffer name matches REGEXP" + (interactive + (list + (read-regexp "Buffer name regexp: " 'regexp-history-last + Buffer-menu--regexp-history))) + (or regexp (error "REGEXP is nil")) + (Buffer-menu--delete-by-predicate + (lambda (buf entry) + (string-match regexp (buffer-name buf))))) + +(defun Buffer-menu-delete-by-file-name-regexp (regexp) + "Mark for deletion all buffers whose file name matches REGEXP" + (interactive + (list + (read-regexp "File name regexp: " 'regexp-history-last + Buffer-menu--regexp-history))) + (or regexp (error "REGEXP is nil")) + (Buffer-menu--delete-by-predicate + (lambda (buf entry) + (and (buffer-file-name buf) + (string-match regexp (buffer-file-name buf)))))) + (defun tabulated-list-entry-size-> (entry1 entry2) (> (string-to-number (aref (cadr entry1) 4)) (string-to-number (aref (cadr entry2) 4)))) --=-=-=--