annotate src/abbrev.c @ 5182:2e528066e2fc

Move #'sort*, #'fill, #'merge to C from cl-seq.el. lisp/ChangeLog addition: 2010-04-01 Aidan Kehoe <kehoea@parhasard.net> * cl-seq.el (fill, sort*, merge): Move these functions to fns.c. (stable-sort): Make this docstring reflect the argument names used in the #'sort* docstring. * cl-macs.el (stable-sort): Make #'stable-sort exactly equivalent to #'sort* in compiled code. * bytecomp.el (byte-compile-maybe-add-*): New macro, for functions like #'sort and #'mapcar that, to be strictly compatible, should only take two args, but in our implementation can take more, because they're aliases of #'sort* and #'mapcar*. (byte-compile-mapcar, byte-compile-sort, byte-compile-fillarray): Use this new macro. (map-into): Add a byte-compile method for #'map-into in passing. * apropos.el (apropos-print): Use #'sort* with a :key argument, now it's in C. * compat.el (extent-at): Ditto. * register.el (list-registers): Ditto. * package-ui.el (pui-list-packages): Ditto. * help.el (sorted-key-descriptions): Ditto. src/ChangeLog addition: 2010-03-31 Aidan Kehoe <kehoea@parhasard.net> * fns.c (STRING_DATA_TO_OBJECT_ARRAY) (BIT_VECTOR_TO_OBJECT_ARRAY, c_merge_predicate_key) (c_merge_predicate_nokey, list_merge, array_merge) (list_array_merge_into_list, list_list_merge_into_array) (list_array_merge_into_array, CHECK_KEY_ARGUMENT, Fmerge) (list_sort, array_sort, FsortX): Move #'sort*, #'fill, #'merge from cl-seq.el to C, extending the implementations of Fsort, Ffillarray, and merge() to do so. * keymap.c (keymap_submaps, map_keymap_sort_predicate) (describe_map_sort_predicate): Change the calling semantics of the C sort predicates to return a non-nil Lisp object if the first argument is less than the second, rather than C integers. * fontcolor-msw.c (sort_font_list_function): * fileio.c (build_annotations): * dired.c (Fdirectory_files): * abbrev.c (Finsert_abbrev_table_description): Call list_sort instead of Fsort, list_merge instead of merge() in these functions. man/ChangeLog addition: 2010-04-01 Aidan Kehoe <kehoea@parhasard.net> * lispref/lists.texi (Rearrangement): Update the documentation of #'sort here, now that it accepts any type of sequence and the KEY keyword argument. (Though this is probably now the wrong place for this function, given that.)
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 01 Apr 2010 20:22:50 +0100
parents e813cf16c015
children c096d8051f89 308d34e9f07d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Primitives for word-abbrev mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1986, 1992, 1993 Free Software Foundation, Inc.
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
3 Copyright (C) 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: FSF 19.30. Note that there are many more functions in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 FSF's abbrev.c. These have been moved into Lisp in XEmacs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* Authorship:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 FSF: Original version; a long time ago.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 JWZ or Mly: Mostly moved into Lisp; maybe 1992.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 Ben Wing: Some changes for Mule for 19.12.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 Hrvoje Niksic: Largely rewritten in June 1997.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 /* This file has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "commands.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "insdel.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "syntax.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 /* An abbrev table is an obarray.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Each defined abbrev is represented by a symbol in that obarray
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 whose print name is the abbreviation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 The symbol's value is a string which is the expansion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 If its function definition is non-nil, it is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 after the expansion is done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 The plist slot of the abbrev symbol is its usage count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* The table of global abbrevs. These are in effect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 in any buffer in which abbrev mode is turned on. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Lisp_Object Vglobal_abbrev_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 int abbrev_all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 /* Non-nil => use this location as the start of abbrev to expand
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 (rather than taking the word before point as the abbrev) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 Lisp_Object Vabbrev_start_location;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 /* Buffer that Vabbrev_start_location applies to */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 Lisp_Object Vabbrev_start_location_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 /* The symbol representing the abbrev most recently expanded */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 Lisp_Object Vlast_abbrev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 /* A string for the actual text of the abbrev most recently expanded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 This has more info than Vlast_abbrev since case is significant. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 Lisp_Object Vlast_abbrev_text;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 /* Character address of start of last abbrev expanded */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 440
diff changeset
73 Fixnum last_abbrev_location;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 /* Hook to run before expanding any abbrev. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
78 Lisp_Object Qsystem_type, Qcount;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
80 struct abbrev_match_mapper_closure
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
81 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 struct buffer *buf;
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
83 Lisp_Object chartab;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 793
diff changeset
84 Charbpos point;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 793
diff changeset
85 Charcount maxlen;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
86 Lisp_Symbol *found;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 /* For use by abbrev_match(): Match SYMBOL's name against buffer text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 before point, case-insensitively. When found, return non-zero, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 that map_obarray terminates mapping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 abbrev_match_mapper (Lisp_Object symbol, void *arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 struct abbrev_match_mapper_closure *closure =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (struct abbrev_match_mapper_closure *)arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 Charcount abbrev_length;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
98 Lisp_Symbol *sym = XSYMBOL (symbol);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
99 Lisp_Object abbrev;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 /* symbol_value should be OK here, because abbrevs are not expected
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 to contain any SYMBOL_MAGIC stuff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 if (UNBOUNDP (symbol_value (sym)) || NILP (symbol_value (sym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 /* The symbol value of nil means that abbrev got undefined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 abbrev = symbol_name (sym);
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
109 abbrev_length = string_char_length (abbrev);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 if (abbrev_length > closure->maxlen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 /* This abbrev is too large -- it wouldn't fit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 /* If `bar' is an abbrev, and a user presses `fubar<SPC>', we don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 normally want to expand it. OTOH, if the abbrev begins with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 non-word syntax (e.g. `#if'), it is OK to abbreviate it anywhere. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 if (abbrev_length < closure->maxlen && abbrev_length > 0
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
119 && (WORD_SYNTAX_P (closure->chartab, string_ichar (abbrev, 0)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 && (WORD_SYNTAX_P (closure->chartab,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 BUF_FETCH_CHAR (closure->buf,
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
122 closure->point -
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
123 (abbrev_length + 1)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 /* Match abbreviation string against buffer text. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
129 Ibyte *ptr = XSTRING_DATA (abbrev);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 Charcount idx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 for (idx = 0; idx < abbrev_length; idx++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 {
4906
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
134 if (CANONCASE (closure->buf,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 BUF_FETCH_CHAR (closure->buf,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 closure->point - abbrev_length + idx))
4906
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
137 != CANONCASE (closure->buf, itext_ichar (ptr)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
141 INC_IBYTEPTR (ptr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 if (idx == abbrev_length)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 /* This is the one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 closure->found = sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 /* Match the buffer text against names of symbols in obarray. Returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 the matching symbol, or 0 if not found. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
155 static Lisp_Symbol *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 abbrev_match (struct buffer *buf, Lisp_Object obarray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 struct abbrev_match_mapper_closure closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 /* Precalculate some stuff, so mapper function needn't to it in each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 iteration. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 closure.buf = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 closure.point = BUF_PT (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 closure.maxlen = closure.point - BUF_BEGV (buf);
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
165 closure.chartab = buf->mirror_syntax_table;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 closure.found = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 map_obarray (obarray, abbrev_match_mapper, &closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 return closure.found;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 /* Take the word before point (or Vabbrev_start_location, if non-nil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 and look it up in OBARRAY, and return the symbol (or zero). This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 used to be the default method of searching, with the obvious
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 limitation that the abbrevs may consist only of word characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 It is an order of magnitude faster than the proper abbrev_match(),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 but then again, vi is an order of magnitude faster than Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 This speed difference should be unnoticeable, though. I have tested
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 the degenerated cases of thousands of abbrevs being defined, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 abbrev_match() was still fast enough for normal operation. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
183 static Lisp_Symbol *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 abbrev_oblookup (struct buffer *buf, Lisp_Object obarray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 563
diff changeset
186 Charbpos wordstart, wordend;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
187 Ibyte *word, *p;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 793
diff changeset
188 Charbpos idx;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 Lisp_Object lookup;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 CHECK_VECTOR (obarray);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 if (!NILP (Vabbrev_start_location))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 wordstart = get_buffer_pos_char (buf, Vabbrev_start_location,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 GB_COERCE_RANGE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 Vabbrev_start_location = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 /* Previously, abbrev-prefix-mark crockishly inserted a dash to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 indicate the abbrev start point. It now uses an extent with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 a begin glyph so there's no dash to remove. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 if (wordstart != BUF_ZV (buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 && BUF_FETCH_CHAR (buf, wordstart) == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 buffer_delete_range (buf, wordstart, wordstart + 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 wordend = BUF_PT (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 563
diff changeset
212 Charbpos point = BUF_PT (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 wordstart = scan_words (buf, point, -1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 if (!wordstart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 wordend = scan_words (buf, wordstart, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 if (!wordend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 if (wordend > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 wordend = BUF_ZV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 if (wordend > point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 wordend = point;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 /* Unlike the original function, we allow expansion only after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 the abbrev, not preceded by a number of spaces. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 because of consistency with abbrev_match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 if (wordend < point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 if (wordend <= wordstart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 867
diff changeset
235 p = word = alloca_ibytes (MAX_ICHAR_LEN * (wordend - wordstart));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 for (idx = wordstart; idx < wordend; idx++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
238 Ichar c = BUF_FETCH_CHAR (buf, idx);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 if (UPPERCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 c = DOWNCASE (buf, c);
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
241 p += set_itext_ichar (p, c);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 lookup = oblookup (obarray, word, p - word);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 if (SYMBOLP (lookup) && !NILP (symbol_value (XSYMBOL (lookup))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 return XSYMBOL (lookup);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 /* Return non-zero if OBARRAY contains an interned symbol ` '. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 obarray_has_blank_p (Lisp_Object obarray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
254 return !ZEROP (oblookup (obarray, (Ibyte *)" ", 1));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 /* Analyze case in the buffer substring, and report it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 static void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 563
diff changeset
259 abbrev_count_case (struct buffer *buf, Charbpos pos, Charcount length,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 int *lccount, int *uccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 *lccount = *uccount = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 while (length--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
265 Ichar c = BUF_FETCH_CHAR (buf, pos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 if (UPPERCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 ++*uccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 else if (LOWERCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 ++*lccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 ++pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 DEFUN ("expand-abbrev", Fexpand_abbrev, 0, 0, "", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 Expand the abbrev before point, if any.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 Effective when explicitly called even when `abbrev-mode' is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 Returns the abbrev symbol, if expansion took place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 If no abbrev matched, but `pre-abbrev-expand-hook' changed the buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 returns t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 struct buffer *buf = current_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 int oldmodiff = BUF_MODIFF (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 Lisp_Object pre_modiff_p;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 563
diff changeset
287 Charbpos point; /* position of point */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 563
diff changeset
288 Charbpos abbrev_start; /* position of abbreviation beginning */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
290 Lisp_Symbol *(*fun) (struct buffer *, Lisp_Object);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
292 Lisp_Symbol *abbrev_symbol;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 Lisp_Object expansion, count, hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 Charcount abbrev_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 int lccount, uccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 run_hook (Qpre_abbrev_expand_hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 /* If the hook changes the buffer, treat that as having "done an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 expansion". */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 pre_modiff_p = (BUF_MODIFF (buf) != oldmodiff ? Qt : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 abbrev_symbol = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 if (!BUFFERP (Vabbrev_start_location_buffer) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 XBUFFER (Vabbrev_start_location_buffer) != buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 Vabbrev_start_location = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 /* We use the more general abbrev_match() if the obarray blank flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 is not set, and Vabbrev_start_location is nil. Otherwise, use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 abbrev_oblookup(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 #define MATCHFUN(tbl) ((obarray_has_blank_p (tbl) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 && NILP (Vabbrev_start_location)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 ? abbrev_match : abbrev_oblookup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 if (!NILP (buf->abbrev_table))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 fun = MATCHFUN (buf->abbrev_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 abbrev_symbol = fun (buf, buf->abbrev_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 if (!abbrev_symbol && !NILP (Vglobal_abbrev_table))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 fun = MATCHFUN (Vglobal_abbrev_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 abbrev_symbol = fun (buf, Vglobal_abbrev_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 if (!abbrev_symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 return pre_modiff_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 /* NOTE: we hope that `pre-abbrev-expand-hook' didn't do something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 nasty, such as changed the buffer. Here we protect against the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 buffer getting killed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 if (! BUFFER_LIVE_P (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 point = BUF_PT (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 /* OK, we're out of the must-be-fast part. An abbreviation matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 Now find the parameters, insert the expansion, and make it all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 look pretty. */
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
335 abbrev_length = string_char_length (symbol_name (abbrev_symbol));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 abbrev_start = point - abbrev_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 expansion = symbol_value (abbrev_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 CHECK_STRING (expansion);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 count = symbol_plist (abbrev_symbol); /* Gag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 if (NILP (count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 count = Qzero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 CHECK_NATNUM (count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 symbol_plist (abbrev_symbol) = make_int (1 + XINT (count));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 /* Count the case in the original text. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 abbrev_count_case (buf, abbrev_start, abbrev_length, &lccount, &uccount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 /* Remember the last abbrev text, location, etc. */
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
352 Vlast_abbrev = wrap_symbol (abbrev_symbol);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 Vlast_abbrev_text =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 make_string_from_buffer (buf, abbrev_start, abbrev_length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 last_abbrev_location = abbrev_start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 /* Add an undo boundary, in case we are doing this for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 self-inserting command which has avoided making one so far. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 if (INTERACTIVE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 Fundo_boundary ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 /* Remove the abbrev */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 buffer_delete_range (buf, abbrev_start, point, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 /* And insert the expansion. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 buffer_insert_lisp_string (buf, expansion);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 point = BUF_PT (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 /* Now fiddle with the case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 if (uccount && !lccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 /* Abbrev was all caps */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 if (!abbrev_all_caps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 && scan_words (buf, point, -1) > scan_words (buf, abbrev_start, 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 Fupcase_initials_region (make_int (abbrev_start), make_int (point),
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
376 wrap_buffer (buf));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 /* If expansion is one word, or if user says so, upcase it all. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 Fupcase_region (make_int (abbrev_start), make_int (point),
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
382 wrap_buffer (buf));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 else if (uccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 /* Abbrev included some caps. Cap first initial of expansion */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 563
diff changeset
388 Charbpos pos = abbrev_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 /* Find the initial. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 while (pos < point
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
391 && !WORD_SYNTAX_P (buf->mirror_syntax_table,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 BUF_FETCH_CHAR (buf, pos)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 pos++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 /* Change just that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 Fupcase_initials_region (make_int (pos), make_int (pos + 1),
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
396 wrap_buffer (buf));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 hook = symbol_function (abbrev_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 if (!NILP (hook) && !UNBOUNDP (hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 call0 (hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 return Vlast_abbrev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
406 static void
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
407 write_abbrev (Lisp_Object sym, Lisp_Object stream)
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
408 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
409 Lisp_Object name, count, system_flag;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
410 /* This function can GC */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
411 struct buffer *buf = current_buffer;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
412
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
413 if (INTP (XSYMBOL (sym)->plist))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
414 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
415 count = XSYMBOL (sym)->plist;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
416 system_flag = Qnil;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
417 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
418 else
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
419 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
420 count = Fget (sym, Qcount, Qunbound);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
421 system_flag = Fget (sym, Qsystem_type, Qunbound);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
422 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
423
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
424 if (NILP (XSYMBOL_VALUE (sym)) || ! NILP (system_flag))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
425 return;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
426
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
427 buffer_insert_ascstring (buf, " (");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
428 name = Fsymbol_name (sym);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
429 Fprin1 (name, stream);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
430 buffer_insert_ascstring (buf, " ");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
431 Fprin1 (XSYMBOL_VALUE (sym), stream);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
432 buffer_insert_ascstring (buf, " ");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
433 Fprin1 (XSYMBOL (sym)->function, stream);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
434 buffer_insert_ascstring (buf, " ");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
435 Fprin1 (count, stream);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
436 buffer_insert_ascstring (buf, ")\n");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
437 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
438
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
439 static void
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
440 describe_abbrev (Lisp_Object sym, Lisp_Object stream)
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
441 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
442 Lisp_Object one, count, system_flag;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
443 /* This function can GC */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
444 struct buffer *buf = current_buffer;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
445
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
446 if (INTP (XSYMBOL (sym)->plist))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
447 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
448 count = XSYMBOL (sym)->plist;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
449 system_flag = Qnil;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
450 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
451 else
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
452 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
453 count = Fget (sym, Qcount, Qunbound);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
454 system_flag = Fget (sym, Qsystem_type, Qunbound);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
455 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
456
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
457 if (NILP (XSYMBOL_VALUE (sym)))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
458 return;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
459
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
460 one = make_int (1);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
461 Fprin1 (Fsymbol_name (sym), stream);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
462
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
463 if (!NILP (system_flag))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
464 {
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
465 buffer_insert_ascstring (buf, " (sys)");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
466 Findent_to (make_int (20), one, Qnil);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
467 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
468 else
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
469 Findent_to (make_int (15), one, Qnil);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
470
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
471 Fprin1 (count, stream);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
472 Findent_to (make_int (20), one, Qnil);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
473 Fprin1 (XSYMBOL_VALUE (sym), stream);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
474 if (!NILP (XSYMBOL (sym)->function))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
475 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
476 Findent_to (make_int (45), one, Qnil);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
477 Fprin1 (XSYMBOL (sym)->function, stream);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
478 }
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
479 buffer_insert_ascstring (buf, "\n");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
480 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
481
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
482 static int
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
483 record_symbol (Lisp_Object sym, void *arg)
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
484 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
485 Lisp_Object closure = * (Lisp_Object *) arg;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
486 XSETCDR (closure, Fcons (sym, XCDR (closure)));
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
487 return 0; /* Never stop */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
488 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
489
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
490 DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
491 1, 2, 0, /*
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
492 Insert before point a full description of abbrev table named NAME.
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
493 NAME is a symbol whose value is an abbrev table.
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
494 If optional 2nd arg READABLE is non-nil, a human-readable description
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
495 is inserted. Otherwise the description is an expression,
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
496 a call to `define-abbrev-table', which would
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
497 define the abbrev table NAME exactly as it is currently defined.
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
498
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
499 Abbrevs marked as "system abbrevs" are normally omitted. However, if
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
500 READABLE is non-nil, they are listed. */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
501 (name, readable))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
502 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
503 Lisp_Object table;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
504 Lisp_Object symbols;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
505 Lisp_Object stream;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
506 /* This function can GC */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
507 struct buffer *buf = current_buffer;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
508
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
509 CHECK_SYMBOL (name);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
510 table = Fsymbol_value (name);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
511 CHECK_VECTOR (table);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
512
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
513 /* FIXME: what's the XEmacs equivalent? APA */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
514 /* XSETBUFFER (stream, current_buffer); */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
515 /* Does not seem to work: */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
516 /* Fset_buffer (stream); */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
517 stream = wrap_buffer (current_buffer);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
518
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
519 symbols = Fcons (Qnil, Qnil);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
520 /* Lisp_Object closure = Fcons (Qnil, Qnil); */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
521 /* struct gcpro gcpro1; */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
522 /* GCPRO1 (closure); */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
523 /* map_obarray (table, record_symbol, symbols); */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
524 map_obarray (table, record_symbol, &symbols);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
525 /* map_obarray (table, record_symbol, &closure); */
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
526 symbols = XCDR (symbols);
5182
2e528066e2fc Move #'sort*, #'fill, #'merge to C from cl-seq.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4962
diff changeset
527 symbols = list_sort (symbols, NULL, Qstring_lessp, Qidentity);
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
528
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
529 if (!NILP (readable))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
530 {
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
531 buffer_insert_ascstring (buf, "(");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
532 Fprin1 (name, stream);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
533 buffer_insert_ascstring (buf, ")\n\n");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
534 while (! NILP (symbols))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
535 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
536 describe_abbrev (XCAR (symbols), stream);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
537 symbols = XCDR (symbols);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
538 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
539
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
540 buffer_insert_ascstring (buf, "\n\n");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
541 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
542 else
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
543 {
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
544 buffer_insert_ascstring (buf, "(define-abbrev-table '");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
545 Fprin1 (name, stream);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
546 buffer_insert_ascstring (buf, " '(\n");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
547 while (! NILP (symbols))
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
548 {
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
549 write_abbrev (XCAR (symbols), stream);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
550 symbols = XCDR (symbols);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
551 }
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 3965
diff changeset
552 buffer_insert_ascstring (buf, " ))\n\n");
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
553 }
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
554
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
555 return Qnil;
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
556 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 syms_of_abbrev (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 {
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
561 DEFSYMBOL(Qcount);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
562 Qcount = intern ("count");
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
563 staticpro (&Qcount);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
564 DEFSYMBOL(Qsystem_type);
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
565 Qsystem_type = intern ("system-type");
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
566 DEFSYMBOL (Qpre_abbrev_expand_hook);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 DEFSUBR (Fexpand_abbrev);
3965
69c43a181729 [xemacs-hg @ 2007-05-19 18:41:56 by adrian]
adrian
parents: 2367
diff changeset
568 DEFSUBR (Finsert_abbrev_table_description);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 vars_of_abbrev (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 DEFVAR_LISP ("global-abbrev-table", &Vglobal_abbrev_table /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 The abbrev table whose abbrevs affect all buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 Each buffer may also have a local abbrev table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 If it does, the local table overrides the global one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 for any particular abbrev defined in both.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 Vglobal_abbrev_table = Qnil; /* setup by Lisp code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 DEFVAR_LISP ("last-abbrev", &Vlast_abbrev /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 The abbrev-symbol of the last abbrev expanded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 See the function `abbrev-symbol'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_text /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 The exact text of the last abbrev expanded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 nil if the abbrev has already been unexpanded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 DEFVAR_INT ("last-abbrev-location", &last_abbrev_location /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 The location of the start of the last abbrev expanded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 Vlast_abbrev = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 Vlast_abbrev_text = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 last_abbrev_location = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 DEFVAR_LISP ("abbrev-start-location", &Vabbrev_start_location /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 Buffer position for `expand-abbrev' to use as the start of the abbrev.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 nil means use the word before point as the abbrev.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 Calling `expand-abbrev' sets this to nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 Vabbrev_start_location = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 DEFVAR_LISP ("abbrev-start-location-buffer", &Vabbrev_start_location_buffer /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 Buffer that `abbrev-start-location' has been set for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 Trying to expand an abbrev in any other buffer clears `abbrev-start-location'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 Vabbrev_start_location_buffer = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 DEFVAR_BOOL ("abbrev-all-caps", &abbrev_all_caps /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 *Non-nil means expand multi-word abbrevs all caps if abbrev was so.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 abbrev_all_caps = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abbrev_expand_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 Function or functions to be called before abbrev expansion is done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 This is the first thing that `expand-abbrev' does, and so this may change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 the current abbrev table before abbrev lookup happens.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 Vpre_abbrev_expand_hook = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 }