From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#32731: 26.1.50; Ibuffer filter by mode: Handle >1 mode names Date: Sat, 15 Sep 2018 18:15:18 +0900 Message-ID: <87worn86l5.fsf@calancha-pc.dy.bbexcite.jp> References: <87bm919s5y.fsf@calancha-pc.dy.bbexcite.jp> <874let9lps.fsf@calancha-pc.dy.bbexcite.jp> <87ftydezmi.fsf@gmail.com> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1537002851 10603 195.159.176.226 (15 Sep 2018 09:14:11 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 15 Sep 2018 09:14:11 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: 32731@debbugs.gnu.org To: Noam Postavsky Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Sep 15 11:14:07 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g16eS-0002aG-Sa for geb-bug-gnu-emacs@m.gmane.org; Sat, 15 Sep 2018 11:14:05 +0200 Original-Received: from localhost ([::1]:54823 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g16gY-0005sI-Rr for geb-bug-gnu-emacs@m.gmane.org; Sat, 15 Sep 2018 05:16:14 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42561) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g16gP-0005rz-7q for bug-gnu-emacs@gnu.org; Sat, 15 Sep 2018 05:16:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g16gM-0000pj-0U for bug-gnu-emacs@gnu.org; Sat, 15 Sep 2018 05:16:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:36851) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1g16gL-0000pe-Ru for bug-gnu-emacs@gnu.org; Sat, 15 Sep 2018 05:16:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1g16gL-0000Rr-Mv for bug-gnu-emacs@gnu.org; Sat, 15 Sep 2018 05:16:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tino Calancha Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 15 Sep 2018 09:16:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 32731 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 32731-submit@debbugs.gnu.org id=B32731.15370029341682 (code B ref 32731); Sat, 15 Sep 2018 09:16:01 +0000 Original-Received: (at 32731) by debbugs.gnu.org; 15 Sep 2018 09:15:34 +0000 Original-Received: from localhost ([127.0.0.1]:41109 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g16ft-0000R3-O8 for submit@debbugs.gnu.org; Sat, 15 Sep 2018 05:15:34 -0400 Original-Received: from mail-wr1-f47.google.com ([209.85.221.47]:41841) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g16fq-0000Ql-It for 32731@debbugs.gnu.org; Sat, 15 Sep 2018 05:15:31 -0400 Original-Received: by mail-wr1-f47.google.com with SMTP id z96-v6so12694379wrb.8 for <32731@debbugs.gnu.org>; Sat, 15 Sep 2018 02:15:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=3+gTKl0hkdEmcAXdnLqo6Ze0FYC9KWcI/zrKJXOzjoM=; b=jFIuA94t2/NLxTiSvDqzpVFhvMYe8PiBYxQolZdIFI5AQeS8OYCMtikeIBCNQ+mZoM 5scAfA1OUavORyn1LXRhvg67LBY1BP6hPvmNV3fjqC7gjU4k4xkXTjRe78us1+5IFenp 7xzb36kGnyYqPwrwkwN1sU4vPpVYV1gJLDlg1Ov7yEdXpxUsC0tVV4FbtEmZm3B17s+b N65+sijih6EW1RXIyDmRjuU/3pbzOdaxRws0DqxkLBulTdUjBhEfzei7Py4jEkVOw7dm S8+SW9LrtcYheKB7iLuUgT3uWNFM5xtVino5xAbcTXuRxue58rNMB1e+y7j3GZ2d9dl+ K5yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=3+gTKl0hkdEmcAXdnLqo6Ze0FYC9KWcI/zrKJXOzjoM=; b=b6/KWRxMvkpuVKr3Ae+qZy/5vGHJTppo1uT4oKFhZGnTdiMXbN3sTKGCiuLh/ONlMK TW6TS49ARnCgUC5pbS579nmvvIyOGm618hZa8y6HSkEWyLneZNOcVXH9DGIYp7csY8xd aOXYT6pNxBpT9865Oe1JLtJ+gCrF5rG7scrTV3ZCBJVVzbWQj2RimCbMii3oFGD/o1pe EYTJtb2ntLxSejqzoU4xopb/EPx2zGUwQP4qI5kHh4WLGSrWmdVJRn2cu7WKSQbr3Qu+ PW5QnaE2xLJWtPZV7SFHQurEItALlrqOOIxx2lWicjqz1x35Ecy2AxqDCwWXYWDclDrv OGzg== X-Gm-Message-State: APzg51Doo4x2XvEqMOZfiCdx52IKvOGb1UAsehH119MfSteYV9Ws5fr5 7gBlR5Do60pfvT+4uZ0lDcyxNoay X-Google-Smtp-Source: ANB0Vdb8Rk2lo5xmrbnuTYfNZ+488vDdZtLujDc2rLFTM/Ufw+ZUZbERDBjU8Jaojpbc4RvSulA0cQ== X-Received: by 2002:adf:9ae5:: with SMTP id a92-v6mr13224496wrc.125.1537002924348; Sat, 15 Sep 2018 02:15:24 -0700 (PDT) Original-Received: from calancha-pc.dy.bbexcite.jp (15.red-83-50-151.dynamicip.rima-tde.net. [83.50.151.15]) by smtp.gmail.com with ESMTPSA id i4-v6sm6893226wrs.85.2018.09.15.02.15.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 15 Sep 2018 02:15:23 -0700 (PDT) In-Reply-To: <87ftydezmi.fsf@gmail.com> (Noam Postavsky's message of "Thu, 13 Sep 2018 19:39:17 -0400") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.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" Xref: news.gmane.org gmane.emacs.bugs:150328 Archived-At: Noam Postavsky writes: > Tino Calancha writes: > > Yeah, we need special cases for lists of zero and one modes. No problem. >> Less important but `define-ibuffer-filter' performs some checks >> (there is a `condition-case'). > > The condition-case thing is in a lambda form which goes into > ibuffer-filtering-alist, so I don't think there is a need to explicitly > invoke it when constructing a filter of an existing type. Absolutely. Sorry for the noise. >> Next one just use `completing-read-multiple' (keeps calling >> `'ibuffer-filter-by-used-mode'); I prefer this one: > > I would be okay if it was just a matter of repeated ibuffer-filter-* > calls, but the fact that it produces error messages which then need to > be hidden makes it unacceptable, IMO. I agree with you: those messages must not be produced. BTW, I've noticed following commit is missing in the release branch: 'Make ibuffer filters idempotent' (ee6fe8378a28444cb4913abca4af742f736e9b45) I suggest we backport it. Then, I am OK with the next patch (which uses that commit): --8<-----------------------------cut here---------------start------------->8--- commit c60a9bb36d4d4092866f36d1d8b246b79c1a2fd8 Author: Tino Calancha Date: Sat Sep 15 18:01:14 2018 +0900 Ibuffer filter by modes: Accept several mode names Extend mode filters so that we can input more than 1 mode. For instance, if we want to filter all buffers in C or C++ mode, then we can call the filter interactively with input: 'c-mode,c++-mode'. * lisp/ibuf-ext.el (ibuffer-filter-by-used-modes): New command. Accept a list of mode names (symbols). Interactively, accept a comma separated list of mode names. * lisp/ibuffer.el(ibuffer-mode-map): Rebind '/ m' to the new command. * etc/NEWS(Ibuffer): Announce this change. Co-authored-by: Noam Postavsky diff --git a/etc/NEWS b/etc/NEWS index a54ac2db43..6ef6f20b05 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -48,6 +48,11 @@ often cause crashes. Set it to nil if you really need those fonts. ** Ibuffer --- +*** The new command 'ibuffer-filter-by-used-modes', bound +to '/ m', extends 'ibuffer-filter-by-used-mode'; it makes easy +filtering buffers by a list of major modes. + +--- *** New toggle 'ibuffer-do-toggle-lock', bound to 'L'. ** Imenu diff --git a/lisp/ibuf-ext.el b/lisp/ibuf-ext.el index a3143e5e29..7094ae2674 100644 --- a/lisp/ibuf-ext.el +++ b/lisp/ibuf-ext.el @@ -1265,6 +1265,35 @@ used-mode (ibuffer-list-buffer-modes) nil t nil nil default)))) (eq qualifier (buffer-local-value 'major-mode buf))) +;;;###autoload +(defun ibuffer-filter-by-used-modes(modes) + "Limit current view to buffers with major mode in MODES. +MODES is a list of mode names (symbols). +When called interactively, accept the mode names separated by commas." + (interactive + (let* ((buf (ibuffer-current-buffer)) + (default (if (and buf (buffer-live-p buf)) + (symbol-name (buffer-local-value + 'major-mode buf))))) + (list + (mapcar #'intern + (completing-read-multiple + (if default + (format "Filter by major mode (default %s): " default) + "Filter by major mode: ") + (ibuffer-list-buffer-modes) + nil t nil nil default))))) + ;; Sort to avoid adding filter (or mode2 mode1) once we have (or mode1 mode2) + (setq modes (sort (delete-dups modes) #'string-lessp)) + (cond ((null (cdr modes)) (ibuffer-filter-by-used-mode (car modes))) + (t (let ((composed-filter + `(or ,@(mapcar (lambda (m) `(used-mode . ,m)) modes))) + (mode-names (mapconcat #'symbol-name modes ","))) + (if (null (ibuffer-push-filter composed-filter)) + (message "Filter by mode in use already applied: %s" mode-names) + (message "Filter by mode in use added: %s" mode-names) + (ibuffer-update nil t)))))) + ;;;###autoload (autoload 'ibuffer-filter-by-derived-mode "ibuf-ext") (define-ibuffer-filter derived-mode "Limit current view to buffers whose major mode inherits from QUALIFIER." diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index 08b0801cb5..f7c20d0da3 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -519,7 +519,7 @@ ibuffer-mode-map (define-key map (kbd "s m") 'ibuffer-do-sort-by-major-mode) (define-key map (kbd "/ RET") 'ibuffer-filter-by-mode) - (define-key map (kbd "/ m") 'ibuffer-filter-by-used-mode) + (define-key map (kbd "/ m") 'ibuffer-filter-by-used-modes) (define-key map (kbd "/ M") 'ibuffer-filter-by-derived-mode) (define-key map (kbd "/ n") 'ibuffer-filter-by-name) (define-key map (kbd "/ *") 'ibuffer-filter-by-starred-name) --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.11) Repository revision: 41cdda22c78eb0b00612ce25cdb356dd64322fcc