From: "Herbert Euler" <herberteuler@hotmail.com>
To: herberteuler@hotmail.com, dak@gnu.org, rms@gnu.org
Cc: emacs-devel@gnu.org
Subject: Re: find-file-noselect needs save-match-data
Date: Fri, 29 Jun 2007 23:07:38 +0800 [thread overview]
Message-ID: <BAY143-F2461A37865E56F12C9AD5ADA080@phx.gbl> (raw)
In-Reply-To: <BAY143-F314D0C378EBC978B0A5367DA090@phx.gbl>
>>Just as a note aside: regular expressions like \(.\)\1 are possible,
>>so the match data _has_ to be stored somewhere, presumably. This
>>might impact the attractiveness of the "C variable" implementation.
>
>Fortunately we can solve this with providing another re_registers
>variable. I've almost finished it, but I got segmentation fault after
>adding a DEFVAR_LISP in syms_of_search. The segfault is triggered
>by GC. Any hint on how to solve it? Thanks.
The crash goes away after I re-checked out the source from CVS. Below
is the patches and the change-log entries I did for the two functions.
All patches are based on files in unicode 2 branch. Please check
them. If they are OK, I'll write document for them. Thanks.
Regards,
Guanpeng Xu
Index: lisp/subr.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/subr.el,v
retrieving revision 1.360.2.68
diff -c -F '^[_a-zA-Z0-9$]+ *(' -r1.360.2.68 subr.el
*** lisp/subr.el 16 Jun 2007 22:31:38 -0000 1.360.2.68
--- lisp/subr.el 29 Jun 2007 14:26:21 -0000
*************** t (mix it with ordinary output), or a fi
*** 2667,2672 ****
--- 2667,2684 ----
(looking-at (concat "\\(?:" regexp "\\)\\'")))))
(not (null pos))))
+ (defsubst looking-at-p (regexp)
+ "\
+ Same as `looking-at' except this function does not change the match data."
+ (let ((inhibit-changing-match-data t))
+ (looking-at regexp)))
+
+ (defsubst string-match-p (regexp string &optional start)
+ "\
+ Same as `string-match' except this function does not change the match
data."
+ (let ((inhibit-changing-match-data t))
+ (string-match regexp string start)))
+
(defun subregexp-context-p (regexp pos &optional start)
"Return non-nil if POS is in a normal subregexp context in REGEXP.
A subregexp context is one where a sub-regexp can appear.
Index: src/search.c
===================================================================
RCS file: /sources/emacs/emacs/src/search.c,v
retrieving revision 1.174.2.38
diff -c -F '^[_a-zA-Z0-9$]+ *(' -r1.174.2.38 search.c
*** src/search.c 11 Jun 2007 00:57:33 -0000 1.174.2.38
--- src/search.c 29 Jun 2007 14:26:27 -0000
***************
*** 60,73 ****
struct regexp_cache *searchbuf_head;
! /* Every call to re_match, etc., must pass &search_regs as the regs
! argument unless you can show it is unnecessary (i.e., if re_match
! is certainly going to be called again before region-around-match
! can be called).
Since the registers are now dynamically allocated, we need to make
sure not to refer to the Nth register before checking that it has
! been allocated by checking search_regs.num_regs.
The regex code keeps track of whether it has allocated the search
buffer using bits in the re_pattern_buffer. This means that whenever
--- 60,74 ----
struct regexp_cache *searchbuf_head;
! /* Every call to re_match, etc., must pass &search_regs_nochange or
! &search_regs as the regs argument unless you can show it is
! unnecessary (i.e., if re_match is certainly going to be called
! again before region-around-match can be called).
Since the registers are now dynamically allocated, we need to make
sure not to refer to the Nth register before checking that it has
! been allocated by checking search_regs_nochange.num_regs, or
! search_regs.num_regs.
The regex code keeps track of whether it has allocated the search
buffer using bits in the re_pattern_buffer. This means that whenever
***************
*** 76,82 ****
time you call a searching or matching function. Therefore, we need
to call re_set_registers after compiling a new pattern or after
setting the match registers, so that the regex functions will be
! able to free or re-allocate it properly. */
static struct re_registers search_regs;
/* The buffer in which the last search was performed, or
--- 77,90 ----
time you call a searching or matching function. Therefore, we need
to call re_set_registers after compiling a new pattern or after
setting the match registers, so that the regex functions will be
! able to free or re-allocate it properly.
!
! We now have two families of searching or matching functions.
! Functions in one family won't change the match data at Lisp level,
! while functions in the other family will change it. The variable
! search_regs_nochange is used for the former family, and the
! variable search_regs is used for the latter one. */
! static struct re_registers search_regs_nochange;
static struct re_registers search_regs;
/* The buffer in which the last search was performed, or
***************
*** 93,98 ****
--- 101,115 ----
Lisp_Object Vsearch_spaces_regexp;
+ /* If non-nil, the match data will not be changed during call to
+ searching or matching functions. This variable is for internal use
+ only. */
+ Lisp_Object Vinhibit_changing_match_data;
+
+ #define SEARCH_REGS_PTR (NILP (Vinhibit_changing_match_data) \
+ ? &search_regs \
+ : &search_regs_nochange)
+
static void set_search_regs ();
static void save_search_regs ();
static int simple_search ();
*************** looking_at_1 (string, posix)
*** 280,285 ****
--- 297,303 ----
int s1, s2;
register int i;
struct re_pattern_buffer *bufp;
+ struct re_registers *regs = SEARCH_REGS_PTR;
if (running_asynch_code)
save_search_regs ();
*************** looking_at_1 (string, posix)
*** 289,295 ****
= current_buffer->case_eqv_table;
CHECK_STRING (string);
! bufp = compile_pattern (string, &search_regs,
(!NILP (current_buffer->case_fold_search)
? current_buffer->case_canon_table : Qnil),
posix,
--- 307,313 ----
= current_buffer->case_eqv_table;
CHECK_STRING (string);
! bufp = compile_pattern (string, regs,
(!NILP (current_buffer->case_fold_search)
? current_buffer->case_canon_table : Qnil),
posix,
*************** looking_at_1 (string, posix)
*** 320,326 ****
re_match_object = Qnil;
i = re_match_2 (bufp, (char *) p1, s1, (char *) p2, s2,
! PT_BYTE - BEGV_BYTE, &search_regs,
ZV_BYTE - BEGV_BYTE);
immediate_quit = 0;
--- 338,344 ----
re_match_object = Qnil;
i = re_match_2 (bufp, (char *) p1, s1, (char *) p2, s2,
! PT_BYTE - BEGV_BYTE, regs,
ZV_BYTE - BEGV_BYTE);
immediate_quit = 0;
*************** looking_at_1 (string, posix)
*** 329,341 ****
val = (0 <= i ? Qt : Qnil);
if (i >= 0)
! for (i = 0; i < search_regs.num_regs; i++)
! if (search_regs.start[i] >= 0)
{
! search_regs.start[i]
! = BYTE_TO_CHAR (search_regs.start[i] + BEGV_BYTE);
! search_regs.end[i]
! = BYTE_TO_CHAR (search_regs.end[i] + BEGV_BYTE);
}
XSETBUFFER (last_thing_searched, current_buffer);
return val;
--- 347,357 ----
val = (0 <= i ? Qt : Qnil);
if (i >= 0)
! for (i = 0; i < regs->num_regs; i++)
! if (regs->start[i] >= 0)
{
! regs->start[i] = BYTE_TO_CHAR (regs->start[i] + BEGV_BYTE);
! regs->end[i] = BYTE_TO_CHAR (regs->end[i] + BEGV_BYTE);
}
XSETBUFFER (last_thing_searched, current_buffer);
return val;
*************** string_match_1 (regexp, string, start, p
*** 373,378 ****
--- 389,395 ----
struct re_pattern_buffer *bufp;
int pos, pos_byte;
int i;
+ struct re_registers *regs = SEARCH_REGS_PTR;
if (running_asynch_code)
save_search_regs ();
*************** string_match_1 (regexp, string, start, p
*** 399,405 ****
XCHAR_TABLE (current_buffer->case_canon_table)->extras[2]
= current_buffer->case_eqv_table;
! bufp = compile_pattern (regexp, &search_regs,
(!NILP (current_buffer->case_fold_search)
? current_buffer->case_canon_table : Qnil),
posix,
--- 416,422 ----
XCHAR_TABLE (current_buffer->case_canon_table)->extras[2]
= current_buffer->case_eqv_table;
! bufp = compile_pattern (regexp, regs,
(!NILP (current_buffer->case_fold_search)
? current_buffer->case_canon_table : Qnil),
posix,
*************** string_match_1 (regexp, string, start, p
*** 410,429 ****
val = re_search (bufp, (char *) SDATA (string),
SBYTES (string), pos_byte,
SBYTES (string) - pos_byte,
! &search_regs);
immediate_quit = 0;
last_thing_searched = Qt;
if (val == -2)
matcher_overflow ();
if (val < 0) return Qnil;
! for (i = 0; i < search_regs.num_regs; i++)
! if (search_regs.start[i] >= 0)
{
! search_regs.start[i]
! = string_byte_to_char (string, search_regs.start[i]);
! search_regs.end[i]
! = string_byte_to_char (string, search_regs.end[i]);
}
return make_number (string_byte_to_char (string, val));
--- 427,444 ----
val = re_search (bufp, (char *) SDATA (string),
SBYTES (string), pos_byte,
SBYTES (string) - pos_byte,
! regs);
immediate_quit = 0;
last_thing_searched = Qt;
if (val == -2)
matcher_overflow ();
if (val < 0) return Qnil;
! for (i = 0; i < regs->num_regs; i++)
! if (regs->start[i] >= 0)
{
! regs->start[i] = string_byte_to_char (string, regs->start[i]);
! regs->end[i] = string_byte_to_char (string, regs->end[i]);
}
return make_number (string_byte_to_char (string, val));
*************** search_buffer (string, pos, pos_byte, li
*** 1059,1064 ****
--- 1074,1080 ----
int len = SCHARS (string);
int len_byte = SBYTES (string);
register int i;
+ struct re_registers *regs = SEARCH_REGS_PTR;
if (running_asynch_code)
save_search_regs ();
*************** search_buffer (string, pos, pos_byte, li
*** 1077,1083 ****
int s1, s2;
struct re_pattern_buffer *bufp;
! bufp = compile_pattern (string, &search_regs, trt, posix,
!NILP (current_buffer->enable_multibyte_characters));
immediate_quit = 1; /* Quit immediately if user types ^G,
--- 1093,1099 ----
int s1, s2;
struct re_pattern_buffer *bufp;
! bufp = compile_pattern (string, regs, trt, posix,
!NILP (current_buffer->enable_multibyte_characters));
immediate_quit = 1; /* Quit immediately if user types ^G,
*************** search_buffer (string, pos, pos_byte, li
*** 1110,1116 ****
int val;
val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2,
pos_byte - BEGV_BYTE, lim_byte - pos_byte,
! &search_regs,
/* Don't allow match past current point */
pos_byte - BEGV_BYTE);
if (val == -2)
--- 1126,1132 ----
int val;
val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2,
pos_byte - BEGV_BYTE, lim_byte - pos_byte,
! regs,
/* Don't allow match past current point */
pos_byte - BEGV_BYTE);
if (val == -2)
*************** search_buffer (string, pos, pos_byte, li
*** 1119,1136 ****
}
if (val >= 0)
{
! pos_byte = search_regs.start[0] + BEGV_BYTE;
! for (i = 0; i < search_regs.num_regs; i++)
! if (search_regs.start[i] >= 0)
{
! search_regs.start[i]
! = BYTE_TO_CHAR (search_regs.start[i] + BEGV_BYTE);
! search_regs.end[i]
! = BYTE_TO_CHAR (search_regs.end[i] + BEGV_BYTE);
}
XSETBUFFER (last_thing_searched, current_buffer);
/* Set pos to the new position. */
! pos = search_regs.start[0];
}
else
{
--- 1135,1150 ----
}
if (val >= 0)
{
! pos_byte = regs->start[0] + BEGV_BYTE;
! for (i = 0; i < regs->num_regs; i++)
! if (regs->start[i] >= 0)
{
! regs->start[i] = BYTE_TO_CHAR (regs->start[i] + BEGV_BYTE);
! regs->end[i] = BYTE_TO_CHAR (regs->end[i] + BEGV_BYTE);
}
XSETBUFFER (last_thing_searched, current_buffer);
/* Set pos to the new position. */
! pos = regs->start[0];
}
else
{
*************** search_buffer (string, pos, pos_byte, li
*** 1144,1150 ****
int val;
val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2,
pos_byte - BEGV_BYTE, lim_byte - pos_byte,
! &search_regs,
lim_byte - BEGV_BYTE);
if (val == -2)
{
--- 1158,1164 ----
int val;
val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2,
pos_byte - BEGV_BYTE, lim_byte - pos_byte,
! regs,
lim_byte - BEGV_BYTE);
if (val == -2)
{
*************** search_buffer (string, pos, pos_byte, li
*** 1152,1168 ****
}
if (val >= 0)
{
! pos_byte = search_regs.end[0] + BEGV_BYTE;
! for (i = 0; i < search_regs.num_regs; i++)
! if (search_regs.start[i] >= 0)
{
! search_regs.start[i]
! = BYTE_TO_CHAR (search_regs.start[i] + BEGV_BYTE);
! search_regs.end[i]
! = BYTE_TO_CHAR (search_regs.end[i] + BEGV_BYTE);
}
XSETBUFFER (last_thing_searched, current_buffer);
! pos = search_regs.end[0];
}
else
{
--- 1166,1180 ----
}
if (val >= 0)
{
! pos_byte = regs->end[0] + BEGV_BYTE;
! for (i = 0; i < regs->num_regs; i++)
! if (regs->start[i] >= 0)
{
! regs->start[i] = BYTE_TO_CHAR (regs->start[i] + BEGV_BYTE);
! regs->end[i] = BYTE_TO_CHAR (regs->end[i] + BEGV_BYTE);
}
XSETBUFFER (last_thing_searched, current_buffer);
! pos = regs->end[0];
}
else
{
*************** boyer_moore (n, base_pat, len, len_byte,
*** 1616,1621 ****
--- 1628,1634 ----
register int i, j;
unsigned char *pat, *pat_end;
int multibyte = ! NILP (current_buffer->enable_multibyte_characters);
+ struct re_registers *regs = SEARCH_REGS_PTR;
unsigned char simple_translate[0400];
/* These are set to the preceding bytes of a byte to be translated
*************** boyer_moore (n, base_pat, len, len_byte,
*** 1919,1925 ****
cursor += dirlen; /* to resume search */
else
return ((direction > 0)
! ? search_regs.end[0] : search_regs.start[0]);
}
else
cursor += stride_for_teases; /* <sigh> we lose - */
--- 1932,1938 ----
cursor += dirlen; /* to resume search */
else
return ((direction > 0)
! ? regs->end[0] : regs->start[0]);
}
else
cursor += stride_for_teases; /* <sigh> we lose - */
*************** boyer_moore (n, base_pat, len, len_byte,
*** 1995,2001 ****
pos_byte += dirlen; /* to resume search */
else
return ((direction > 0)
! ? search_regs.end[0] : search_regs.start[0]);
}
else
pos_byte += stride_for_teases;
--- 2008,2014 ----
pos_byte += dirlen; /* to resume search */
else
return ((direction > 0)
! ? regs->end[0] : regs->start[0]);
}
else
pos_byte += stride_for_teases;
*************** set_search_regs (beg_byte, nbytes)
*** 2017,2041 ****
int beg_byte, nbytes;
{
int i;
/* Make sure we have registers in which to store
the match position. */
! if (search_regs.num_regs == 0)
{
! search_regs.start = (regoff_t *) xmalloc (2 * sizeof (regoff_t));
! search_regs.end = (regoff_t *) xmalloc (2 * sizeof (regoff_t));
! search_regs.num_regs = 2;
}
/* Clear out the other registers. */
! for (i = 1; i < search_regs.num_regs; i++)
{
! search_regs.start[i] = -1;
! search_regs.end[i] = -1;
}
! search_regs.start[0] = BYTE_TO_CHAR (beg_byte);
! search_regs.end[0] = BYTE_TO_CHAR (beg_byte + nbytes);
XSETBUFFER (last_thing_searched, current_buffer);
}
--- 2030,2055 ----
int beg_byte, nbytes;
{
int i;
+ struct re_registers *regs = SEARCH_REGS_PTR;
/* Make sure we have registers in which to store
the match position. */
! if (regs->num_regs == 0)
{
! regs->start = (regoff_t *) xmalloc (2 * sizeof (regoff_t));
! regs->end = (regoff_t *) xmalloc (2 * sizeof (regoff_t));
! regs->num_regs = 2;
}
/* Clear out the other registers. */
! for (i = 1; i < regs->num_regs; i++)
{
! regs->start[i] = -1;
! regs->end[i] = -1;
}
! regs->start[0] = BYTE_TO_CHAR (beg_byte);
! regs->end[0] = BYTE_TO_CHAR (beg_byte + nbytes);
XSETBUFFER (last_thing_searched, current_buffer);
}
*************** DEFUN ("set-match-data", Fset_match_data
*** 2998,3004 ****
}
/* If non-zero the match data have been saved in saved_search_regs
! during the execution of a sentinel or filter. */
static int search_regs_saved;
static struct re_registers saved_search_regs;
static Lisp_Object saved_last_thing_searched;
--- 3012,3022 ----
}
/* If non-zero the match data have been saved in saved_search_regs
! during the execution of a sentinel or filter. The value of
! saved_search_regs is copied from and recovered to search_regs
! rather than search_regs_nochange, since the value of
! search_regs_nochange is intended to not be used and to be
! discarded. */
static int search_regs_saved;
static struct re_registers saved_search_regs;
static Lisp_Object saved_last_thing_searched;
*************** syms_of_search ()
*** 3145,3150 ****
--- 3163,3175 ----
A value of nil (which is the normal value) means treat spaces literally.
*/);
Vsearch_spaces_regexp = Qnil;
+ DEFVAR_LISP ("inhibit-changing-match-data",
&Vinhibit_changing_match_data,
+ doc: /* Internal use only.
+ If non-nil, the match data will not be changed during call to searching or
+ matching functions, such as `looking-at', `string-match',
`re-search-forward'
+ etc. */);
+ Vinhibit_changing_match_data = Qnil;
+
defsubr (&Slooking_at);
defsubr (&Sposix_looking_at);
defsubr (&Sstring_match);
2007-06-30 Guanpeng Xu <herberteuler@hotmail.com>
* subr.el (looking-at-p, string-match-p): New functions.
2007-06-30 Guanpeng Xu <herberteuler@hotmail.com>
* search.c (search_regs_nochange, Vinhibit_changing_match_data):
New variables.
(SEARCH_REGS_PTR): New macro.
(looking_at_1): Don't chang match data at Lisp level if
Vinhibit_changing_match_data is not nil.
(string_match_1, search_buffer, boyer_moore, set_search_regs):
Likewise.
(syms_of_search): Add entry of Vinhibit_changing_match_data and
set it to nil.
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
next prev parent reply other threads:[~2007-06-29 15:07 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-04 15:17 find-file-noselect needs save-match-data Herbert Euler
2007-06-04 16:05 ` martin rudalics
2007-06-05 3:10 ` Herbert Euler
2007-06-05 5:52 ` martin rudalics
2007-06-05 22:32 ` Richard Stallman
2007-06-06 1:13 ` Stefan Monnier
2007-06-06 1:44 ` Herbert Euler
2007-06-06 6:58 ` martin rudalics
2007-06-06 7:25 ` David Kastrup
2007-06-06 22:09 ` Richard Stallman
2007-06-06 12:14 ` Stefan Monnier
2007-06-06 22:09 ` Richard Stallman
2007-06-06 6:57 ` martin rudalics
2007-06-06 12:17 ` Stefan Monnier
2007-06-06 12:33 ` Lennart Borgman (gmail)
2007-06-06 12:49 ` martin rudalics
2007-06-06 22:10 ` Richard Stallman
2007-06-06 22:29 ` Stefan Monnier
2007-06-08 7:11 ` Richard Stallman
2007-06-08 8:31 ` Kim F. Storm
2007-06-08 9:42 ` martin rudalics
2007-06-08 10:31 ` Kim F. Storm
2007-06-09 9:45 ` Richard Stallman
2007-06-10 0:05 ` Herbert Euler
2007-06-10 0:11 ` Herbert Euler
2007-06-09 9:46 ` Richard Stallman
2007-06-09 21:32 ` Juri Linkov
2007-06-09 21:59 ` David House
2007-06-09 22:43 ` Juri Linkov
2007-06-09 22:53 ` Jason Rumney
2007-06-09 23:59 ` Miles Bader
2007-06-10 0:02 ` Drew Adams
2007-06-10 13:19 ` Richard Stallman
2007-06-12 3:05 ` Bob Rogers
2007-06-12 4:06 ` Miles Bader
2007-06-12 16:45 ` Juri Linkov
2007-06-12 17:46 ` Andreas Schwab
2007-06-12 21:55 ` David Kastrup
2007-06-12 22:10 ` Miles Bader
2007-06-12 22:37 ` David Kastrup
2007-06-13 16:22 ` Richard Stallman
2007-06-13 17:31 ` Stefan Monnier
2007-06-13 18:33 ` David Kastrup
2007-06-13 19:55 ` Stefan Monnier
2007-06-14 6:37 ` Herbert Euler
2007-06-15 8:48 ` Richard Stallman
2007-06-15 14:22 ` Stefan Monnier
2007-06-15 16:03 ` Herbert Euler
2007-06-14 6:57 ` martin rudalics
2007-06-14 14:36 ` Stefan Monnier
2007-06-14 16:05 ` Herbert Euler
2007-06-14 16:22 ` Stefan Monnier
2007-06-15 1:59 ` Herbert Euler
2007-06-15 8:49 ` Richard Stallman
2007-06-15 8:49 ` Richard Stallman
2007-06-14 6:57 ` martin rudalics
2007-06-15 8:48 ` Richard Stallman
2007-06-15 14:23 ` Stefan Monnier
2007-06-15 22:45 ` Richard Stallman
2007-06-17 19:54 ` Juri Linkov
2007-06-17 20:27 ` Lennart Borgman (gmail)
2007-06-14 16:19 ` Richard Stallman
2007-06-14 17:18 ` David Kastrup
2007-06-15 19:21 ` Richard Stallman
2007-06-15 19:52 ` Stefan Monnier
2007-06-13 23:39 ` Miles Bader
2007-06-14 0:52 ` Stefan Monnier
2007-06-14 6:58 ` martin rudalics
2007-06-14 16:20 ` Richard Stallman
2007-06-14 18:50 ` Stefan Monnier
2007-06-15 6:31 ` martin rudalics
2007-06-15 14:20 ` Stefan Monnier
2007-06-15 15:55 ` Herbert Euler
2007-06-15 19:22 ` Richard Stallman
2007-06-16 10:01 ` martin rudalics
2007-06-16 22:35 ` Richard Stallman
2007-06-15 19:21 ` Richard Stallman
2007-06-15 19:55 ` Stefan Monnier
2007-06-15 20:03 ` David Kastrup
2007-06-16 18:51 ` Richard Stallman
2007-06-16 19:10 ` David Kastrup
2007-06-17 21:49 ` Richard Stallman
2007-06-18 5:16 ` David Kastrup
2007-06-18 21:30 ` Richard Stallman
2007-06-18 21:42 ` David Kastrup
2007-06-19 22:26 ` Richard Stallman
2007-06-19 22:42 ` David Kastrup
2007-06-25 13:19 ` Richard Stallman
2007-06-16 3:50 ` Herbert Euler
2007-06-17 12:28 ` Stefan Monnier
2007-06-16 18:51 ` Richard Stallman
2007-06-16 21:39 ` Miles Bader
2007-06-17 8:55 ` Richard Stallman
2007-06-17 3:19 ` Herbert Euler
2007-06-17 3:26 ` Herbert Euler
2007-06-17 21:49 ` Richard Stallman
2007-06-17 12:50 ` Stefan Monnier
2007-06-18 7:25 ` Richard Stallman
2007-06-20 8:07 ` Herbert Euler
2007-06-20 14:12 ` Juri Linkov
2007-06-20 14:44 ` Herbert Euler
2007-06-21 1:07 ` Richard Stallman
2007-06-21 1:29 ` Herbert Euler
2007-06-21 6:31 ` David Kastrup
2007-06-28 14:06 ` Herbert Euler
2007-06-29 15:07 ` Herbert Euler [this message]
2007-07-06 17:05 ` byte-compiling an elisp-file fails in Emacs 22.1 (reproducable) klaus.berndl
2007-07-06 22:20 ` Jason Rumney
2007-07-07 13:06 ` Richard Stallman
2007-07-08 6:30 ` AW: " klaus.berndl
2007-06-22 1:51 ` find-file-noselect needs save-match-data Richard Stallman
2007-06-20 17:36 ` Richard Stallman
2007-06-13 16:21 ` Richard Stallman
2007-06-05 5:18 ` Richard Stallman
2007-06-06 1:10 ` Stefan Monnier
2007-06-14 16:19 ` Stefan Monnier
-- strict thread matches above, loose matches on Subject: below --
2007-06-06 0:25 Herbert Euler
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BAY143-F2461A37865E56F12C9AD5ADA080@phx.gbl \
--to=herberteuler@hotmail.com \
--cc=dak@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=rms@gnu.org \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.