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