|
|
1.1 ! root 1: /* Manipulation of keymaps ! 2: Copyright (C) 1985, 1986, 1987, 1988, 1990 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU Emacs. ! 5: ! 6: GNU Emacs is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 1, or (at your option) ! 9: any later version. ! 10: ! 11: GNU Emacs is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU Emacs; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: #include "config.h" ! 22: #include <stdio.h> ! 23: #undef NULL ! 24: #include "lisp.h" ! 25: #include "commands.h" ! 26: #include "buffer.h" ! 27: ! 28: #define min(a, b) ((a) < (b) ? (a) : (b)) ! 29: ! 30: /* Actually allocate storage for these variables */ ! 31: ! 32: #ifdef HAVE_X_WINDOWS ! 33: Lisp_Object MouseMap; /* Keymap for mouse commands */ ! 34: #endif /* HAVE_X_WINDOWS */ ! 35: ! 36: Lisp_Object global_map; ! 37: ! 38: Lisp_Object Vglobal_map; ! 39: ! 40: Lisp_Object Vesc_map; ! 41: ! 42: Lisp_Object Vctl_x_map; ! 43: ! 44: /* Keymap used for minibuffers with self-inserting space. */ ! 45: Lisp_Object Vminibuffer_local_map; ! 46: ! 47: /* Keymap used for minibuffers when space does not self insert. */ ! 48: Lisp_Object Vminibuffer_local_ns_map; ! 49: ! 50: /* Keymap used for minibuffers when doing completion */ ! 51: Lisp_Object Vminibuffer_local_completion_map; ! 52: ! 53: /* Keymap used for minibuffers when doing completion and require a match */ ! 54: Lisp_Object Vminibuffer_local_must_match_map; ! 55: ! 56: Lisp_Object Qkeymapp, Qkeymap; ! 57: ! 58: /* A char over 0200 in a key sequence ! 59: is equivalent to prefixing with this character. */ ! 60: ! 61: extern int meta_prefix_char; ! 62: ! 63: static void insert_first_line (); ! 64: ! 65: DEFUN ("make-keymap", Fmake_keymap, Smake_keymap, 0, 0, 0, ! 66: "Construct and return a new keymap, a vector of length 128.\n\ ! 67: All entries in it are nil, meaning \"command undefined\".") ! 68: () ! 69: { ! 70: register Lisp_Object val; ! 71: XFASTINT (val) = 0200; ! 72: return Fmake_vector (val, Qnil); ! 73: } ! 74: ! 75: DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, Smake_sparse_keymap, 0, 0, 0, ! 76: "Construct and return a new sparse-keymap list.\n\ ! 77: Its car is 'keymap and its cdr is an alist of (CHAR . DEFINITION).\n\ ! 78: Initially the alist is nil.") ! 79: () ! 80: { ! 81: return Fcons (Qkeymap, Qnil); ! 82: } ! 83: ! 84: /* Install a standard key binding at initialization time. ! 85: For example, ! 86: ndefkey (Vctl_x_map, Ctl ('X'), "exchange-point-and-mark"); */ ! 87: ! 88: void ! 89: ndefkey (keymap, key, defname) ! 90: Lisp_Object keymap; ! 91: int key; ! 92: char *defname; ! 93: { ! 94: store_in_keymap (keymap, key, intern (defname)); ! 95: } ! 96: ! 97: /* Define character fromchar in map frommap as an alias for character tochar in map tomap. ! 98: Subsequent redefinitions of the latter WILL affect the former. */ ! 99: ! 100: #ifdef NOTDEF ! 101: void ! 102: synkey (frommap, fromchar, tomap, tochar) ! 103: struct Lisp_Vector *frommap, *tomap; ! 104: int fromchar, tochar; ! 105: { ! 106: Lisp_Object v, c; ! 107: XSET (v, Lisp_Vector, tomap); ! 108: XFASTINT (c) = tochar; ! 109: frommap->contents[fromchar] = Fcons (v, c); ! 110: } ! 111: #endif /* NOTDEF */ ! 112: ! 113: DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0, ! 114: "Return t if ARG is a keymap.\n\ ! 115: A keymap is a vector of length 128, or a list (keymap . ALIST),\n\ ! 116: where alist elements look like (CHAR . DEFN).\n\ ! 117: A symbol whose function definition is a keymap is itself a keymap.") ! 118: (object) ! 119: Lisp_Object object; ! 120: { ! 121: register Lisp_Object tem; ! 122: tem = object; ! 123: while (XTYPE (tem) == Lisp_Symbol) ! 124: { ! 125: tem = XSYMBOL (tem)->function; ! 126: if (EQ (tem, Qunbound)) ! 127: return Qnil; ! 128: QUIT; ! 129: } ! 130: ! 131: if ((XTYPE (tem) == Lisp_Vector && XVECTOR (tem)->size == 0200) ! 132: || (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))) ! 133: return Qt; ! 134: return Qnil; ! 135: } ! 136: ! 137: Lisp_Object ! 138: get_keymap_1 (object, error) ! 139: Lisp_Object object; ! 140: int error; ! 141: { ! 142: register Lisp_Object tem; ! 143: ! 144: while (1) ! 145: { ! 146: tem = object; ! 147: while (XTYPE (tem) == Lisp_Symbol && !EQ (tem, Qunbound)) ! 148: { ! 149: tem = XSYMBOL (tem)->function; ! 150: QUIT; ! 151: } ! 152: if ((XTYPE (tem) == Lisp_Vector && XVECTOR (tem)->size == 0200) ! 153: || (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))) ! 154: return tem; ! 155: if (error) ! 156: object = wrong_type_argument (Qkeymapp, object); ! 157: else return Qnil; ! 158: } ! 159: } ! 160: ! 161: Lisp_Object ! 162: get_keymap (object) ! 163: Lisp_Object object; ! 164: { ! 165: return get_keymap_1 (object, 1); ! 166: } ! 167: ! 168: Lisp_Object ! 169: get_keyelt (object) ! 170: register Lisp_Object object; ! 171: { ! 172: register Lisp_Object map, tem; ! 173: ! 174: while (map = get_keymap_1 (Fcar_safe (object), 0), ! 175: tem = Fkeymapp (map), ! 176: !NULL (tem)) ! 177: /*(XTYPE (object) == Lisp_Cons && !EQ (XCONS (object)->car, Qkeymap))*/ ! 178: { ! 179: object = Fcdr (object); ! 180: if (CONSP (map)) ! 181: object = Fcdr (Fassq (object, Fcdr (map))); ! 182: else ! 183: object = Faref (map, object); ! 184: } ! 185: return object; ! 186: } ! 187: ! 188: Lisp_Object ! 189: access_keymap (map, idx) ! 190: Lisp_Object map; ! 191: register int idx; ! 192: { ! 193: register Lisp_Object val; ! 194: if (idx < 0 || idx >= 0200) ! 195: error ("Command key out of range 0-127"); ! 196: ! 197: /* Get definition for character `idx' proper. */ ! 198: if (CONSP (map)) ! 199: val = Fcdr (Fassq (make_number (idx), Fcdr (map))); ! 200: else ! 201: val = XVECTOR (map)->contents[idx]; ! 202: ! 203: return val; ! 204: } ! 205: ! 206: Lisp_Object ! 207: store_in_keymap (keymap, idx, def) ! 208: Lisp_Object keymap; ! 209: register int idx; ! 210: register Lisp_Object def; ! 211: { ! 212: register Lisp_Object tem; ! 213: ! 214: if (idx < 0 || idx >= 0200) ! 215: error ("Command key out of range 0-127"); ! 216: ! 217: if (CONSP (keymap)) ! 218: { ! 219: tem = Fassq (make_number (idx), Fcdr (keymap)); ! 220: if (!NULL (tem)) ! 221: Fsetcdr (tem, def); ! 222: else ! 223: Fsetcdr (keymap, Fcons (Fcons (make_number (idx), def), ! 224: Fcdr (keymap))); ! 225: } ! 226: else ! 227: XVECTOR (keymap)->contents[idx] = def; ! 228: ! 229: return def; ! 230: } ! 231: ! 232: DEFUN ("copy-keymap", Fcopy_keymap, Scopy_keymap, 1, 1, 0, ! 233: "Return a copy of the keymap KEYMAP.\n\ ! 234: The copy starts out with the same definitions of KEYMAP,\n\ ! 235: but changing either the copy or KEYMAP does not affect the other.\n\ ! 236: Any key definitions that are subkeymaps are recursively copied.\n\ ! 237: However, a key definition which is a symbol whose definition is a keymap\n\ ! 238: is not copied.") ! 239: (keymap) ! 240: Lisp_Object keymap; ! 241: { ! 242: register Lisp_Object copy, tem; ! 243: ! 244: keymap = get_keymap (keymap); ! 245: if (XTYPE (keymap) == Lisp_Vector) ! 246: { ! 247: register int i; ! 248: copy = Fcopy_sequence (keymap); ! 249: for (i = 0; i < XVECTOR (copy)->size; i++) ! 250: if (XTYPE (XVECTOR (copy)->contents[i]) != Lisp_Symbol) ! 251: if (tem = Fkeymapp (XVECTOR (copy)->contents[i]), !NULL (tem)) ! 252: XVECTOR (copy)->contents[i] ! 253: = Fcopy_keymap (XVECTOR (copy)->contents[i]); ! 254: } ! 255: else ! 256: { ! 257: register Lisp_Object tail; ! 258: copy = Fcopy_alist (keymap); ! 259: for (tail = copy; CONSP (tail); tail = XCONS (tail)->cdr) ! 260: { ! 261: register Lisp_Object elt; ! 262: elt = XCONS (tail)->car; ! 263: if (CONSP (elt) ! 264: && XTYPE (XCONS (elt)->cdr) != Lisp_Symbol ! 265: && (tem = Fkeymapp (XCONS (elt)->cdr), !NULL (tem))) ! 266: XCONS (elt)->cdr = Fcopy_keymap (XCONS (elt)->cdr); ! 267: } ! 268: } ! 269: return copy; ! 270: } ! 271: ! 272: DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0, ! 273: "Args KEYMAP, KEY, DEF. Define key sequence KEY, in KEYMAP, as DEF.\n\ ! 274: KEYMAP is a keymap. KEY is a string meaning a sequence of keystrokes.\n\ ! 275: DEF is anything that can be a key's definition:\n\ ! 276: nil (means key is undefined in this keymap),\n\ ! 277: a command (a Lisp function suitable for interactive calling)\n\ ! 278: a string (treated as a keyboard macro),\n\ ! 279: a keymap (to define a prefix key),\n\ ! 280: a list (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP,\n\ ! 281: or a symbol. The symbol's function definition is used as the key's\n\ ! 282: definition, and may be any of the above (including another symbol).") ! 283: (keymap, key, def) ! 284: register Lisp_Object keymap; ! 285: Lisp_Object key; ! 286: Lisp_Object def; ! 287: { ! 288: register int idx; ! 289: register int c; ! 290: register Lisp_Object tem; ! 291: register Lisp_Object cmd; ! 292: int metized = 0; ! 293: ! 294: keymap = get_keymap (keymap); ! 295: ! 296: CHECK_STRING (key, 1); ! 297: if (XSTRING (key)->size == 0) ! 298: return Qnil; ! 299: ! 300: idx = 0; ! 301: while (1) ! 302: { ! 303: c = XSTRING (key)->data[idx]; ! 304: if (c >= 0200 && !metized) ! 305: { ! 306: c = meta_prefix_char; ! 307: metized = 1; ! 308: } ! 309: else ! 310: { ! 311: c &= 0177; ! 312: metized = 0; ! 313: idx++; ! 314: } ! 315: ! 316: if (idx == XSTRING (key)->size) ! 317: return store_in_keymap (keymap, c, def); ! 318: ! 319: cmd = get_keyelt (access_keymap (keymap, c)); ! 320: if (NULL (cmd)) ! 321: { ! 322: cmd = Fmake_sparse_keymap (); ! 323: store_in_keymap (keymap, c, cmd); ! 324: } ! 325: tem = Fkeymapp (cmd); ! 326: if (NULL (tem)) ! 327: error ("Key sequence %s uses invalid prefix characters", ! 328: XSTRING (key)->data); ! 329: ! 330: keymap = get_keymap (cmd); ! 331: } ! 332: } ! 333: ! 334: /* Value is number if KEY is too long; nil if valid but has no definition. */ ! 335: ! 336: DEFUN ("lookup-key", Flookup_key, Slookup_key, 2, 2, 0, ! 337: "In keymap KEYMAP, look up key sequence KEY. Return the definition.\n\ ! 338: nil means undefined. See doc of define-key for kinds of definitions.\n\ ! 339: Number as value means KEY is \"too long\";\n\ ! 340: that is, characters in it except for the last one\n\ ! 341: fail to be a valid sequence of prefix characters in KEYMAP.\n\ ! 342: The number is how many characters at the front of KEY\n\ ! 343: it takes to reach a non-prefix command.") ! 344: (keymap, key) ! 345: register Lisp_Object keymap; ! 346: Lisp_Object key; ! 347: { ! 348: register int idx; ! 349: register Lisp_Object tem; ! 350: register Lisp_Object cmd; ! 351: register int c; ! 352: int metized = 0; ! 353: ! 354: keymap = get_keymap (keymap); ! 355: ! 356: CHECK_STRING (key, 1); ! 357: if (XSTRING (key)->size == 0) ! 358: return Qnil; ! 359: ! 360: idx = 0; ! 361: while (1) ! 362: { ! 363: c = XSTRING (key)->data[idx]; ! 364: if (c >= 0200 && !metized) ! 365: { ! 366: c = meta_prefix_char; ! 367: metized = 1; ! 368: } ! 369: else ! 370: { ! 371: c &= 0177; ! 372: metized = 0; ! 373: idx++; ! 374: } ! 375: ! 376: cmd = get_keyelt (access_keymap (keymap, c)); ! 377: if (idx == XSTRING (key)->size) ! 378: return cmd; ! 379: ! 380: tem = Fkeymapp (cmd); ! 381: if (NULL (tem)) ! 382: return make_number (idx); ! 383: ! 384: keymap = get_keymap (cmd); ! 385: QUIT; ! 386: } ! 387: } ! 388: ! 389: DEFUN ("key-binding", Fkey_binding, Skey_binding, 1, 1, 0, ! 390: "Return the definition for command KEYS in current keymaps.\n\ ! 391: KEYS is a string, a sequence of keystrokes.\n\ ! 392: The definition is probably a symbol with a function definition.") ! 393: (keys) ! 394: Lisp_Object keys; ! 395: { ! 396: register Lisp_Object map, value, value1; ! 397: map = current_buffer->keymap; ! 398: if (!NULL (map)) ! 399: { ! 400: value = Flookup_key (map, keys); ! 401: if (NULL (value)) ! 402: { ! 403: XSET (map, Lisp_Vector, global_map); ! 404: value1 = Flookup_key (map, keys); ! 405: if (XTYPE (value1) == Lisp_Int) ! 406: return Qnil; ! 407: return value1; ! 408: } ! 409: else if (XTYPE (value) != Lisp_Int) ! 410: return value; ! 411: } ! 412: XSET (map, Lisp_Vector, global_map); ! 413: return Flookup_key (map, keys); ! 414: } ! 415: ! 416: DEFUN ("local-key-binding", Flocal_key_binding, Slocal_key_binding, 1, 1, 0, ! 417: "Return the definition for command KEYS in current local keymap only.\n\ ! 418: KEYS is a string, a sequence of keystrokes.\n\ ! 419: The definition is probably a symbol with a function definition.") ! 420: (keys) ! 421: Lisp_Object keys; ! 422: { ! 423: register Lisp_Object map; ! 424: map = current_buffer->keymap; ! 425: if (NULL (map)) ! 426: return Qnil; ! 427: return Flookup_key (map, keys); ! 428: } ! 429: ! 430: DEFUN ("global-key-binding", Fglobal_key_binding, Sglobal_key_binding, 1, 1, 0, ! 431: "Return the definition for command KEYS in current global keymap only.\n\ ! 432: KEYS is a string, a sequence of keystrokes.\n\ ! 433: The definition is probably a symbol with a function definition.") ! 434: (keys) ! 435: Lisp_Object keys; ! 436: { ! 437: register Lisp_Object map; ! 438: XSET (map, Lisp_Vector, global_map); ! 439: return Flookup_key (map, keys); ! 440: } ! 441: ! 442: DEFUN ("global-set-key", Fglobal_set_key, Sglobal_set_key, 2, 2, ! 443: "kSet key globally: \nCSet key %s to command: ", ! 444: "Give KEY a definition of COMMAND.\n\ ! 445: COMMAND is a symbol naming an interactively-callable function.\n\ ! 446: KEY is a string representing a sequence of keystrokes.\n\ ! 447: Note that if KEY has a local definition in the current buffer\n\ ! 448: that local definition will continue to shadow any global definition.") ! 449: (keys, function) ! 450: Lisp_Object keys, function; ! 451: { ! 452: register Lisp_Object map; ! 453: XSET (map, Lisp_Vector, global_map); ! 454: CHECK_STRING (keys, 1); ! 455: Fdefine_key (map, keys, function); ! 456: return Qnil; ! 457: } ! 458: ! 459: DEFUN ("local-set-key", Flocal_set_key, Slocal_set_key, 2, 2, ! 460: "kSet key locally: \nCSet key %s locally to command: ", ! 461: "Give KEY a local definition of COMMAND.\n\ ! 462: COMMAND is a symbol naming an interactively-callable function.\n\ ! 463: KEY is a string representing a sequence of keystrokes.\n\ ! 464: The definition goes in the current buffer's local map,\n\ ! 465: which is shared with other buffers in the same major mode.") ! 466: (keys, function) ! 467: Lisp_Object keys, function; ! 468: { ! 469: register Lisp_Object map; ! 470: map = current_buffer->keymap; ! 471: if (NULL (map)) ! 472: { ! 473: map = Fmake_sparse_keymap (); ! 474: current_buffer->keymap = map; ! 475: } ! 476: ! 477: CHECK_STRING (keys, 1); ! 478: Fdefine_key (map, keys, function); ! 479: return Qnil; ! 480: } ! 481: ! 482: DEFUN ("global-unset-key", Fglobal_unset_key, Sglobal_unset_key, ! 483: 1, 1, "kUnset key globally: ", ! 484: "Remove global definition of KEY.\n\ ! 485: KEY is a string representing a sequence of keystrokes.") ! 486: (keys) ! 487: Lisp_Object keys; ! 488: { ! 489: return Fglobal_set_key (keys, Qnil); ! 490: } ! 491: ! 492: DEFUN ("local-unset-key", Flocal_unset_key, Slocal_unset_key, 1, 1, ! 493: "kUnset key locally: ", ! 494: "Remove local definition of KEY.\n\ ! 495: KEY is a string representing a sequence of keystrokes.") ! 496: (keys) ! 497: Lisp_Object keys; ! 498: { ! 499: if (!NULL (current_buffer->keymap)) ! 500: Flocal_set_key (keys, Qnil); ! 501: return Qnil; ! 502: } ! 503: ! 504: DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 1, 0, ! 505: "Define SYMBOL as a prefix command.\n\ ! 506: A keymap is created and stored as SYMBOL's function definition.") ! 507: (name) ! 508: Lisp_Object name; ! 509: { ! 510: Ffset (name, Fmake_keymap ()); ! 511: return name; ! 512: } ! 513: ! 514: DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0, ! 515: "Selects KEYMAP as the global keymap.") ! 516: (keymap) ! 517: Lisp_Object keymap; ! 518: { ! 519: keymap = get_keymap (keymap); ! 520: CHECK_VECTOR (keymap, 0); ! 521: global_map = keymap; ! 522: return Qnil; ! 523: } ! 524: ! 525: DEFUN ("use-local-map", Fuse_local_map, Suse_local_map, 1, 1, 0, ! 526: "Selects KEYMAP as the local keymap.\n\ ! 527: nil for KEYMAP means no local keymap.") ! 528: (keymap) ! 529: Lisp_Object keymap; ! 530: { ! 531: if (!NULL (keymap)) ! 532: keymap = get_keymap (keymap); ! 533: ! 534: current_buffer->keymap = keymap; ! 535: ! 536: return Qnil; ! 537: } ! 538: ! 539: DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0, ! 540: "Return current buffer's local keymap, or nil if it has none.") ! 541: () ! 542: { ! 543: return current_buffer->keymap; ! 544: } ! 545: ! 546: DEFUN ("current-global-map", Fcurrent_global_map, Scurrent_global_map, 0, 0, 0, ! 547: "Return the current global keymap.") ! 548: () ! 549: { ! 550: return global_map; ! 551: } ! 552: ! 553: DEFUN ("accessible-keymaps", Faccessible_keymaps, Saccessible_keymaps, ! 554: 1, 1, 0, ! 555: "Find all keymaps accessible via prefix characters from KEYMAP.\n\ ! 556: Returns a list of elements of the form (KEYS . MAP), where the sequence\n\ ! 557: KEYS starting from KEYMAP gets you to MAP. These elements are ordered\n\ ! 558: so that the KEYS increase in length. The first element is (\"\" . KEYMAP).") ! 559: (startmap) ! 560: Lisp_Object startmap; ! 561: { ! 562: Lisp_Object maps, tail; ! 563: register Lisp_Object thismap, thisseq; ! 564: register Lisp_Object dummy; ! 565: register Lisp_Object tem; ! 566: register Lisp_Object cmd; ! 567: register int i; ! 568: ! 569: maps = Fcons (Fcons (build_string (""), get_keymap (startmap)), Qnil); ! 570: tail = maps; ! 571: ! 572: /* For each map in the list maps, ! 573: look at any other maps it points to ! 574: and stick them at the end if they are not already in the list */ ! 575: ! 576: while (!NULL (tail)) ! 577: { ! 578: thisseq = Fcar (Fcar (tail)); ! 579: thismap = Fcdr (Fcar (tail)); ! 580: for (i = 0; i < 0200; i++) ! 581: { ! 582: cmd = get_keyelt (access_keymap (thismap, i)); ! 583: if (NULL (cmd)) continue; ! 584: tem = Fkeymapp (cmd); ! 585: if (!NULL (tem)) ! 586: { ! 587: cmd = get_keymap (cmd); ! 588: tem = Frassq (cmd, maps); ! 589: if (NULL (tem)) ! 590: { ! 591: XFASTINT (dummy) = i; ! 592: dummy = concat2 (thisseq, Fchar_to_string (dummy)); ! 593: nconc2 (tail, Fcons (Fcons (dummy, cmd), Qnil)); ! 594: } ! 595: } ! 596: } ! 597: tail = Fcdr (tail); ! 598: } ! 599: ! 600: return maps; ! 601: } ! 602: ! 603: Lisp_Object Qsingle_key_description, Qkey_description; ! 604: ! 605: DEFUN ("key-description", Fkey_description, Skey_description, 1, 1, 0, ! 606: "Return a pretty description of key-sequence KEYS.\n\ ! 607: Control characters turn into \"C-foo\" sequences, meta into \"M-foo\"\n\ ! 608: spaces are put between sequence elements, etc.") ! 609: (keys) ! 610: Lisp_Object keys; ! 611: { ! 612: return Fmapconcat (Qsingle_key_description, keys, build_string (" ")); ! 613: } ! 614: ! 615: char * ! 616: push_key_description (c, p) ! 617: register unsigned int c; ! 618: register char *p; ! 619: { ! 620: if (c >= 0200) ! 621: { ! 622: *p++ = 'M'; ! 623: *p++ = '-'; ! 624: c -= 0200; ! 625: } ! 626: if (c < 040) ! 627: { ! 628: if (c == 033) ! 629: { ! 630: *p++ = 'E'; ! 631: *p++ = 'S'; ! 632: *p++ = 'C'; ! 633: } ! 634: else if (c == Ctl('I')) ! 635: { ! 636: *p++ = 'T'; ! 637: *p++ = 'A'; ! 638: *p++ = 'B'; ! 639: } ! 640: else if (c == Ctl('J')) ! 641: { ! 642: *p++ = 'L'; ! 643: *p++ = 'F'; ! 644: *p++ = 'D'; ! 645: } ! 646: else if (c == Ctl('M')) ! 647: { ! 648: *p++ = 'R'; ! 649: *p++ = 'E'; ! 650: *p++ = 'T'; ! 651: } ! 652: else ! 653: { ! 654: *p++ = 'C'; ! 655: *p++ = '-'; ! 656: if (c > 0 && c <= Ctl ('Z')) ! 657: *p++ = c + 0140; ! 658: else ! 659: *p++ = c + 0100; ! 660: } ! 661: } ! 662: else if (c == 0177) ! 663: { ! 664: *p++ = 'D'; ! 665: *p++ = 'E'; ! 666: *p++ = 'L'; ! 667: } ! 668: else if (c == ' ') ! 669: { ! 670: *p++ = 'S'; ! 671: *p++ = 'P'; ! 672: *p++ = 'C'; ! 673: } ! 674: else ! 675: *p++ = c; ! 676: return p; ! 677: } ! 678: ! 679: DEFUN ("single-key-description", Fsingle_key_description, Ssingle_key_description, 1, 1, 0, ! 680: "Return a pretty description of command character KEY.\n\ ! 681: Control characters turn into C-whatever, etc.") ! 682: (key) ! 683: Lisp_Object key; ! 684: { ! 685: register unsigned char c; ! 686: char tem[6]; ! 687: ! 688: CHECK_NUMBER (key, 0); ! 689: c = XINT (key) & 0377; ! 690: ! 691: *push_key_description (c, tem) = 0; ! 692: ! 693: return build_string (tem); ! 694: } ! 695: ! 696: char * ! 697: push_text_char_description (c, p) ! 698: register unsigned int c; ! 699: register char *p; ! 700: { ! 701: if (c >= 0200) ! 702: { ! 703: *p++ = 'M'; ! 704: *p++ = '-'; ! 705: c -= 0200; ! 706: } ! 707: if (c < 040) ! 708: { ! 709: *p++ = '^'; ! 710: *p++ = c + 64; /* 'A' - 1 */ ! 711: } ! 712: else if (c == 0177) ! 713: { ! 714: *p++ = '^'; ! 715: *p++ = '?'; ! 716: } ! 717: else ! 718: *p++ = c; ! 719: return p; ! 720: } ! 721: ! 722: DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0, ! 723: "Return a pretty description of file-character CHAR.\n\ ! 724: Control characters turn into \"^char\", etc.") ! 725: (chr) ! 726: Lisp_Object chr; ! 727: { ! 728: char tem[6]; ! 729: ! 730: CHECK_NUMBER (chr, 0); ! 731: ! 732: *push_text_char_description (XINT (chr) & 0377, tem) = 0; ! 733: ! 734: return build_string (tem); ! 735: } ! 736: ! 737: DEFUN ("where-is-internal", Fwhere_is_internal, Swhere_is_internal, 1, 3, 0, ! 738: "Return list of key sequences that currently invoke command DEFINITION\n\ ! 739: in KEYMAP or (current-global-map). If KEYMAP is nil, only search for\n\ ! 740: keys in the global map.\n\ ! 741: \n\ ! 742: If FIRSTONLY is non-nil, returns a string representing the first key\n\ ! 743: sequence found, rather than a list of all possible key sequences.") ! 744: (definition, local_keymap, firstonly) ! 745: Lisp_Object definition, local_keymap, firstonly; ! 746: { ! 747: Lisp_Object start1; ! 748: register Lisp_Object maps; ! 749: Lisp_Object found; ! 750: ! 751: XSET (start1, Lisp_Vector, global_map); ! 752: ! 753: if (!NULL (local_keymap)) ! 754: maps = nconc2 (Faccessible_keymaps (get_keymap (local_keymap)), ! 755: Faccessible_keymaps (start1)); ! 756: else ! 757: maps = Faccessible_keymaps (start1); ! 758: ! 759: found = Qnil; ! 760: ! 761: for (; !NULL (maps); maps = Fcdr (maps)) ! 762: { ! 763: register this = Fcar (Fcar (maps)); /* Key sequence to reach map */ ! 764: register map = Fcdr (Fcar (maps)); /* The map that it reaches */ ! 765: register int i = 0; ! 766: ! 767: if (CONSP (map)) ! 768: map = Fcdr (map); ! 769: ! 770: /* If the MAP is a vector, I increments and eventually reaches 0200. ! 771: Otherwise I remains 0; MAP is cdr'd and eventually becomes nil. */ ! 772: ! 773: while (!NULL (map) && i < 0200) ! 774: { ! 775: register Lisp_Object elt, dummy; ! 776: ! 777: QUIT; ! 778: if (CONSP (map)) ! 779: { ! 780: elt = Fcdr (Fcar (map)); ! 781: dummy = Fcar (Fcar (map)); ! 782: map = Fcdr (map); ! 783: } ! 784: else ! 785: { ! 786: elt = XVECTOR (map)->contents[i]; ! 787: XFASTINT (dummy) = i; ! 788: i++; ! 789: } ! 790: ! 791: if (XTYPE (definition) != Lisp_Cons) ! 792: elt = get_keyelt (elt); ! 793: ! 794: /* End this iteration if this element does not match ! 795: the target. */ ! 796: ! 797: if (XTYPE (definition) == Lisp_Cons) ! 798: { ! 799: Lisp_Object tem; ! 800: tem = Fequal (elt, definition); ! 801: if (NULL (tem)) ! 802: continue; ! 803: } ! 804: else ! 805: if (!EQ (elt, definition)) ! 806: continue; ! 807: ! 808: /* We have found a match. ! 809: Construct the key sequence where we found it. */ ! 810: ! 811: dummy = concat2 (this, Fchar_to_string (dummy)); ! 812: ! 813: /* Verify that this key binding is not shadowed ! 814: by another binding for the same key, ! 815: before we say it exists. ! 816: The mechanism: look for local definition of this key ! 817: and if it is defined and does not match what we found ! 818: then ignore this key. ! 819: Either nil or number as value from Flookup_key ! 820: means undefined. */ ! 821: ! 822: if (!NULL (local_keymap)) ! 823: elt = Flookup_key (local_keymap, dummy); ! 824: if (!NULL (elt) && XTYPE (elt) != Lisp_Int) ! 825: { ! 826: if (XTYPE (definition) == Lisp_Cons) ! 827: { ! 828: Lisp_Object tem; ! 829: tem = Fequal (elt, definition); ! 830: if (NULL (tem)) ! 831: continue; ! 832: } ! 833: else ! 834: if (!EQ (elt, definition)) ! 835: continue; ! 836: } ! 837: ! 838: /* It is a true unshadowed match Record it. */ ! 839: ! 840: if (!NULL (firstonly)) ! 841: return dummy; ! 842: found = Fcons (dummy, found); ! 843: } ! 844: } ! 845: return Fnreverse (found); ! 846: } ! 847: ! 848: DEFUN ("where-is", Fwhere_is, Swhere_is, 1, 1, "CWhere is command: ", ! 849: "Print message listing key sequences that invoke specified command.\n\ ! 850: Argument is a command definition, usually a symbol with a function definition.") ! 851: (definition) ! 852: Lisp_Object definition; ! 853: { ! 854: register Lisp_Object tem; ! 855: CHECK_SYMBOL (definition, 0); ! 856: tem = Fmapconcat (Qkey_description, ! 857: Fwhere_is_internal (definition, current_buffer->keymap, Qnil), ! 858: build_string (", ")); ! 859: if (XSTRING (tem)->size) ! 860: message ("%s is on %s", XSYMBOL (definition)->name->data, XSTRING (tem)->data); ! 861: else ! 862: message ("%s is not on any keys", XSYMBOL (definition)->name->data); ! 863: return Qnil; ! 864: } ! 865: ! 866: Lisp_Object describe_buffer_bindings (); ! 867: ! 868: DEFUN ("describe-bindings", Fdescribe_bindings, Sdescribe_bindings, 0, 0, "", ! 869: "Show a list of all defined keys, and their definitions.\n\ ! 870: The list is put in a buffer, which is displayed.") ! 871: () ! 872: { ! 873: register Lisp_Object thisbuf; ! 874: XSET (thisbuf, Lisp_Buffer, current_buffer); ! 875: internal_with_output_to_temp_buffer ("*Help*", describe_buffer_bindings, thisbuf); ! 876: return Qnil; ! 877: } ! 878: ! 879: Lisp_Object ! 880: describe_buffer_bindings (descbuf) ! 881: Lisp_Object descbuf; ! 882: { ! 883: register Lisp_Object start1; ! 884: char *heading = "key binding\n--- -------\n"; ! 885: ! 886: Fset_buffer (Vstandard_output); ! 887: ! 888: start1 = XBUFFER (descbuf)->keymap; ! 889: if (!NULL (start1)) ! 890: { ! 891: InsStr ("Local Bindings:\n"); ! 892: InsStr (heading); ! 893: heading = 0; ! 894: describe_map_tree (start1, 0, Qnil); ! 895: InsStr ("\n"); ! 896: } ! 897: ! 898: InsStr ("Global Bindings:\n"); ! 899: if (heading) ! 900: InsStr (heading); ! 901: ! 902: XSET (start1, Lisp_Vector, global_map); ! 903: describe_map_tree (start1, 0, XBUFFER (descbuf)->keymap); ! 904: ! 905: Fset_buffer (descbuf); ! 906: return Qnil; ! 907: } ! 908: ! 909: /* Insert a desription of the key bindings in STARTMAP, ! 910: followed by those of all maps reachable through STARTMAP. ! 911: If PARTIAL is nonzero, omit certain "uninteresting" commands ! 912: (such as `undefined'). ! 913: If SHADOW is non-nil, don't mention keys which would be shadowed by it */ ! 914: ! 915: describe_map_tree (startmap, partial, shadow) ! 916: Lisp_Object startmap, shadow; ! 917: int partial; ! 918: { ! 919: Lisp_Object maps; ! 920: register Lisp_Object elt, sh; ! 921: struct gcpro gcpro1; ! 922: ! 923: maps = Faccessible_keymaps (startmap); ! 924: GCPRO1 (maps); ! 925: ! 926: for (; !NULL (maps); maps = Fcdr (maps)) ! 927: { ! 928: elt = Fcar (maps); ! 929: sh = Fcar (elt); ! 930: if (NULL (shadow)) ! 931: sh = Qnil; ! 932: else if (XTYPE (sh) == Lisp_String && ! 933: XSTRING (sh)->size == 0) ! 934: sh = shadow; ! 935: else ! 936: { ! 937: sh = Flookup_key (shadow, Fcar (elt)); ! 938: if (XTYPE (sh) == Lisp_Int) ! 939: sh = Qnil; ! 940: } ! 941: if (NULL (sh) || !NULL (Fkeymapp (sh))) ! 942: describe_map (Fcdr (elt), Fcar (elt), partial, sh); ! 943: } ! 944: ! 945: UNGCPRO; ! 946: } ! 947: ! 948: describe_command (definition) ! 949: Lisp_Object definition; ! 950: { ! 951: register Lisp_Object tem1; ! 952: ! 953: Findent_to (make_number (16), make_number (1)); ! 954: ! 955: if (XTYPE (definition) == Lisp_Symbol) ! 956: { ! 957: XSET (tem1, Lisp_String, XSYMBOL (definition)->name); ! 958: insert1 (tem1); ! 959: InsStr ("\n"); ! 960: } ! 961: else ! 962: { ! 963: tem1 = Fkeymapp (definition); ! 964: if (!NULL (tem1)) ! 965: InsStr ("Prefix Command\n"); ! 966: else ! 967: InsStr ("??\n"); ! 968: } ! 969: } ! 970: ! 971: /* Describe the contents of map MAP, assuming that this map ! 972: itself is reached by the sequence of prefix keys STRING (a string). ! 973: PARTIAL and SHADOW are the same as in `describe_map_tree' above. */ ! 974: ! 975: describe_map (map, string, partial, shadow) ! 976: Lisp_Object map, string; ! 977: int partial; ! 978: Lisp_Object shadow; ! 979: { ! 980: register Lisp_Object keysdesc; ! 981: ! 982: if (!NULL (string) && XSTRING (string)->size > 0) ! 983: #ifdef NeXT ! 984: /* Bug fix supplied by RMS via [email protected]: ! 985: * Evaluate build_string() after Fkey_description() to avoid ! 986: * having the former's results prematurely GC'ed. (28818) ! 987: */ ! 988: { ! 989: Lisp_Object tem; ! 990: /* Call Fkey_description first to avoid GC problem. */ ! 991: tem = Fkey_description (string); ! 992: keysdesc = concat2 (tem, build_string (" ")); ! 993: } ! 994: #else ! 995: keysdesc = concat2 (Fkey_description (string), build_string (" ")); ! 996: #endif /* NOT NeXT */ ! 997: else ! 998: keysdesc = Qnil; ! 999: ! 1000: if (CONSP (map)) ! 1001: describe_alist (Fcdr (map), keysdesc, describe_command, ! 1002: partial, shadow); ! 1003: else ! 1004: describe_vector (map, keysdesc, describe_command, ! 1005: partial, shadow); ! 1006: } ! 1007: ! 1008: describe_alist (alist, elt_prefix, elt_describer, partial, shadow) ! 1009: register Lisp_Object alist; ! 1010: Lisp_Object elt_prefix; ! 1011: int (*elt_describer) (); ! 1012: int partial; ! 1013: Lisp_Object shadow; ! 1014: { ! 1015: Lisp_Object this; ! 1016: Lisp_Object tem1, tem2; ! 1017: Lisp_Object suppress; ! 1018: Lisp_Object kludge = Qnil; ! 1019: int first = 1; ! 1020: struct gcpro gcpro1, gcpro2; ! 1021: ! 1022: if (partial) ! 1023: suppress = intern ("suppress-keymap"); ! 1024: ! 1025: for (; CONSP (alist); alist = Fcdr (alist)) ! 1026: { ! 1027: QUIT; ! 1028: tem1 = Fcar (Fcar (alist)); ! 1029: tem2 = get_keyelt (Fcdr (Fcar (alist))); ! 1030: if (NULL (tem2)) continue; ! 1031: if (XTYPE (tem2) == Lisp_Symbol && partial) ! 1032: { ! 1033: this = Fget (tem2, suppress); ! 1034: if (!NULL (this)) ! 1035: continue; ! 1036: } ! 1037: ! 1038: if (!NULL (shadow)) ! 1039: { ! 1040: Lisp_Object tem; ! 1041: if (NULL (kludge)) kludge = build_string ("x"); ! 1042: XSTRING (kludge)->data[0] = XINT (tem1); ! 1043: tem = Flookup_key (shadow, kludge); ! 1044: if (!NULL (tem)) continue; ! 1045: } ! 1046: ! 1047: if (first) ! 1048: { ! 1049: insert ("\n", 1); ! 1050: first = 0; ! 1051: } ! 1052: ! 1053: GCPRO2 (elt_prefix, tem2); ! 1054: if (!NULL (elt_prefix)) ! 1055: insert1 (elt_prefix); ! 1056: ! 1057: insert1 (Fsingle_key_description (tem1)); ! 1058: ! 1059: (*elt_describer) (tem2); ! 1060: UNGCPRO; ! 1061: } ! 1062: } ! 1063: ! 1064: describe_vector (vector, elt_prefix, elt_describer, partial, shadow) ! 1065: register Lisp_Object vector; ! 1066: Lisp_Object elt_prefix; ! 1067: int (*elt_describer) (); ! 1068: int partial; ! 1069: Lisp_Object shadow; ! 1070: { ! 1071: Lisp_Object this; ! 1072: Lisp_Object dummy; ! 1073: Lisp_Object tem1, tem2; ! 1074: register int i, size = XVECTOR (vector)->size; ! 1075: Lisp_Object suppress; ! 1076: Lisp_Object kludge; ! 1077: int first = 1; ! 1078: struct gcpro gcpro1, gcpro2; ! 1079: ! 1080: tem1 = Qnil; ! 1081: kludge = Qnil; ! 1082: GCPRO2 (elt_prefix, tem1); ! 1083: ! 1084: if (partial) ! 1085: suppress = intern ("suppress-keymap"); ! 1086: ! 1087: for (i = 0; i < size; i++) ! 1088: { ! 1089: QUIT; ! 1090: tem1 = get_keyelt (XVECTOR (vector)->contents[i]); ! 1091: if (NULL (tem1)) continue; ! 1092: if (XTYPE (tem1) == Lisp_Symbol && partial) ! 1093: { ! 1094: this = Fget (tem1, suppress); ! 1095: if (!NULL (this)) ! 1096: continue; ! 1097: } ! 1098: ! 1099: if (!NULL (shadow)) ! 1100: { ! 1101: Lisp_Object tem; ! 1102: if (NULL (kludge)) kludge = build_string ("x"); ! 1103: XSTRING (kludge)->data[0] = XINT (i); ! 1104: tem = Flookup_key (shadow, kludge); ! 1105: if (!NULL (tem)) continue; ! 1106: } ! 1107: ! 1108: if (first) ! 1109: { ! 1110: insert ("\n", 1); ! 1111: first = 0; ! 1112: } ! 1113: ! 1114: if (!NULL (elt_prefix)) ! 1115: insert1 (elt_prefix); ! 1116: ! 1117: XFASTINT (dummy) = i; ! 1118: insert1 (Fsingle_key_description (dummy)); ! 1119: ! 1120: while (i + 1 < size ! 1121: && (tem2 = get_keyelt (XVECTOR (vector)->contents[i+1]), ! 1122: EQ (tem2, tem1))) ! 1123: i++; ! 1124: ! 1125: if (i != XINT (dummy)) ! 1126: { ! 1127: insert (" .. ", 4); ! 1128: if (!NULL (elt_prefix)) ! 1129: insert1 (elt_prefix); ! 1130: ! 1131: XFASTINT (dummy) = i; ! 1132: insert1 (Fsingle_key_description (dummy)); ! 1133: } ! 1134: ! 1135: (*elt_describer) (tem1); ! 1136: } ! 1137: ! 1138: UNGCPRO; ! 1139: } ! 1140: ! 1141: /* Apropos */ ! 1142: Lisp_Object apropos_predicate; ! 1143: Lisp_Object apropos_accumulate; ! 1144: ! 1145: static ! 1146: apropos_accum (symbol, string) ! 1147: Lisp_Object symbol, string; ! 1148: { ! 1149: register Lisp_Object tem; ! 1150: ! 1151: tem = Fstring_match (string, Fsymbol_name (symbol), Qnil); ! 1152: if (!NULL (tem) && !NULL (apropos_predicate)) ! 1153: tem = call1 (apropos_predicate, symbol); ! 1154: if (!NULL (tem)) ! 1155: apropos_accumulate = Fcons (symbol, apropos_accumulate); ! 1156: } ! 1157: ! 1158: static Lisp_Object ! 1159: apropos1 (list) ! 1160: register Lisp_Object list; ! 1161: { ! 1162: struct buffer *old = current_buffer; ! 1163: register Lisp_Object symbol, col, tem; ! 1164: ! 1165: while (!NULL (list)) ! 1166: { ! 1167: Lisp_Object min_cols; ! 1168: ! 1169: QUIT; ! 1170: ! 1171: symbol = Fcar (list); ! 1172: list = Fcdr (list); ! 1173: ! 1174: tem = Fwhere_is_internal (symbol, current_buffer->keymap, Qnil); ! 1175: tem = Fmapconcat (Qkey_description, tem, build_string (", ")); ! 1176: XFASTINT (col) = 30; ! 1177: ! 1178: set_buffer_internal (XBUFFER (Vstandard_output)); ! 1179: Fprin1 (symbol, Qnil); ! 1180: XFASTINT (min_cols) = 1; ! 1181: Findent_to (col, min_cols); ! 1182: Fprinc (tem, Qnil); ! 1183: Fterpri (Qnil); ! 1184: tem = Ffboundp (symbol); ! 1185: if (!NULL (tem)) ! 1186: tem = Fdocumentation (symbol); ! 1187: if (XTYPE (tem) == Lisp_String) ! 1188: insert_first_line (" Function: ", tem); ! 1189: tem = Fdocumentation_property (symbol, Qvariable_documentation); ! 1190: if (XTYPE (tem) == Lisp_String) ! 1191: insert_first_line (" Variable: ", tem); ! 1192: set_buffer_internal (old); ! 1193: } ! 1194: return Qnil; ! 1195: } ! 1196: ! 1197: static void ! 1198: insert_first_line (prefix, str) ! 1199: char *prefix; ! 1200: Lisp_Object str; ! 1201: { ! 1202: extern char *index (); ! 1203: register unsigned char *p; ! 1204: register unsigned char *p1; ! 1205: register unsigned char *p2; ! 1206: struct gcpro gcpro1; ! 1207: ! 1208: GCPRO1 (str); ! 1209: InsStr (prefix); ! 1210: ! 1211: retry: ! 1212: p = XSTRING (str)->data; ! 1213: p1 = (unsigned char *) index (p, '\n'); ! 1214: ! 1215: for (p2 = p; *p2 && p2 != p1; p2++) ! 1216: if (p2[0] == '\\' && p2[1] == '[') ! 1217: { ! 1218: str = Fsubstitute_command_keys (str); ! 1219: goto retry; ! 1220: } ! 1221: ! 1222: insert (p, p1 ? p1 - p : strlen (p)); ! 1223: insert ("\n", 1); ! 1224: UNGCPRO; ! 1225: } ! 1226: ! 1227: DEFUN ("apropos", Fapropos, Sapropos, 1, 3, "sApropos: ", ! 1228: "Show all symbols whose names contain match for REGEXP.\n\ ! 1229: If optional arg PRED is non-nil, (funcall PRED SYM) is done\n\ ! 1230: for each symbol and a symbol is mentioned if that returns non-nil.\n\ ! 1231: Returns list of symbols found; if third arg NOPRINT is non-nil,\n\ ! 1232: does not display them, just returns the list.") ! 1233: (string, pred, noprint) ! 1234: Lisp_Object string, pred, noprint; ! 1235: { ! 1236: struct gcpro gcpro1, gcpro2; ! 1237: CHECK_STRING (string, 0); ! 1238: apropos_predicate = pred; ! 1239: GCPRO2 (apropos_predicate, apropos_accumulate); ! 1240: apropos_accumulate = Qnil; ! 1241: map_obarray (Vobarray, apropos_accum, string); ! 1242: apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp); ! 1243: if (NULL (noprint)) ! 1244: internal_with_output_to_temp_buffer ("*Help*", apropos1, ! 1245: apropos_accumulate); ! 1246: UNGCPRO; ! 1247: return apropos_accumulate; ! 1248: } ! 1249: ! 1250: syms_of_keymap () ! 1251: { ! 1252: Lisp_Object tem; ! 1253: ! 1254: Qkeymap = intern ("keymap"); ! 1255: staticpro (&Qkeymap); ! 1256: ! 1257: /* Initialize the keymaps standardly used. ! 1258: Each one is the value of a Lisp variable, and is also ! 1259: pointed to by a C variable */ ! 1260: ! 1261: #ifdef HAVE_X_WINDOWS ! 1262: tem = Fmake_keymap (); ! 1263: MouseMap = tem; ! 1264: Fset (intern ("mouse-map"), tem); ! 1265: #endif /* HAVE_X_WINDOWS */ ! 1266: ! 1267: tem = Fmake_keymap (); ! 1268: Vglobal_map = tem; ! 1269: Fset (intern ("global-map"), tem); ! 1270: ! 1271: tem = Fmake_keymap (); ! 1272: Vesc_map = tem; ! 1273: Fset (intern ("esc-map"), tem); ! 1274: Ffset (intern ("ESC-prefix"), tem); ! 1275: ! 1276: tem = Fmake_keymap (); ! 1277: Vctl_x_map = tem; ! 1278: Fset (intern ("ctl-x-map"), tem); ! 1279: Ffset (intern ("Control-X-prefix"), tem); ! 1280: ! 1281: DEFVAR_LISP ("minibuffer-local-map", &Vminibuffer_local_map, ! 1282: "Default keymap to use when reading from the minibuffer."); ! 1283: Vminibuffer_local_map = Fmake_sparse_keymap (); ! 1284: ! 1285: DEFVAR_LISP ("minibuffer-local-ns-map", &Vminibuffer_local_ns_map, ! 1286: "The keymap used by the minibuf for local bindings when spaces are not\n\ ! 1287: to be allowed in input string."); ! 1288: Vminibuffer_local_ns_map = Fmake_sparse_keymap (); ! 1289: ! 1290: DEFVAR_LISP ("minibuffer-local-completion-map", &Vminibuffer_local_completion_map, ! 1291: "Keymap to use when reading from the minibuffer with completion."); ! 1292: Vminibuffer_local_completion_map = Fmake_sparse_keymap (); ! 1293: ! 1294: DEFVAR_LISP ("minibuffer-local-must-match-map", &Vminibuffer_local_must_match_map, ! 1295: "Keymap to use when reading from the minibuffer with completion and\n\ ! 1296: an exact match of one of the completions is required."); ! 1297: Vminibuffer_local_must_match_map = Fmake_sparse_keymap (); ! 1298: ! 1299: global_map = Vglobal_map; ! 1300: ! 1301: Qsingle_key_description = intern ("single-key-description"); ! 1302: staticpro (&Qsingle_key_description); ! 1303: ! 1304: Qkey_description = intern ("key-description"); ! 1305: staticpro (&Qkey_description); ! 1306: ! 1307: Qkeymapp = intern ("keymapp"); ! 1308: staticpro (&Qkeymapp); ! 1309: ! 1310: defsubr (&Skeymapp); ! 1311: defsubr (&Smake_keymap); ! 1312: defsubr (&Smake_sparse_keymap); ! 1313: defsubr (&Scopy_keymap); ! 1314: defsubr (&Skey_binding); ! 1315: defsubr (&Slocal_key_binding); ! 1316: defsubr (&Sglobal_key_binding); ! 1317: defsubr (&Sglobal_set_key); ! 1318: defsubr (&Slocal_set_key); ! 1319: defsubr (&Sdefine_key); ! 1320: defsubr (&Slookup_key); ! 1321: defsubr (&Sglobal_unset_key); ! 1322: defsubr (&Slocal_unset_key); ! 1323: defsubr (&Sdefine_prefix_command); ! 1324: defsubr (&Suse_global_map); ! 1325: defsubr (&Suse_local_map); ! 1326: defsubr (&Scurrent_local_map); ! 1327: defsubr (&Scurrent_global_map); ! 1328: defsubr (&Saccessible_keymaps); ! 1329: defsubr (&Skey_description); ! 1330: defsubr (&Ssingle_key_description); ! 1331: defsubr (&Stext_char_description); ! 1332: defsubr (&Swhere_is_internal); ! 1333: defsubr (&Swhere_is); ! 1334: defsubr (&Sdescribe_bindings); ! 1335: defsubr (&Sapropos); ! 1336: } ! 1337: ! 1338: keys_of_keymap () ! 1339: { ! 1340: ndefkey (Vglobal_map, 033, "ESC-prefix"); ! 1341: ndefkey (Vglobal_map, Ctl ('X'), "Control-X-prefix"); ! 1342: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.