From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Pascal J. Bourguignon" Newsgroups: gmane.emacs.help Subject: Re: How to write the "interactive" form for a command acting on a region Date: Tue, 13 Jan 2015 23:38:48 +0100 Organization: Informatimago Message-ID: <87twzuwbk7.fsf@kuiper.lan.informatimago.com> References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1421189125 27446 80.91.229.3 (13 Jan 2015 22:45:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 13 Jan 2015 22:45:25 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Tue Jan 13 23:45:21 2015 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 1YBAD9-00088s-UC for geh-help-gnu-emacs@m.gmane.org; Tue, 13 Jan 2015 23:45:20 +0100 Original-Received: from localhost ([::1]:41760 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YBAD9-0001fk-1Q for geh-help-gnu-emacs@m.gmane.org; Tue, 13 Jan 2015 17:45:19 -0500 Original-Path: usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 66 Original-X-Trace: individual.net djB0FAEZkRHDRzR1+VfwpQE75Lkh6bQrA0ixgp0Numys8sZHsL Cancel-Lock: sha1:OGFjZGVjOTc1NmE1ZDM2NjJmYWRkOTMwNjY3NTQ0MDc0Y2Q1MTY1Mg== sha1:1vjZrrWKXsgKm9yW94/h+DUEeLg= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) Original-Xref: usenet.stanford.edu gnu.emacs.help:209776 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:102055 Archived-At: Marcin Borkowski writes: > Hi all, > > so I want to have a function which should do something on the region. > If no region is active, I want it to act on the whole buffer. If called > from Lisp code, I want to be able to supply "begin" and/or "end" > parameters, which (if nil) should default to (point-min) and > (point-max). Finally, I want my command to behave differently depending > on whether it was called interactively or programmatically. If you want a different behavior, then you should have different functions: (defun my-FUNCTION (…) …) (defun my-COMMAND (…) (interactive …) … (my-function …) …) (defun my-command (start end) (interactive "r") (message "start=%s end=%s" start end)) A region is always defined, whether transient-mark-mode is on or off, and whether the region is active or not. Therefore interactive "r" will always give you start and end points. You could have a command such as: (defun my-command (start end) (interactive "r") (if (use-region-p) ; region is active (my-function start end) (my-function (point-min) (point-max)))) Otherwise, if the behavior of your command and your function was the same, you could write a single command, using (require 'cl) to deal with the default values. But since you want to force the arguments when it's called interactively without an active region, you will have to duplicate some code. Separating the function and command is probablyh preferable in your situation. (require 'cl) (defun* my-command (&optional (start (point-min)) (end (point-max))) (interactive "r") (when (and (called-interactively-p) (not (use-region-p))) (setf start (point-min) end (point-max))) …) -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk