X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/c62c46f33c517369cd3a6a590d6b0053962a5521..cb5b02667a8dcfc00d990103b2fb3236259bd627:/src/keymap.c diff --git a/src/keymap.c b/src/keymap.c index e8f2f88bb2..6ea142651b 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -40,11 +40,11 @@ along with GNU Emacs. If not, see . */ #include #include -#include + #include "lisp.h" #include "commands.h" -#include "buffer.h" #include "character.h" +#include "buffer.h" #include "charset.h" #include "keyboard.h" #include "frame.h" @@ -92,7 +92,6 @@ static Lisp_Object where_is_cache; /* Which keymaps are reverse-stored in the cache. */ static Lisp_Object where_is_cache_keymaps; -static Lisp_Object Flookup_key (Lisp_Object, Lisp_Object, Lisp_Object); static Lisp_Object store_in_keymap (Lisp_Object, Lisp_Object, Lisp_Object); static Lisp_Object define_as_prefix (Lisp_Object, Lisp_Object); @@ -226,7 +225,7 @@ when reading a key-sequence to be looked-up in this keymap. */) Fdefine_key should cause keymaps to be autoloaded. This function can GC when AUTOLOAD is non-zero, because it calls - do_autoload which can GC. */ + Fautoload_do_load which can GC. */ Lisp_Object get_keymap (Lisp_Object object, int error_if_not_keymap, int autoload) @@ -260,7 +259,7 @@ get_keymap (Lisp_Object object, int error_if_not_keymap, int autoload) struct gcpro gcpro1, gcpro2; GCPRO2 (tem, object); - do_autoload (tem, object); + Fautoload_do_load (tem, object, Qnil); UNGCPRO; goto autoload_retry; @@ -956,8 +955,6 @@ store_in_keymap (Lisp_Object keymap, register Lisp_Object idx, Lisp_Object def) return def; } -static Lisp_Object Fcopy_keymap (Lisp_Object); - static Lisp_Object copy_keymap_item (Lisp_Object elt) { @@ -1480,8 +1477,8 @@ current_minor_maps (Lisp_Object **modeptr, Lisp_Object **mapptr) /* Use malloc here. See the comment above this function. Avoid realloc here; it causes spurious traps on GNU/Linux [KFS] */ - BLOCK_INPUT; - newmodes = (Lisp_Object *) malloc (allocsize); + block_input (); + newmodes = malloc (allocsize); if (newmodes) { if (cmm_modes) @@ -1493,7 +1490,7 @@ current_minor_maps (Lisp_Object **modeptr, Lisp_Object **mapptr) cmm_modes = newmodes; } - newmaps = (Lisp_Object *) malloc (allocsize); + newmaps = malloc (allocsize); if (newmaps) { if (cmm_maps) @@ -1504,7 +1501,7 @@ current_minor_maps (Lisp_Object **modeptr, Lisp_Object **mapptr) } cmm_maps = newmaps; } - UNBLOCK_INPUT; + unblock_input (); if (newmodes == NULL || newmaps == NULL) break; @@ -1573,9 +1570,7 @@ like in the respective argument of `key-binding'. */) would not be a problem here, but it is easier to keep things the same. */ - - record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); - + record_unwind_current_buffer (); set_buffer_internal (XBUFFER (XWINDOW (window)->buffer)); } } @@ -1857,7 +1852,7 @@ If KEYMAP is nil, that means no local keymap. */) if (!NILP (keymap)) keymap = get_keymap (keymap, 1, 1); - BVAR (current_buffer, keymap) = keymap; + bset_keymap (current_buffer, keymap); return Qnil; } @@ -2013,9 +2008,7 @@ then the value includes only maps for prefixes that start with PREFIX. */) return Qnil; } else - maps = Fcons (Fcons (Fmake_vector (make_number (0), Qnil), - get_keymap (keymap, 1, 0)), - Qnil); + maps = Fcons (Fcons (zero_vector, get_keymap (keymap, 1, 0)), Qnil); /* For each map in the list maps, look at any other maps it points to, @@ -2074,7 +2067,7 @@ The `kbd' macro is an approximate inverse of this. */) size += XINT (Flength (prefix)); /* This has one extra element at the end that we don't pass to Fconcat. */ - if (min (PTRDIFF_MAX, SIZE_MAX) / sizeof (Lisp_Object) / 4 < size) + if (min (PTRDIFF_MAX, SIZE_MAX) / word_size / 4 < size) memory_full (SIZE_MAX); SAFE_ALLOCA_LISP (args, size * 4); @@ -2146,7 +2139,7 @@ The `kbd' macro is an approximate inverse of this. */) continue; } else - XSETINT (key, (XINT (key) | meta_modifier) & ~0x80); + XSETINT (key, XINT (key) | meta_modifier); add_meta = 0; } else if (EQ (key, meta_prefix_char)) @@ -2164,7 +2157,7 @@ The `kbd' macro is an approximate inverse of this. */) char * push_key_description (EMACS_INT ch, char *p, int force_multibyte) { - int c, c2; + int c, c2, tab_as_ci; /* Clear all the meaningless bits above the meta bit. */ c = ch & (meta_modifier | ~ - meta_modifier); @@ -2178,6 +2171,8 @@ push_key_description (EMACS_INT ch, char *p, int force_multibyte) return p; } + tab_as_ci = (c2 == '\t' && (c & meta_modifier)); + if (c & alt_modifier) { *p++ = 'A'; @@ -2185,7 +2180,8 @@ push_key_description (EMACS_INT ch, char *p, int force_multibyte) c -= alt_modifier; } if ((c & ctrl_modifier) != 0 - || (c2 < ' ' && c2 != 27 && c2 != '\t' && c2 != Ctl ('M'))) + || (c2 < ' ' && c2 != 27 && c2 != '\t' && c2 != Ctl ('M')) + || tab_as_ci) { *p++ = 'C'; *p++ = '-'; @@ -2223,6 +2219,10 @@ push_key_description (EMACS_INT ch, char *p, int force_multibyte) *p++ = 'S'; *p++ = 'C'; } + else if (tab_as_ci) + { + *p++ = 'i'; + } else if (c == '\t') { *p++ = 'T'; @@ -2309,11 +2309,10 @@ around function keys and event symbols. */) { if (NILP (no_angles)) { - char *buffer; Lisp_Object result; USE_SAFE_ALLOCA; - SAFE_ALLOCA (buffer, char *, - sizeof "<>" + SBYTES (SYMBOL_NAME (key))); + char *buffer = SAFE_ALLOCA (sizeof "<>" + + SBYTES (SYMBOL_NAME (key))); esprintf (buffer, "<%s>", SDATA (SYMBOL_NAME (key))); result = build_string (buffer); SAFE_FREE (); @@ -2571,7 +2570,8 @@ where_is_internal (Lisp_Object definition, Lisp_Object keymaps, DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 5, 0, doc: /* Return list of keys that invoke DEFINITION. If KEYMAP is a keymap, search only KEYMAP and the global keymap. -If KEYMAP is nil, search all the currently active keymaps. +If KEYMAP is nil, search all the currently active keymaps, except + for `overriding-local-map' (which is ignored). If KEYMAP is a list of keymaps, search only those keymaps. If optional 3rd arg FIRSTONLY is non-nil, return the first key sequence found, @@ -2586,9 +2586,17 @@ If optional 4th arg NOINDIRECT is non-nil, don't follow indirections to other keymaps or slots. This makes it possible to search for an indirect definition itself. -If optional 5th arg NO-REMAP is non-nil, don't search for key sequences -that invoke a command which is remapped to DEFINITION, but include the -remapped command in the returned list. */) +The optional 5th arg NO-REMAP alters how command remapping is handled: + +- If another command OTHER-COMMAND is remapped to DEFINITION, normally + search for the bindings of OTHER-COMMAND and include them in the + returned list. But if NO-REMAP is non-nil, include the vector + [remap OTHER-COMMAND] in the returned list instead, without + searching for those other bindings. + +- If DEFINITION is remapped to OTHER-COMMAND, normally return the + bindings for OTHER-COMMAND. But if NO-REMAP is non-nil, return the + bindings for DEFINITION instead, ignoring its remapping. */) (Lisp_Object definition, Lisp_Object keymap, Lisp_Object firstonly, Lisp_Object noindirect, Lisp_Object no_remap) { /* The keymaps in which to search. */ @@ -2915,9 +2923,9 @@ You type Translation\n\ char *title, *p; if (!SYMBOLP (modes[i])) - abort (); + emacs_abort (); - p = title = (char *) alloca (42 + SCHARS (SYMBOL_NAME (modes[i]))); + p = title = alloca (42 + SCHARS (SYMBOL_NAME (modes[i]))); *p++ = '\f'; *p++ = '\n'; *p++ = '`'; @@ -2987,9 +2995,9 @@ You type Translation\n\ If MENTION_SHADOW is nonzero, then when something is shadowed by SHADOW, don't omit it; instead, mention it but say it is shadowed. - Return whether something was inserted or not. */ + Any inserted text ends in two newlines (used by `help-make-xrefs'). */ -int +void describe_map_tree (Lisp_Object startmap, int partial, Lisp_Object shadow, Lisp_Object prefix, const char *title, int nomenu, int transl, int always_title, int mention_shadow) @@ -3099,8 +3107,10 @@ key binding\n\ skip: ; } + if (something) + insert_string ("\n"); + UNGCPRO; - return something; } static int previous_description_column; @@ -3696,13 +3706,12 @@ syms_of_keymap (void) Fset (intern_c_string ("ctl-x-map"), control_x_map); Ffset (intern_c_string ("Control-X-prefix"), control_x_map); - exclude_keys - = pure_cons (pure_cons (make_pure_c_string ("DEL"), make_pure_c_string ("\\d")), - pure_cons (pure_cons (make_pure_c_string ("TAB"), make_pure_c_string ("\\t")), - pure_cons (pure_cons (make_pure_c_string ("RET"), make_pure_c_string ("\\r")), - pure_cons (pure_cons (make_pure_c_string ("ESC"), make_pure_c_string ("\\e")), - pure_cons (pure_cons (make_pure_c_string ("SPC"), make_pure_c_string (" ")), - Qnil))))); + exclude_keys = listn (CONSTYPE_PURE, 5, + pure_cons (build_pure_c_string ("DEL"), build_pure_c_string ("\\d")), + pure_cons (build_pure_c_string ("TAB"), build_pure_c_string ("\\t")), + pure_cons (build_pure_c_string ("RET"), build_pure_c_string ("\\r")), + pure_cons (build_pure_c_string ("ESC"), build_pure_c_string ("\\e")), + pure_cons (build_pure_c_string ("SPC"), build_pure_c_string (" "))); staticpro (&exclude_keys); DEFVAR_LISP ("define-key-rebound-commands", Vdefine_key_rebound_commands, @@ -3755,16 +3764,16 @@ be preferred. */); where_is_preferred_modifier = 0; staticpro (&Vmouse_events); - Vmouse_events = pure_cons (intern_c_string ("menu-bar"), - pure_cons (intern_c_string ("tool-bar"), - pure_cons (intern_c_string ("header-line"), - pure_cons (intern_c_string ("mode-line"), - pure_cons (intern_c_string ("mouse-1"), - pure_cons (intern_c_string ("mouse-2"), - pure_cons (intern_c_string ("mouse-3"), - pure_cons (intern_c_string ("mouse-4"), - pure_cons (intern_c_string ("mouse-5"), - Qnil))))))))); + Vmouse_events = listn (CONSTYPE_PURE, 9, + intern_c_string ("menu-bar"), + intern_c_string ("tool-bar"), + intern_c_string ("header-line"), + intern_c_string ("mode-line"), + intern_c_string ("mouse-1"), + intern_c_string ("mouse-2"), + intern_c_string ("mouse-3"), + intern_c_string ("mouse-4"), + intern_c_string ("mouse-5")); DEFSYM (Qsingle_key_description, "single-key-description"); DEFSYM (Qkey_description, "key-description");