help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: About a programming tip


From: Andreas Röhler
Subject: Re: About a programming tip
Date: Thu, 21 Feb 2013 08:00:37 +0100
User-agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130105 Thunderbird/17.0.2

Am 21.02.2013 07:42, schrieb Thierry Volpiatto:
Xue Fuqiao <xfq.free@gmail.com> writes:

In (info "(elisp) Programming Tips"):

    * In `interactive', if you use a Lisp expression to produce a list
      of arguments, don't try to provide the "correct" default values for
      region or position arguments.
[...]
      You do not need to take such precautions when you use interactive
      specs `d', `m' and `r', because they make special arrangements to
      recompute the argument values on repetition of the command.

I'm confused with these two sentences.  The first sentence says that
"don't try to provide the 'correct' default values for region or
position arguments", but the second sentence says that "you don't need
to take such precautions when you use interactive specs `d', `m' and
`r'".  IIRC the specs `d', `m' and `r' are "region or position
arguments".  Where do I understand wrong, or is it a bug?  Thanks.

(defun foo-1 (beg end)
   (interactive (list (read-number "Beg: " (region-beginning))
                      (read-number "End: " (region-end))))
   (message "%S" (buffer-substring beg end)))

(defun foo (beg end)
   (interactive "r")
   (message "%S" (buffer-substring beg end)))

In other words you don't have to use foo-1, it is easier to use foo.


IMO these remarks are misleading indeed, as the form "r" will raise an error if 
no region exists.
Quite often I need a command, which works on region if existing, but uses some 
default if not - for example
at the range of the function at point than.

For example if it should work at the whole buffer by default, find in 
convenient to write

(defun foo (&optional beg end)
  " "
  (interactive "*")
  (let ((beg (cond (beg)
                   ((region-active-p)
                    (region-beginning))
                   (t (point-min))))
        (end (cond (end (copy-marker end))
                   ((region-active-p)
                    (copy-marker (region-end)))
                   (t (copy-marker (point-max))))))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]