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