From: Miles Bader <miles@gnu.org>
Cc: monnier+gnu/emacs@RUM.cs.yale.edu, storm@cua.dk, emacs-devel@gnu.org
Subject: Re: Assignment of misc packages for emacs
Date: 05 Jun 2002 02:27:18 +0900 [thread overview]
Message-ID: <87g0030xah.fsf@tc-1-100.kawasaki.gol.ne.jp> (raw)
In-Reply-To: <200205222227.g4MMRIX29393@aztec.santafe.edu>
[-- Attachment #1: Type: text/plain, Size: 439 bytes --]
Richard Stallman <rms@gnu.org> writes:
> Is there any reason we couldn't make it call out to lisp to do the
> formatting?
>
> It's ok with me if someone finds it easy to do.
What do you think of the appended patch? It moves all the formatting
and prompting for keyboard-menus to lisp (and in the process gets rid
of the one-line-at-a-time interface, since the lisp code just displays
the whole menu at once).
-Miles
Patch:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Patch to move keyboard-menu prompting to lisp --]
[-- Type: text/x-patch, Size: 16743 bytes --]
src/ChangeLog:
2002-06-05 Miles Bader <miles@gnu.org>
* keyboard.c (Vkey_menu_prompt_function): New variable.
(keys_of_keyboard): Initialize it.
(read_char_minibuf_menu_prompt): Remove code which constructed
a minibuffer prompt and interacted with the user. Add code to
construct a list of menu entries and call the lisp function
`key-menu-prompt-function' instead.
(read_char_minibuf_menu_text, read_char_minibuf_menu_width):
Variables removed.
lisp/ChangeLog:
2002-06-05 Miles Bader <miles@gnu.org>
* subr.el (key-menu-prompt): New function.
(key-menu-prompt-function): Set to `key-menu-prompt'.
(key-menu-event-face, key-menu-initial-separator)
(key-menu-separator, key-menu-long-prompt-line-prefix): New variables.
diff -c src/keyboard.c.~1.679.~ src/keyboard.c
*** src/keyboard.c.~1.679.~ Sat May 25 13:38:14 2002
--- src/keyboard.c Wed Jun 5 01:30:26 2002
***************
*** 660,665 ****
--- 660,670 ----
Lisp_Object Vglobal_disable_point_adjustment;
+ /* A function to display keyboard-menus, and read the user's response.
+ If nil, keyboard menus are disabled. */
+
+ Lisp_Object Vkey_menu_prompt_function;
+
/* The time when Emacs started being idle. */
static EMACS_TIME timer_idleness_start_time;
***************
*** 7589,7600 ****
return Qnil ;
}
- /* Buffer in use so far for the minibuf prompts for menu keymaps.
- We make this bigger when necessary, and never free it. */
- static char *read_char_minibuf_menu_text;
- /* Size of that buffer. */
- static int read_char_minibuf_menu_width;
-
static Lisp_Object
read_char_minibuf_menu_prompt (commandflag, nmaps, maps)
int commandflag ;
--- 7594,7599 ----
***************
*** 7603,7614 ****
{
int mapno;
register Lisp_Object name;
- int nlength;
- int width = FRAME_WIDTH (SELECTED_FRAME ()) - 4;
int idx = -1;
- int nobindings = 1;
Lisp_Object rest, vector;
! char *menu;
vector = Qnil;
name = Qnil;
--- 7602,7614 ----
{
int mapno;
register Lisp_Object name;
int idx = -1;
Lisp_Object rest, vector;
! /* This is a list of the prompt and individual menu entries passed to
! lisp for formatting and display. The format is:
! MENU_LIST : (MENU_PROMPT ENTRY...)
! ENTRY : (EVENT PROMPT [BINDING [TOGGLE_TYPE TOGGLE_STATE]]) */
! Lisp_Object menu_list = Qnil;
vector = Qnil;
name = Qnil;
***************
*** 7616,7635 ****
if (! menu_prompting)
return Qnil;
- /* Make sure we have a big enough buffer for the menu text. */
- if (read_char_minibuf_menu_text == 0)
- {
- read_char_minibuf_menu_width = width + 4;
- read_char_minibuf_menu_text = (char *) xmalloc (width + 4);
- }
- else if (width + 4 > read_char_minibuf_menu_width)
- {
- read_char_minibuf_menu_width = width + 4;
- read_char_minibuf_menu_text
- = (char *) xrealloc (read_char_minibuf_menu_text, width + 4);
- }
- menu = read_char_minibuf_menu_text;
-
/* Get the menu name from the first map that has one (a prompt string). */
for (mapno = 0; mapno < nmaps; mapno++)
{
--- 7616,7621 ----
***************
*** 7642,7845 ****
if (!STRINGP (name))
return Qnil;
- /* Prompt string always starts with map's prompt, and a space. */
- strcpy (menu, XSTRING (name)->data);
- nlength = STRING_BYTES (XSTRING (name));
- menu[nlength++] = ':';
- menu[nlength++] = ' ';
- menu[nlength] = 0;
-
/* Start prompting at start of first map. */
mapno = 0;
rest = maps[mapno];
! /* Present the documented bindings, a line at a time. */
! while (1)
{
! int notfirst = 0;
! int i = nlength;
! Lisp_Object obj;
! int ch;
! Lisp_Object orig_defn_macro;
!
! /* Loop over elements of map. */
! while (i < width)
! {
! Lisp_Object elt;
!
! /* If reached end of map, start at beginning of next map. */
! if (NILP (rest))
! {
! mapno++;
! /* At end of last map, wrap around to first map if just starting,
! or end this line if already have something on it. */
! if (mapno == nmaps)
! {
! mapno = 0;
! if (notfirst || nobindings) break;
! }
! rest = maps[mapno];
! }
! /* Look at the next element of the map. */
! if (idx >= 0)
! elt = XVECTOR (vector)->contents[idx];
! else
! elt = Fcar_safe (rest);
! if (idx < 0 && VECTORP (elt))
{
! /* If we found a dense table in the keymap,
! advanced past it, but start scanning its contents. */
! rest = Fcdr_safe (rest);
! vector = elt;
! idx = 0;
}
else
{
! /* An ordinary element. */
! Lisp_Object event, tem;
!
! if (idx < 0)
! {
! event = Fcar_safe (elt); /* alist */
! elt = Fcdr_safe (elt);
! }
! else
! {
! XSETINT (event, idx); /* vector */
! }
!
! /* Ignore the element if it has no prompt string. */
! if (INTEGERP (event) && parse_menu_item (elt, 0, -1))
! {
! /* 1 if the char to type matches the string. */
! int char_matches;
! Lisp_Object upcased_event, downcased_event;
! Lisp_Object desc = Qnil;
! Lisp_Object s
! = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
!
! upcased_event = Fupcase (event);
! downcased_event = Fdowncase (event);
! char_matches = (XINT (upcased_event) == XSTRING (s)->data[0]
! || XINT (downcased_event) == XSTRING (s)->data[0]);
! if (! char_matches)
! desc = Fsingle_key_description (event, Qnil);
!
! #if 0 /* It is redundant to list the equivalent key bindings because
! the prefix is what the user has already typed. */
! tem
! = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ];
! if (!NILP (tem))
! /* Insert equivalent keybinding. */
! s = concat2 (s, tem);
! #endif
! tem
! = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE];
! if (EQ (tem, QCradio) || EQ (tem, QCtoggle))
! {
! /* Insert button prefix. */
! Lisp_Object selected
! = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED];
! if (EQ (tem, QCradio))
! tem = build_string (NILP (selected) ? "(*) " : "( ) ");
! else
! tem = build_string (NILP (selected) ? "[X] " : "[ ] ");
! s = concat2 (tem, s);
! }
!
!
! /* If we have room for the prompt string, add it to this line.
! If this is the first on the line, always add it. */
! if ((XSTRING (s)->size + i + 2
! + (char_matches ? 0 : XSTRING (desc)->size + 3))
! < width
! || !notfirst)
! {
! int thiswidth;
!
! /* Punctuate between strings. */
! if (notfirst)
! {
! strcpy (menu + i, ", ");
! i += 2;
! }
! notfirst = 1;
! nobindings = 0 ;
!
! /* If the char to type doesn't match the string's
! first char, explicitly show what char to type. */
! if (! char_matches)
! {
! /* Add as much of string as fits. */
! thiswidth = XSTRING (desc)->size;
! if (thiswidth + i > width)
! thiswidth = width - i;
! bcopy (XSTRING (desc)->data, menu + i, thiswidth);
! i += thiswidth;
! strcpy (menu + i, " = ");
! i += 3;
! }
!
! /* Add as much of string as fits. */
! thiswidth = XSTRING (s)->size;
! if (thiswidth + i > width)
! thiswidth = width - i;
! bcopy (XSTRING (s)->data, menu + i, thiswidth);
! i += thiswidth;
! menu[i] = 0;
! }
! else
! {
! /* If this element does not fit, end the line now,
! and save the element for the next line. */
! strcpy (menu + i, "...");
! break;
! }
! }
!
! /* Move past this element. */
! if (idx >= 0 && idx + 1 >= XVECTOR (vector)->size)
! /* Handle reaching end of dense table. */
! idx = -1;
! if (idx >= 0)
! idx++;
! else
! rest = Fcdr_safe (rest);
}
}
! /* Prompt with that and read response. */
! message2_nolog (menu, strlen (menu),
! ! NILP (current_buffer->enable_multibyte_characters));
! /* Make believe its not a keyboard macro in case the help char
! is pressed. Help characters are not recorded because menu prompting
! is not used on replay.
! */
! orig_defn_macro = current_kboard->defining_kbd_macro;
! current_kboard->defining_kbd_macro = Qnil;
! do
! obj = read_char (commandflag, 0, 0, Qt, 0);
! while (BUFFERP (obj));
! current_kboard->defining_kbd_macro = orig_defn_macro;
! if (!INTEGERP (obj))
! return obj;
! else
! ch = XINT (obj);
!
! if (! EQ (obj, menu_prompt_more_char)
! && (!INTEGERP (menu_prompt_more_char)
! || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char))))))
! {
! if (!NILP (current_kboard->defining_kbd_macro))
! store_kbd_macro_char (obj);
! return obj;
! }
! /* Help char - go round again */
! }
}
\f
/* Reading key sequences. */
--- 7628,7736 ----
if (!STRINGP (name))
return Qnil;
/* Start prompting at start of first map. */
mapno = 0;
rest = maps[mapno];
! /* Loop over elements of map. */
! for (;;)
{
! Lisp_Object elt;
! /* If reached end of map, start at beginning of next map. */
! if (NILP (rest))
! {
! mapno++;
! if (mapno == nmaps)
! /* Done with all maps. */
! break;
! rest = maps[mapno];
! }
!
! /* Look at the next element of the map. */
! if (idx >= 0)
! elt = AREF (vector, idx);
! else
! elt = Fcar_safe (rest);
!
! if (idx < 0 && VECTORP (elt))
! {
! /* If we found a dense table in the keymap,
! advanced past it, but start scanning its contents. */
! rest = Fcdr_safe (rest);
! vector = elt;
! idx = 0;
! }
! else
! {
! /* An ordinary element. */
! Lisp_Object event, tem;
! if (idx < 0)
{
! event = Fcar_safe (elt); /* alist */
! elt = Fcdr_safe (elt);
}
else
{
! XSETINT (event, idx); /* vector */
}
+
+ /* Ignore the element if it has no prompt string. */
+ if (INTEGERP (event) && parse_menu_item (elt, 0, -1))
+ {
+ /* The list describing this entry. */
+ Lisp_Object entry = Qnil;
+ Lisp_Object prop_val;
+
+ prop_val = AREF (item_properties, ITEM_PROPERTY_TYPE);
+ if (EQ (prop_val, QCradio) || EQ (prop_val, QCtoggle))
+ /* This is a `toggle-able' menu-entry, make the
+ tail of the list describe it. */
+ entry
+ = Fcons (prop_val,
+ Fcons (AREF (item_properties,
+ ITEM_PROPERTY_SELECTED),
+ entry));
+
+ /* Equivalent keybinding. */
+ prop_val = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
+ if (!NILP (entry) || !NILP (prop_val))
+ entry = Fcons (prop_val, entry);
+
+ /* The string prompt. */
+ prop_val = AREF (item_properties, ITEM_PROPERTY_NAME);
+ entry = Fcons (prop_val, entry);
+
+ /* Finally, the car of the list is the event. */
+ entry = Fcons (event, entry);
+
+ /* Push this entry on the the list of entries. */
+ menu_list = Fcons (entry, menu_list);
+ }
+
+ /* Move past this element. */
+ if (idx >= 0 && idx + 1 >= XVECTOR (vector)->size)
+ /* Handle reaching end of dense table. */
+ idx = -1;
+ if (idx >= 0)
+ idx++;
+ else
+ rest = Fcdr_safe (rest);
}
+ }
! /* Put the entries in the proper order for the display function. */
! menu_list = Fnreverse (menu_list);
! /* The car of the entries list is the prompt for the whole menu. */
! menu_list = Fcons (name, menu_list);
! /* Display the menu, and prompt for a key. */
! if (NILP (Vkey_menu_prompt_function))
! return Qnil;
! else
! return call1 (Vkey_menu_prompt_function, menu_list);
}
\f
/* Reading key sequences. */
***************
*** 10955,10960 ****
--- 10846,10868 ----
doc: /* *How long to display an echo-area message when the minibuffer is active.
If the value is not a number, such messages don't time out. */);
Vminibuffer_message_timeout = make_number (2);
+
+ DEFVAR_LISP ("key-menu-prompt-function", &Vkey_menu_prompt_function,
+ doc: /* A function to display keyboard-menus, and read the user's response.
+ If nil, keyboard menus are disabled.
+
+ It is called with single argument, which is a list describing the keyboard menu
+ and should return the key the user types.
+
+ The argument is a list of the prompt and individual menu entries.
+ The format is as follows:
+
+ MENU : (PROMPT ENTRY...)
+ ENTRY : (EVENT PROMPT [BINDING [TOGGLE_TYPE TOGGLE_STATE]])
+
+ Note that there is a prompt for the whole menu, and one for each
+ individual entry. */);
+ Vkey_menu_prompt_function = Qnil;
}
void
diff -c lisp/subr.el.~1.305.~ lisp/subr.el
*** lisp/subr.el.~1.305.~ Sat Jun 1 09:02:46 2002
--- lisp/subr.el Wed Jun 5 02:05:17 2002
***************
*** 656,661 ****
--- 656,748 ----
(nth 3 position))
\f
+ ;;;; Keyboard menu prompting
+
+ (defvar key-menu-event-face 'underline
+ "Face used to highlight the events in the keyboard-menu prompt.
+ Used by `key-menu-prompt'.")
+ (defvar key-menu-initial-separator " "
+ "String used to separate a keyboard-menu prompt from the first key description.
+ Used by `key-menu-prompt'.")
+ (defvar key-menu-separator ", "
+ "String used to separate adjacent keyboard-menu key descriptions.
+ Used by `key-menu-prompt'.")
+ (defvar key-menu-long-prompt-line-prefix " "
+ "A prefix for entry lines when the menu prompt is very long.
+ Used by `key-menu-prompt'.")
+
+ (defun key-menu-prompt (menu)
+ "Display the keyboard-menu MENU, and read the user's response.
+ This function is appropiate for `key-menu-prompt-function', which see."
+ (let* ((prompt (concat (car menu) ":"))
+ (prompt-width (string-width prompt))
+ (cur-line "")
+ (prefix nil)
+ (sep "")
+ (string prompt)
+ (cur-line-width prompt-width)
+ (max-width (frame-width)))
+ (dolist (entry (cdr menu))
+ (let* ((entry-prompt
+ (if (eq (car entry) (aref (cadr entry) 0))
+ (format "%s%s"
+ (propertize (char-to-string (car entry))
+ 'face key-menu-event-face)
+ (substring (cadr entry) 1))
+ (format "%s = %s"
+ (propertize (char-to-string (car entry))
+ 'face key-menu-event-face)
+ (cadr entry))))
+ (entry-width
+ (string-width entry-prompt))
+ (appended-width
+ (+ cur-line-width (string-width sep) entry-width)))
+ ;; If this is the first line, first see if we'd be better off
+ ;; wrapping right after the prompt (because the prompt string is
+ ;; unusually long). Note that we only do so if there are (1)
+ ;; less than 4 entries already on the first line, and (2) the
+ ;; prompt is greater than 12 characters wide; these values are
+ ;; completely arbitrary.
+ (when (and (eq string prompt)
+ (>= appended-width max-width)
+ (> prompt-width (/ max-width 4)))
+ ;; Wrap after the prompt
+ (setq prefix key-menu-long-prompt-line-prefix
+ string (concat string "\n")
+ cur-line-width
+ (- cur-line-width (- prompt-width (string-width prefix)))
+ appended-width (+ cur-line-width entry-width)))
+ ;; See if we have to wrap before the current entry (note that
+ ;; this might happen even if we just wrapped after the prompt
+ ;; above).
+ (if (< appended-width max-width)
+ ;; It's OK to append the current entry, so do so
+ (setq cur-line (concat cur-line sep entry-prompt)
+ cur-line-width appended-width)
+ ;; We have to wrap the current line first, and then append it
+ (if prefix
+ (setq string (concat string prefix cur-line "\n"))
+ (setq string
+ (concat string key-menu-initial-separator cur-line "\n")
+ prefix
+ (make-string (+ prompt-width
+ (string-width key-menu-initial-separator))
+ ? )))
+ (setq cur-line entry-prompt
+ cur-line-width entry-width))
+ ;; Update sep to the normal inter-entry value
+ (setq sep key-menu-separator)))
+
+ ;; Finally, display the menu, and read the user's input
+ (unless prefix
+ (setq prefix key-menu-initial-separator))
+ (setq string (concat string prefix cur-line))
+ (read-char string)))
+
+ ;; `key-menu-prompt-function' is defined in src/keyboard.c
+ (setq key-menu-prompt-function 'key-menu-prompt)
+
+ \f
;;;; Obsolescent names for functions.
(defalias 'dot 'point)
[-- Attachment #3: Type: text/plain, Size: 142 bytes --]
--
"Most attacks seem to take place at night, during a rainstorm, uphill,
where four map sheets join." -- Anon. British Officer in WW I
next prev parent reply other threads:[~2002-06-04 17:27 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200205050534.g455YfF01634@aztec.santafe.edu>
2002-05-05 22:02 ` Assignment of misc packages for emacs Kim F. Storm
2002-05-06 23:07 ` Alex Schroeder
2002-05-08 1:16 ` Miles Bader
2002-05-08 1:47 ` Stefan Monnier
2002-05-09 2:45 ` Richard Stallman
2002-05-07 14:08 ` Kai Großjohann
2002-05-08 13:58 ` Richard Stallman
2002-05-08 1:31 ` Miles Bader
2002-05-08 6:23 ` Thien-Thi Nguyen
2002-05-14 19:41 ` Richard Stallman
2002-05-14 19:41 ` Richard Stallman
2002-05-14 23:44 ` Kim F. Storm
2002-05-15 1:08 ` Miles Bader
2002-05-15 21:37 ` Kim F. Storm
2002-05-16 1:19 ` Miles Bader
2002-05-17 19:29 ` Richard Stallman
2002-05-17 21:42 ` Kim F. Storm
2002-05-17 19:29 ` Richard Stallman
2002-05-17 21:31 ` Kim F. Storm
2002-05-16 7:22 ` Richard Stallman
2002-05-16 23:41 ` Kim F. Storm
2002-05-15 4:51 ` Eli Zaretskii
2002-05-15 8:41 ` Andreas Schwab
2002-05-15 10:20 ` Eli Zaretskii
2002-05-15 11:08 ` Andreas Schwab
2002-05-15 21:41 ` Kim F. Storm
2002-05-15 19:27 ` Stefan Monnier
2002-05-15 20:37 ` Andreas Schwab
2002-05-16 23:39 ` Kim F. Storm
2002-05-16 22:49 ` Stefan Monnier
2002-05-17 6:27 ` Eli Zaretskii
2002-05-17 7:10 ` Miles Bader
2002-05-17 9:21 ` Andreas Schwab
2002-05-17 11:13 ` Miles Bader
2002-05-17 9:40 ` Eli Zaretskii
2002-05-17 11:15 ` Miles Bader
2002-05-17 10:47 ` Kim F. Storm
2002-05-17 10:08 ` Stefan Monnier
2002-05-17 11:20 ` Miles Bader
2002-05-17 12:07 ` Kim F. Storm
2002-05-17 11:28 ` Miles Bader
2002-05-18 18:48 ` Richard Stallman
2002-05-18 21:39 ` Kim F. Storm
2002-05-19 19:40 ` Richard Stallman
2002-05-18 22:37 ` Stefan Monnier
2002-05-19 19:40 ` Richard Stallman
2002-05-16 23:07 ` Miles Bader
2002-05-18 18:48 ` Richard Stallman
2002-05-19 11:57 ` Miles Bader
2002-05-19 14:41 ` Stefan Monnier
2002-05-19 15:12 ` Miles Bader
2002-05-20 6:38 ` Miles Bader
2002-05-20 9:57 ` Alex Schroeder
2002-05-20 10:06 ` Kai Großjohann
2002-05-20 21:34 ` Richard Stallman
2002-05-21 9:54 ` Mario Lang
2002-05-21 10:23 ` Miles Bader
2002-05-22 22:29 ` Richard Stallman
2002-05-21 10:20 ` Miles Bader
2002-05-22 22:27 ` Richard Stallman
2002-05-23 7:08 ` Miles Bader
2002-05-23 16:49 ` Mario Lang
2002-05-23 22:21 ` Miles Bader
2002-06-04 17:27 ` Miles Bader [this message]
2002-06-05 14:42 ` Stefan Monnier
2002-06-06 1:07 ` Miles Bader
2002-06-06 1:37 ` Stefan Monnier
2002-06-06 1:46 ` Miles Bader
2002-06-06 7:57 ` Miles Bader
2002-06-07 0:45 ` Richard Stallman
2002-06-07 0:45 ` Richard Stallman
2002-06-05 23:10 ` Kim F. Storm
2002-06-06 1:09 ` Miles Bader
2002-06-06 1:24 ` Miles Bader
2002-06-07 0:45 ` Richard Stallman
2002-06-07 23:26 ` Kim F. Storm
2002-06-08 1:09 ` Miles Bader
2002-06-08 19:15 ` Richard Stallman
2002-06-06 12:04 ` Richard Stallman
2002-06-06 12:41 ` Miles Bader
2002-06-06 13:37 ` Stefan Monnier
2002-06-06 13:45 ` Miles Bader
2002-06-07 23:23 ` Richard Stallman
2002-06-08 4:06 ` Miles Bader
2002-06-09 15:19 ` Richard Stallman
2002-06-10 14:35 ` Stefan Monnier
2002-06-11 19:25 ` Richard Stallman
2002-07-07 22:46 ` What happened to the key-menu patch? Kim F. Storm
2002-07-09 7:00 ` Miles Bader
2002-07-09 13:58 ` Stefan Monnier
2002-07-10 2:43 ` Miles Bader
2002-07-10 18:12 ` Stefan Monnier
2002-07-10 10:43 ` Richard Stallman
2002-07-11 17:13 ` Stefan Monnier
2002-07-12 17:37 ` Richard Stallman
2002-07-12 18:07 ` Stefan Monnier
2002-07-13 14:20 ` Richard Stallman
2002-07-13 17:37 ` Stefan Monnier
2002-07-15 1:09 ` Richard Stallman
2002-07-09 18:51 ` Richard Stallman
2002-07-10 2:45 ` Miles Bader
2002-07-10 19:20 ` Richard Stallman
2002-05-20 14:48 ` Assignment of misc packages for emacs Richard Stallman
2002-05-18 18:48 ` Richard Stallman
2002-05-18 20:07 ` Kim F. Storm
2002-05-19 19:40 ` Richard Stallman
2002-05-16 7:21 ` Richard Stallman
2002-05-16 7:21 ` Richard Stallman
2002-05-15 7:44 ` D. Goel
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=87g0030xah.fsf@tc-1-100.kawasaki.gol.ne.jp \
--to=miles@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=monnier+gnu/emacs@RUM.cs.yale.edu \
--cc=storm@cua.dk \
/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).