From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.help Subject: Re: Help setting nadvice for indent-region Date: Fri, 12 Feb 2016 20:04:41 +0100 Message-ID: <874mddzr5i.fsf@web.de> References: <87a8ne2k6v.fsf@web.de> <87bn7n15ki.fsf@web.de> <87vb5vys7n.fsf@web.de> <871t8idnpq.fsf@web.de> <87k2mac8l7.fsf@web.de> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1455303949 582 80.91.229.3 (12 Feb 2016 19:05:49 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 12 Feb 2016 19:05:49 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Fri Feb 12 20:05:40 2016 Return-path: Envelope-to: geh-help-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 1aUJ2B-0005MJ-Hg for geh-help-gnu-emacs@m.gmane.org; Fri, 12 Feb 2016 20:05:39 +0100 Original-Received: from localhost ([::1]:35514 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aUJ2A-00079n-Sv for geh-help-gnu-emacs@m.gmane.org; Fri, 12 Feb 2016 14:05:38 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:36406) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aUJ1Q-0006D8-RJ for help-gnu-emacs@gnu.org; Fri, 12 Feb 2016 14:04:53 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aUJ1N-0000oa-8D for help-gnu-emacs@gnu.org; Fri, 12 Feb 2016 14:04:52 -0500 Original-Received: from plane.gmane.org ([80.91.229.3]:35469) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aUJ1N-0000o8-0Q for help-gnu-emacs@gnu.org; Fri, 12 Feb 2016 14:04:49 -0500 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1aUJ1K-0004gB-Bv for help-gnu-emacs@gnu.org; Fri, 12 Feb 2016 20:04:46 +0100 Original-Received: from dslb-092-074-178-250.092.074.pools.vodafone-ip.de ([92.74.178.250]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2016 20:04:46 +0100 Original-Received: from michael_heerdegen by dslb-092-074-178-250.092.074.pools.vodafone-ip.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 12 Feb 2016 20:04:46 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 56 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: dslb-092-074-178-250.092.074.pools.vodafone-ip.de User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.90 (gnu/linux) Cancel-Lock: sha1:e5LjWgYkS3zP4e1OcQPNJjGpWfw= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:109147 Archived-At: Kaushal Modi writes: > Right, that's why my first approach was to use macro to generate an > individual advice fn for each fn I was advising. But for my purpose, > this-command works well. FWIW, you can achieve this also without using a macro. > With that, I now use the below as the solution which helps achieve these > goals: > (1) Apply indent-region/eval-region over the whole buffer if a region is > not selected (and even if (mark) returns nil). > (2) Print an assuring message that the function was applied over the whole > buffer AFTER applying the orig-fun. This is because `indent-region` prints > out an "Indenting region .." message, and if I want to display my "Executed > .. on the whole buffer." message, I need to do it after ORIG-FUN is > applied. So I cannot do that in the (interactive ..) form. > > ==== Current solution ===== > > (defvar modi/region-or-whole-fns '(indent-region > eval-region) > "List of functions to act on the whole buffer if no region is selected.") > > (defun modi/advice-region-or-whole (orig-fun &rest args) > "Advice function that applies ORIG-FUN to the whole buffer if no region is > selected. > http://thread.gmane.org/gmane.emacs.help/109025/focus=109102 " > ;; Required to override the "r" argument of `interactive' in functions > like > ;; `indent-region' so that they can be called without an active region. > (interactive (if (use-region-p) > (list (region-beginning) (region-end)) > (list (point-min) (point-max)))) > (prog1 ; Return value of the advising fn needs to be the same as ORIG-FUN > (apply orig-fun args) > (when (and (called-interactively-p 'interactive) > (not (use-region-p))) > (message "Executed %s on the whole buffer." > (propertize (symbol-name this-command) > 'face 'font-lock-function-name-face))))) > > (dolist (fn modi/region-or-whole-fns) > (advice-add fn :around #'modi/advice-region-or-whole)) That looks good. > It's good to see my initial buggy overly complicated macro-based > solution boil down to this more robust (, apparently bug-free), > canonical and a relatively simpler one :) The approach was ok, though I would have tried to avoid using a macro. But well, it also changed the functions, not the interactive specs... Michael.