From: Alan Mackenzie <acm@muc.de>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Juanma Barranquero <lekktu@gmail.com>, emacs-devel@gnu.org
Subject: Re: Interactive hat. (Patch)
Date: Mon, 13 Apr 2009 19:32:55 +0000 [thread overview]
Message-ID: <20090413193255.GA2332@muc.de> (raw)
In-Reply-To: <jwv3acz7ki4.fsf-monnier+emacsbugreports@gnu.org>
Hi, Stefan!
On Thu, Mar 26, 2009 at 10:50:11PM -0400, Stefan Monnier wrote:
> > How about I take your suggestion as meaning that page "Interactive Codes"
> > should be enhanced to give the lisp equivalent for each code letter, and
> > it is made clear that the string version is a convenient abbreviation
> > which works nearly all the time, and the Lisp code is the fully general
> > version?
> That's the idea, yes. Additionally, the equivalent Lisp code should be
> simple (a single funcall), which isn't always possible right now, IIRC.
OK, here's the patch. In the end, I put all these lisp forms into a new
page "Non-string Interactive" because it seemed better balanced.
I think that the order of "*" and "@" in (interactive "@*") matters.
Well, it would matter if there were any commands which use them both;
there aren't in Emacs.
It's a fairly hefty patch, so any review/criticism would be welcome.
2009-04-13 Alan Mackenzie <acm@muc.de>
* elisp.texi (Top): Add menu entry for "Non-string Interactive".
* commands.texi (Using Interactive): Amend description of string
form of interactive form. Rectify false statement that the order
of "special" characters is immaterial. Insert a `*' into the
example. Give a rationale for existence of string form, and imply
a non-string form is more general. Remove redundant definitions
of `*', `@' and `^'.
(Interactive Codes): Insert an introduction. Expand the
descriptions of `@' and `^', including details formerly in "Using
Interactive".
(Non-string Interactive): New page giving non-string equivalents
for all code characters.
(Interactive Examples): Add a space after the prompts' colons.
Index: elisp.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/doc/lispref/elisp.texi,v
retrieving revision 1.34
diff -c -r1.34 elisp.texi
*** elisp.texi 9 Apr 2009 01:17:10 -0000 1.34
--- elisp.texi 13 Apr 2009 19:31:09 -0000
***************
*** 662,667 ****
--- 662,668 ----
* Using Interactive:: General rules for @code{interactive}.
* Interactive Codes:: The standard letter-codes for reading arguments
in various ways.
+ * Non-string Interactive:: Non-string equivalents of the letter-codes.
* Interactive Examples:: Examples of how to read interactive arguments.
Input Events
Index: commands.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/doc/lispref/commands.texi,v
retrieving revision 1.18
diff -c -r1.18 commands.texi
*** commands.texi 4 Apr 2009 22:34:23 -0000 1.18
--- commands.texi 13 Apr 2009 19:07:23 -0000
***************
*** 113,142 ****
the reading of arguments for an interactive call.
@menu
! * Using Interactive:: General rules for @code{interactive}.
! * Interactive Codes:: The standard letter-codes for reading arguments
! in various ways.
! * Interactive Examples:: Examples of how to read interactive arguments.
@end menu
@node Using Interactive
@subsection Using @code{interactive}
@cindex arguments, interactive entry
! This section describes how to write the @code{interactive} form that
! makes a Lisp function an interactively-callable command, and how to
! examine a command's @code{interactive} form.
@defspec interactive arg-descriptor
This special form declares that a function is a command, and that it
may therefore be called interactively (via @kbd{M-x} or by entering a
key sequence bound to it). The argument @var{arg-descriptor} declares
how to compute the arguments to the command when the command is called
! interactively.
! A command may be called from Lisp programs like any other function, but
! then the caller supplies the arguments and @var{arg-descriptor} has no
! effect.
@cindex @code{interactive-form}, function property
The @code{interactive} form must be located at top-level in the
--- 113,144 ----
the reading of arguments for an interactive call.
@menu
! * Using Interactive:: General rules for @code{interactive}.
! * Interactive Codes:: The standard letter-codes for reading arguments
! in various ways.
! * Non-string Interactive:: Non-string equivalents of the letter-codes.
! * Interactive Examples:: Examples of how to read interactive arguments.
@end menu
@node Using Interactive
@subsection Using @code{interactive}
@cindex arguments, interactive entry
! This section describes how to write and examine the @dfn{interactive
! form}. This form makes a Lisp function an interactively-callable
! command, and tells the interpreter how to call it.
@defspec interactive arg-descriptor
This special form declares that a function is a command, and that it
may therefore be called interactively (via @kbd{M-x} or by entering a
key sequence bound to it). The argument @var{arg-descriptor} declares
how to compute the arguments to the command when the command is called
! interactively, and sometimes directs the interpreter to perform
! auxiliary actions such as checking the buffer is writable.
! A command may be called from Lisp programs like any other function,
! but then the caller supplies the arguments and @var{arg-descriptor} is
! ignored.
@cindex @code{interactive-form}, function property
The @code{interactive} form must be located at top-level in the
***************
*** 166,187 ****
or more arguments.
@item
! It may be a string; its contents are a sequence of elements separated
! by newlines, one for each parameter@footnote{Some elements actually
! supply two parameters.}. Each element consists of a code character
! (@pxref{ Interactive Codes}) optionally followed by a prompt (which
! some code characters use and some ignore). Here is an example:
@smallexample
! (interactive "P\nbFrobnicate buffer: ")
@end smallexample
@noindent
! The code letter @samp{P} sets the command's first argument to the raw
! command prefix (@pxref{Prefix Command Arguments}). @samp{bFrobnicate
! buffer: } prompts the user with @samp{Frobnicate buffer: } to enter
! the name of an existing buffer, which becomes the second and final
! argument.
@c Emacs 19 feature
The prompt string can use @samp{%} to include previous argument values
--- 168,213 ----
or more arguments.
@item
! It may be a string; the string's contents are:
!
! @itemize @minus
! @item
! Zero or more of the ``special'' code characters @samp{*}, @samp{@@},
! @samp{^}, which direct Emacs to perform auxiliary functions
! (@pxref{Interactive Codes}) before getting the command's arguments.
! They are processed in the order they appear. They are directly
! followed by
! @item
! a sequence of elements separated by newlines, one for each
! argument@footnote{Some elements actually supply two arguments.}.
! Each element consists of a code character (@pxref{ Interactive Codes})
! optionally followed by a prompt (which some code characters use and
! some ignore). The prompt typically ends with @samp{: }.
! @end itemize
!
! Here is an example:
@smallexample
! (interactive "*P\nbFrobnicate buffer: ")
@end smallexample
@noindent
! The @samp{*} checks that the buffer is writable, signaling an error if
! it's read-only. The code letter @samp{P} sets the command's first
! argument to the raw command prefix (@pxref{Prefix Command Arguments}).
! @samp{bFrobnicate buffer: } prompts the user with @samp{Frobnicate
! buffer: } to enter the name of an existing buffer, which becomes the
! second and final argument.
!
! There are more examples in @xref{Interactive Examples}.
!
! The string form of the argument is used more often than a general lisp
! expression, since it's more convenient. However, sometimes you'll
! have to write a non-string lisp form (see below) since the string form
! can't always do what you need. For your convenience, a non-string
! equivalent of each code character is given in @ref{Non-string
! Interactive}.
!
@c Emacs 19 feature
The prompt string can use @samp{%} to include previous argument values
***************
*** 196,229 ****
@end group
@end smallexample
- @cindex @samp{*} in @code{interactive}
- @cindex read-only buffers in interactive
- If @samp{*} appears at the beginning of the string, then an error is
- signaled if the buffer is read-only.
-
- @cindex @samp{@@} in @code{interactive}
- @c Emacs 19 feature
- If @samp{@@} appears at the beginning of the string, and if the key
- sequence used to invoke the command includes any mouse events, then
- the window associated with the first of those events is selected
- before the command is run.
-
- @cindex @samp{^} in @code{interactive}
- @cindex shift-selection, and @code{interactive} spec
- If @samp{^} appears at the beginning of the string, and if the command
- was invoked through @dfn{shift-translation}, set the mark and activate
- the region temporarily, or extend an already active region, before the
- command is run. If the command was invoked without shift-translation,
- and the region is temporarily active, deactivate the region before the
- command is run. Shift-translation is controlled on the user level by
- @code{shift-select-mode}; see @ref{Shift Selection,,, emacs, The GNU
- Emacs Manual}.
-
- You can use @samp{*}, @samp{@@}, and @code{^} together; the order does
- not matter. Actual reading of arguments is controlled by the rest of
- the prompt string (starting with the first character that is not
- @samp{*}, @samp{@@}, or @samp{^}).
-
@item
It may be a Lisp expression that is not a string; then it should be a
form that is evaluated to get a list of arguments to pass to the
--- 222,227 ----
***************
*** 290,297 ****
@cindex codes, interactive, description of
@cindex characters for interactive codes
! The code character descriptions below contain a number of key words,
! defined here as follows:
@table @b
@item Completion
--- 288,299 ----
@cindex codes, interactive, description of
@cindex characters for interactive codes
! This page describes the @dfn{code characters}, the letters and
! punctuation marks contained in the string form of the argument to
! @code{interactive} (@pxref{Using Interactive}).
!
! The descriptions below contain a number of key words, defined here
! as follows:
@table @b
@item Completion
***************
*** 329,350 ****
@end table
@cindex reading interactive arguments
! Here are the code character descriptions for use with @code{interactive}:
@table @samp
@item *
Signal an error if the current buffer is read-only. Special.
@item @@
! Select the window mentioned in the first mouse event in the key
sequence that invoked this command. Special.
@item ^
! If the command was invoked through shift-translation, set the mark and
! activate the region temporarily, or extend an already active region,
! before the command is run. If the command was invoked without
! shift-translation, and the region is temporarily active, deactivate
! the region before the command is run. Special.
@item a
A function name (i.e., a symbol satisfying @code{fboundp}). Existing,
--- 331,368 ----
@end table
@cindex reading interactive arguments
! Here are the code character descriptions for use with
! @code{interactive}. Non-string equivalents of these codes can be
! found in @ref{Non-string Interactive}.
@table @samp
+ @cindex @samp{*} in @code{interactive}
+ @cindex read-only buffers in interactive
@item *
Signal an error if the current buffer is read-only. Special.
+ @cindex @samp{@@} in @code{interactive}
@item @@
! If the key sequence that invokes the command contains a mouse event,
! select the window mentioned in the first mouse event in the key
sequence that invoked this command. Special.
+ @cindex @samp{^} in @code{interactive}
+ @cindex shift-selection, and @code{interactive} spec
@item ^
! This is intended for movement commands. If the command was invoked
! through shift-translation, set the mark and activate the region
! temporarily, or extend an already active region, before the command is
! run. If the command was invoked without shift-translation, and the
! region is temporarily active, deactivate the region before the command
! is run. Shift-translation is controlled on the user level by
! @code{shift-select-mode}; @xref{Shift Selection,,, emacs, The GNU
! Emacs Manual}. @footnote{Note that the code character @samp{^} was
! introduced in Emacs 23 and will cause an error if used in earlier
! Emacs versions. If you want to use @samp{^} yet your command needs to
! run in an earlier version of Emacs, you should write the interactive
! spec as a non-string form instead. (@pxref{Non-string Interactive})}
! Special.
@item a
A function name (i.e., a symbol satisfying @code{fboundp}). Existing,
***************
*** 356,363 ****
Prompt.
@item B
! A buffer name. The buffer need not exist. By default, uses the name of
! a recently used buffer other than the current buffer. Completion,
Default, Prompt.
@item c
--- 374,381 ----
Prompt.
@item B
! A buffer name. The buffer need not exist. By default, uses the name
! of a recently used buffer other than the current buffer. Completion,
Default, Prompt.
@item c
***************
*** 504,509 ****
--- 522,771 ----
argument value. Completion, Existing, Prompt.
@end table
+ @node Non-string Interactive
+ @comment node-name, next, previous, up
+ @subsection Non-string Equivalents of Interactive Code Characters
+
+ This page sketches non-string equivalents for each of the code
+ characters used in the string version of the interactive form. These
+ should help you when you when you need to build the functionality of
+ the code characters into a non-string interactive form. The semantics
+ of a non-string interactive form is defined in @ref{Using Interactive}
+ and the individual code characters are defined in @ref{Interactive
+ Codes}.
+
+ @table @asis
+ @item @samp{*} - check buffer is writable
+ @lisp
+ (interactive (progn (barf-if-buffer-readonly) nil))
+ @c There's funny stuff in callint.c; if the interactive string
+ @c consists of one other element besides '*', and that element isn't
+ @c 'p', 'P', or 'r', it is processed first before calling `barf-if-..'.
+ @c I don't know why this is so. (ACM, 2009-04-10).
+ @end lisp
+
+ @item @samp{@@} - Select window of mouse event
+ @lisp
+ (interactive
+ (let ((events (this-command-keys-vector))
+ e w
+ (i 0))
+ (while (and (< i (length events))
+ (not (consp (setq e (aref events i)))))
+ (setq i (1+ i)))
+ (when (consp e)
+ (setq w (car (cadr e)))
+ (if (windowp w)
+ (if (and (window-minibuffer-p w)
+ (> (minibuffer-depth) 0))
+ (error "Attempt to select silly inactive minibuffer window")))
+ (run-hooks mouse-leave-buffer-hook)
+ (select-window w))
+ nil))
+ @end lisp
+ Note that this form only works when the @var{keys} parameter to
+ @code{call-interactively} is @code{nil} (which it almost always is).
+
+ @item @samp{^} - shift-translation
+ @lisp
+ (interactive
+ (progn (if (fboundp 'handle-shift-selection)
+ (handle-shift-selection))
+ nil))
+ @end lisp
+
+ @item @samp{a} - function name
+ @lisp
+ (interactive (list (completing-read "Function: " obarray 'fboundp t)))
+ @end lisp
+
+ @item @samp{b} - existing buffer
+ @lisp
+ (interactive (list (read-buffer "Buffer: " (current-buffer) t)))
+ @end lisp
+
+ @item @samp{B} - buffer
+ @lisp
+ (interactive (list (read-buffer "Buffer: " (other-buffer))))
+ @end lisp
+
+ @item @samp{c} - character
+ @lisp
+ (interactive
+ (let ((prompt "Char: "))
+ (put-text-property 0 (length prompt) 'face 'minibuffer-prompt prompt)
+ (list (read-char prompt))))
+ @end lisp
+
+ @item @samp{C} - command
+ @lisp
+ (interactive (list (completing-read "Command: " obarray 'commandp t)))
+ @end lisp
+
+ @item @samp{d} - point
+ @lisp
+ (interactive (list (point)))
+ @end lisp
+
+ @item @samp{D} - existing directory
+ @lisp
+ (interactive
+ (list (read-file-name "Directory: "
+ nil default-directory t nil 'file-directory-p)))
+ @end lisp
+
+ @item @samp{e} - mouse event
+ @lisp
+ (interactive
+ (let* ((events (this-command-keys-vector))
+ e
+ (i 0))
+ (while (and (< i (length events))
+ (not (consp (setq e (aref events i)))))
+ (setq i (1+ i)))
+ (and (consp e) (list e))))
+ @end lisp
+ Note that this form only works when the @var{keys} parameter to
+ @code{call-interactively} is @code{nil} (which it almost always is).
+
+ @item @samp{f} - existing file
+ @lisp
+ (interactive (list (read-file-name "File name: " nil nil t)))
+ @end lisp
+
+ @item @samp{F} - file
+ @lisp
+ (interactive (list (read-file-name "File name: ")))
+ @end lisp
+
+ @item @samp{G} - file or directory
+ @lisp
+ (interactive (list (read-file-name "F or d name: " nil nil nil "")))
+ @end lisp
+
+ @item @samp{i} - nil
+ @lisp
+ (interactive '(nil))
+ @end lisp
+
+ @item @samp{k} - key sequence (with case conversion)
+ @lisp
+ (interactive
+ (let ((prompt "Key binding: ")
+ (ks) last-event)
+ (put-text-property 0 (length prompt) 'face 'minibuffer-prompt prompt)
+ (setq ks (read-key-sequence prompt)
+ last-event (aref ks (1- (length ks))))
+ (if (consp last-event) (setq last-event (car last-event)))
+ (setq my-up-event
+ (and (symbolp last-event)
+ (memq 'down (get last-event 'event-symbol-elements))
+ (vector (read-event))))
+ (list ks)))
+ @end lisp
+ Note how @code{my-up-event} gets set to the mouse up event, if any.
+ You can use this for the @samp{U} equivalent (see below).
+
+ @item @samp{K} - key sequence (no case conversion)
+ @lisp
+ (interactive
+ (let ((prompt "Key binding: ")
+ (ks) last-event)
+ (put-text-property 0 (length prompt) 'face 'minibuffer-prompt prompt)
+ (setq ks (read-key-sequence prompt nil t)
+ last-event (aref ks (1- (length ks))))
+ (if (consp last-event) (setq last-event (car last-event)))
+ (setq my-up-event
+ (and (symbolp last-event)
+ (memq 'down (get last-event 'event-symbol-elements))
+ (vector (read-event))))
+ (list ks)))
+ @end lisp
+ Note how @code{my-up-event} gets set to the mouse up event, if any.
+ You can use this for the @samp{U} equivalent (see below).
+
+ @item @samp{m} - mark
+ @lisp
+ (interactive (list (mark)))
+ @end lisp
+
+ @item @samp{M} - text (with current input method)
+ @lisp
+ (interactive (list (read-string "Text: " nil nil nil t)))
+ @end lisp
+
+ @item @samp{n} - number
+ @lisp
+ (interactive (list (read-number "Number: ")))
+ @end lisp
+
+ @item @samp{N} - numeric prefix or read number
+ @lisp
+ (interactive
+ (list (if current-prefix-arg
+ (prefix-numeric-value current-prefix-arg)
+ (read-number "Number: "))))
+ @end lisp
+
+ @item @samp{p} - numeric prefix
+ @lisp
+ (interactive (list (prefix-numeric-value current-prefix-arg)))
+ @end lisp
+
+ @item @samp{P} - raw prefix
+ @lisp
+ (interactive (list current-prefix-arg))
+ @end lisp
+
+ @item @samp{r} - region
+ @lisp
+ (interactive (list (region-beginning) (region-end)))
+ @end lisp
+
+ @item @samp{s} - text (without input method)
+ @lisp
+ (interactive (list (read-string "Text: " nil nil nil t)))
+ @end lisp
+
+ @item @samp{S} - symbol
+ @lisp
+ (interactive (list (intern (read-string "Symbol: "))))
+ @end lisp
+
+ @item @samp{U} - mouse up event
+ @lisp
+ (interactive (list my-up-event))
+ @end lisp
+ @code{my-up-event} is set by the lisp for @samp{k} or @samp{K}. You
+ should declare and maintain this variable in your own code.
+
+ @item @samp{v} - user option
+ @lisp
+ (interactive (list (read-variable "Option: ")))
+ @end lisp
+
+ @item @samp{x} - lisp expression
+ @lisp
+ (interactive (list (read-minibuffer "Lisp expression: ")))
+ @end lisp
+
+ @item @samp{X} - lisp expression, evaluated
+ @lisp
+ (interactive (list (eval-minibuffer "Lisp expression: ")))
+ @end lisp
+
+ @item @samp{z} - coding system (or nil)
+ @lisp
+ (interactive (list (read-coding-system "Coding system: ")))
+ @end lisp
+
+ @item @samp{Z} - with prefix arg, coding system else nil
+ @lisp
+ (interactive (list (and current-prefix-arg
+ (read-non-nil-coding-system "Coding system: "))))
+ @end lisp
+ @end table
+
@node Interactive Examples
@comment node-name, next, previous, up
@subsection Examples of Using @code{interactive}
***************
*** 530,537 ****
@end group
@group
! (defun foo3 (n) ; @r{@code{foo3} takes one argument,}
! (interactive "nCount:") ; @r{which is read with the Minibuffer.}
(forward-word (* 2 n)))
@result{} foo3
@end group
--- 792,799 ----
@end group
@group
! (defun foo3 (n) ; @r{@code{foo3} takes one argument,}
! (interactive "nCount: ") ; @r{which is read with the Minibuffer.}
(forward-word (* 2 n)))
@result{} foo3
@end group
***************
*** 541,547 ****
"Select three existing buffers.
Put them into three windows, selecting the last one."
@end group
! (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:")
(delete-other-windows)
(split-window (selected-window) 8)
(switch-to-buffer b1)
--- 803,809 ----
"Select three existing buffers.
Put them into three windows, selecting the last one."
@end group
! (interactive "bBuffer1: \nbBuffer2: \nbBuffer3: ")
(delete-other-windows)
(split-window (selected-window) 8)
(switch-to-buffer b1)
> Stefan
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2009-04-13 19:32 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090323223703.GA5650@muc.de>
[not found] ` <jwvfxh392k9.fsf-monnier+emacsbugreports@gnu.org>
[not found] ` <20090324135210.GA4657@muc.de>
[not found] ` <jwvzlfacrk0.fsf-monnier+emacsbugreports@gnu.org>
2009-03-25 10:16 ` Interactive hat. [Was: CUA-like stuff spuriously enables transient-mark-mode] Alan Mackenzie
2009-03-25 10:30 ` Interactive hat Miles Bader
2009-03-25 10:53 ` Alan Mackenzie
2009-03-25 11:03 ` Lennart Borgman
2009-03-25 14:24 ` Alan Mackenzie
2009-03-26 11:29 ` Alan Mackenzie
2009-03-25 14:59 ` Miles Bader
2009-03-26 11:51 ` Alan Mackenzie
2009-03-26 12:14 ` David Kastrup
2009-03-26 12:51 ` Alan Mackenzie
2009-03-26 13:48 ` Stefan Monnier
2009-03-26 14:33 ` Alan Mackenzie
2009-03-26 16:30 ` Stefan Monnier
2009-03-26 16:45 ` Alan Mackenzie
2009-03-26 18:57 ` Stefan Monnier
2009-03-29 0:44 ` Kim F. Storm
2009-03-29 1:40 ` Miles Bader
2009-03-29 2:02 ` Lennart Borgman
2009-03-26 14:47 ` Stephen J. Turnbull
2009-03-26 15:23 ` Miles Bader
2009-03-26 17:43 ` Stephen J. Turnbull
2009-03-25 16:18 ` Stefan Monnier
2009-03-25 11:26 ` Interactive hat. [Was: CUA-like stuff spuriously enables transient-mark-mode] Juanma Barranquero
2009-03-25 13:20 ` Interactive hat Chong Yidong
2009-03-25 14:19 ` Interactive hat. [Was: CUA-like stuff spuriously enables transient-mark-mode] Alan Mackenzie
2009-03-25 16:41 ` Juanma Barranquero
2009-03-26 12:44 ` Alan Mackenzie
2009-03-26 13:50 ` Interactive hat Stefan Monnier
2009-03-26 15:27 ` Alan Mackenzie
2009-03-26 17:09 ` Stefan Monnier
2009-03-26 19:06 ` Alan Mackenzie
2009-03-26 21:18 ` Stefan Monnier
2009-03-26 22:32 ` Johan Bockgård
2009-03-26 23:34 ` Alan Mackenzie
2009-03-26 23:32 ` Alan Mackenzie
2009-03-27 2:50 ` Stefan Monnier
2009-03-27 11:15 ` Alan Mackenzie
2009-04-13 19:32 ` Alan Mackenzie [this message]
2009-04-13 20:47 ` Interactive hat. (Patch) Eli Zaretskii
2009-04-14 20:15 ` Alan Mackenzie
2009-04-14 20:47 ` Eli Zaretskii
[not found] ` <20090423205030.GA2723@muc.de>
2009-04-24 13:38 ` Interactive hat. (Patch V2) Eli Zaretskii
2009-04-27 11:46 ` Alan Mackenzie
2009-04-27 18:39 ` Eli Zaretskii
2009-04-28 22:33 ` Alan Mackenzie
2009-04-29 7:22 ` Eli Zaretskii
2009-04-29 11:36 ` Alan Mackenzie
2009-04-29 13:13 ` Eli Zaretskii
2009-05-07 19:14 ` Stefan Monnier
2009-04-28 0:14 ` Karl Berry
2009-04-28 1:12 ` Miles Bader
2009-04-28 7:55 ` Eli Zaretskii
2009-04-28 21:44 ` Alan Mackenzie
2009-04-28 21:39 ` Alan Mackenzie
2009-04-13 22:50 ` Interactive hat. (Patch) Miles Bader
2009-04-14 20:22 ` Alan Mackenzie
2009-04-14 20:49 ` Eli Zaretskii
2009-04-15 8:29 ` Stephen J. Turnbull
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090413193255.GA2332@muc.de \
--to=acm@muc.de \
--cc=emacs-devel@gnu.org \
--cc=lekktu@gmail.com \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).