|
|
1.1 ! root 1: /* Keyboard input; editor command loop. ! 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: /*** For version 19, can simplify this by making interrupt_input 1 on VMS. */ ! 22: ! 23: /* Allow config.h to undefine symbols found here. */ ! 24: #include <signal.h> ! 25: ! 26: #include "config.h" ! 27: #include <stdio.h> ! 28: #undef NULL ! 29: #include "termchar.h" ! 30: #include "termopts.h" ! 31: #include "termhooks.h" ! 32: #include "lisp.h" ! 33: #include "macros.h" ! 34: #include "window.h" ! 35: #include "commands.h" ! 36: #include "buffer.h" ! 37: #include <setjmp.h> ! 38: #include <errno.h> ! 39: ! 40: extern int errno; ! 41: ! 42: /* Get FIONREAD, if it is available. */ ! 43: #ifdef USG ! 44: #include <termio.h> ! 45: #include <fcntl.h> ! 46: #else /* not USG */ ! 47: #ifndef VMS ! 48: #include <sys/ioctl.h> ! 49: #endif /* not VMS */ ! 50: #endif /* not USG */ ! 51: ! 52: /* Allow m- file to inhibit use of FIONREAD. */ ! 53: #ifdef BROKEN_FIONREAD ! 54: #undef FIONREAD ! 55: #endif ! 56: ! 57: /* Make all keyboard buffers much bigger when using X windows. */ ! 58: #ifdef HAVE_X_WINDOWS ! 59: #define BUFFER_SIZE_FACTOR 16 ! 60: #else ! 61: #define BUFFER_SIZE_FACTOR 1 ! 62: #endif ! 63: ! 64: /* Following definition copied from eval.c */ ! 65: ! 66: struct backtrace ! 67: { ! 68: struct backtrace *next; ! 69: Lisp_Object *function; ! 70: Lisp_Object *args; /* Points to vector of args. */ ! 71: int nargs; /* length of vector */ ! 72: /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */ ! 73: char evalargs; ! 74: }; ! 75: ! 76: /* Non-nil disable property on a command means ! 77: do not execute it; call disabled-command-hook's value instead. */ ! 78: Lisp_Object Qdisabled, Vdisabled_command_hook; ! 79: ! 80: int recent_keys_index; /* Index for storing next element into recent_keys */ ! 81: int total_keys; /* Total number of elements stored into recent_keys */ ! 82: char recent_keys[100]; /* Holds last 100 keystrokes */ ! 83: ! 84: extern struct backtrace *backtrace_list; ! 85: ! 86: static jmp_buf getcjmp; /* for longjmp to where kbd input is being done. */ ! 87: ! 88: int waiting_for_input; /* True while doing kbd input */ ! 89: ! 90: static int echoing; /* True while inside EchoKeys. Delays C-g throwing. */ ! 91: ! 92: int immediate_quit; /* Nonzero means C-G should cause immediate error-signal. */ ! 93: ! 94: int help_char; /* Character to recognize as the help char. */ ! 95: ! 96: Lisp_Object Vhelp_form; /* Form to execute when help char is typed. */ ! 97: ! 98: extern struct Lisp_Vector *CurrentGlobalMap; ! 99: ! 100: /* Total number of times get_char has returned. */ ! 101: ! 102: int num_input_chars; ! 103: ! 104: /* Last input character read as a command. */ ! 105: ! 106: int last_command_char; ! 107: ! 108: /* Last input character read for any purpose. */ ! 109: ! 110: int last_input_char; ! 111: ! 112: /* If not -1, a character to be read as the next command input */ ! 113: ! 114: int unread_command_char; ! 115: ! 116: /* Char to use as prefix when a meta character is typed in. ! 117: This is bound on entry to minibuffer in case Esc is changed there. */ ! 118: ! 119: int meta_prefix_char; ! 120: ! 121: static int auto_save_interval; /* The number of keystrokes between ! 122: auto-saves. */ ! 123: static int Keystrokes; /* The number of keystrokes since the last ! 124: auto-save. */ ! 125: ! 126: Lisp_Object last_command; /* Previous command, represented by a Lisp object. ! 127: Does not include prefix commands and arg setting commands */ ! 128: ! 129: Lisp_Object this_command; /* If a command sets this, ! 130: the value goes into previous-command for the next command. */ ! 131: ! 132: Lisp_Object Qself_insert_command; ! 133: Lisp_Object Qforward_char; ! 134: Lisp_Object Qbackward_char; ! 135: ! 136: /* read_key_sequence stores here the command definition of the ! 137: key sequence that it reads */ ! 138: Lisp_Object read_key_sequence_cmd; ! 139: ! 140: /* Form to evaluate (if non-nil) when Emacs is started */ ! 141: Lisp_Object Vtop_level; ! 142: ! 143: /* User-supplied string to translate input characters through */ ! 144: Lisp_Object Vkeyboard_translate_table; ! 145: ! 146: FILE *dribble; /* File in which we write all commands we read */ ! 147: ! 148: /* Nonzero if input is available */ ! 149: int input_pending; ! 150: ! 151: /* Nonzero if should obey 0200 bit in input chars as "Meta" */ ! 152: int MetaFlag; ! 153: ! 154: /* Buffer for pre-read keyboard input */ ! 155: unsigned char kbd_buffer [256 * BUFFER_SIZE_FACTOR]; ! 156: ! 157: /* Number of characters available in kbd_buffer. */ ! 158: int kbd_count; ! 159: ! 160: /* Pointer to next available character in kbd_buffer. */ ! 161: unsigned char *kbd_ptr; ! 162: ! 163: /* Address (if not 0) of word to zero out ! 164: if a SIGIO interrupt happens */ ! 165: long *input_available_clear_word; ! 166: ! 167: /* Nonzero means use SIGIO interrupts; zero means use CBREAK mode. ! 168: Default is 1 if INTERRUPT_INPUT is defined. */ ! 169: ! 170: int interrupt_input; ! 171: ! 172: /* Nonzero while interrupts are temporarily deferred during redisplay. */ ! 173: ! 174: int interrupts_deferred; ! 175: ! 176: /* nonzero means use ^S/^Q for flow control. */ ! 177: ! 178: int flow_control; ! 179: ! 180: #ifndef BSD4_1 ! 181: #define sigfree() sigsetmask (0) ! 182: #define sigholdx(sig) sigsetmask (1 << ((sig) - 1)) ! 183: #define sigblockx(sig) sigblock (1 << ((sig) - 1)) ! 184: #define sigunblockx(sig) sigblock (0) ! 185: #define sigpausex(sig) sigpause (0) ! 186: #endif /* not BSD4_1 */ ! 187: ! 188: #ifdef BSD4_1 ! 189: #define SIGIO SIGTINT ! 190: /* sigfree and sigholdx are in sysdep.c */ ! 191: #define sigblockx(sig) sighold (sig) ! 192: #define sigunblockx(sig) sigrelse (sig) ! 193: #define sigpausex(sig) sigpause (sig) ! 194: #endif /* BSD4_1 */ ! 195: ! 196: #ifndef sigmask ! 197: #define sigmask(no) (1L << ((no) - 1)) ! 198: #endif ! 199: ! 200: /* We are unable to use interrupts if FIONREAD is not available, ! 201: so flush SIGIO so we won't try. */ ! 202: #ifndef FIONREAD ! 203: #ifdef SIGIO ! 204: #undef SIGIO ! 205: #endif ! 206: #endif ! 207: ! 208: /* Function for init_keyboard to call with no args (if nonzero). */ ! 209: void (*keyboard_init_hook) (); ! 210: ! 211: static void read_avail_input (); ! 212: static void get_input_pending (); ! 213: ! 214: /* Non-zero tells input_available_signal to call read_socket_hook ! 215: even if FIONREAD returns zero. */ ! 216: static int force_input; ! 217: ! 218: static char KeyBuf[40]; /* Buffer for keys from get_char () */ ! 219: static int NextK; /* Next index into KeyBuf */ ! 220: static int echo_keystrokes; /* > 0 if we are to echo keystrokes */ ! 221: static int Echo1; /* Stuff for final echo */ ! 222: unsigned char *keys_prompt; /* String to display in front of echoed keystrokes, or 0 */ ! 223: ! 224: #define min(a,b) ((a)<(b)?(a):(b)) ! 225: ! 226: static char echobuf[100]; ! 227: ! 228: EchoThem (notfinal) ! 229: register notfinal; ! 230: { ! 231: char *p; ! 232: int i; ! 233: ! 234: extern char *push_key_description (); ! 235: ! 236: if (!(keys_prompt || (echo_keystrokes > 0 && NextK))) ! 237: return; ! 238: ! 239: echoing = 1; ! 240: p = echobuf; ! 241: if (keys_prompt) ! 242: { ! 243: strcpy (p, keys_prompt); ! 244: p += strlen (p); ! 245: } ! 246: for (i = 0; i < NextK; i++) ! 247: { ! 248: p = push_key_description (KeyBuf[i], p); ! 249: *p++ = ' '; ! 250: if (i == 0 && KeyBuf[0] == help_char) ! 251: { ! 252: strcpy (p, "(Type ? for further options) "); ! 253: p += strlen (p); ! 254: } ! 255: } ! 256: if (notfinal && NextK ! 257: && !(NextK == 1 && KeyBuf[0] == help_char)) ! 258: p[-1] = '-'; ! 259: *p = 0; ! 260: minibuf_message = echobuf; ! 261: ! 262: if (notfinal) ! 263: Echo1++; /* set echoed-flag */ ! 264: if (notfinal >= 0) ! 265: DoDsp (0); ! 266: ! 267: echoing = 0; ! 268: ! 269: if (waiting_for_input && !NULL (Vquit_flag)) ! 270: quit_throw_to_get_char (); ! 271: } ! 272: ! 273: Lisp_Object recursive_edit_unwind (), command_loop (); ! 274: ! 275: DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "", ! 276: "Invoke the editor command loop recursively.\n\ ! 277: Do (throw 'exit nil) within the command loop to make this function return,\n\ ! 278: or (throw 'exit t) to make this function signal an error.\n\ ! 279: This function is called by the editor initialization\n\ ! 280: to begin editing.") ! 281: () ! 282: { ! 283: int count = specpdl_ptr - specpdl; ! 284: Lisp_Object val; ! 285: ! 286: RecurseDepth++; ! 287: RedoModes++; ! 288: ! 289: if (RecurseDepth) ! 290: { ! 291: specbind (Qstandard_output, Qt); ! 292: specbind (Qstandard_input, Qt); ! 293: } ! 294: ! 295: record_unwind_protect (recursive_edit_unwind, ! 296: (RecurseDepth && ! 297: bf_cur != XBUFFER (XWINDOW (selected_window)->buffer)) ! 298: ? Fcurrent_buffer () ! 299: : Qnil); ! 300: ! 301: val = command_loop (); ! 302: if (EQ (val, Qt)) ! 303: Fsignal (Qquit, Qnil); ! 304: ! 305: unbind_to (count); ! 306: return Qnil; ! 307: } ! 308: ! 309: Lisp_Object ! 310: recursive_edit_unwind (buffer) ! 311: Lisp_Object buffer; ! 312: { ! 313: if (!NULL (buffer)) ! 314: Fset_buffer (buffer); ! 315: RecurseDepth--; ! 316: RedoModes++; ! 317: return Qnil; ! 318: } ! 319: ! 320: Lisp_Object ! 321: cmd_error (data) ! 322: Lisp_Object data; ! 323: { ! 324: Lisp_Object errmsg, tail, errname, file_error; ! 325: int i; ! 326: ! 327: Vquit_flag = Qnil; ! 328: Vinhibit_quit = Qt; ! 329: Vstandard_output = Qt; ! 330: Vstandard_input = Qt; ! 331: Vexecuting_macro = Qnil; ! 332: minibuf_message = 0; ! 333: ! 334: Fdiscard_input (); ! 335: Ding (); ! 336: ! 337: errname = Fcar (data); ! 338: ! 339: if (EQ (errname, Qerror)) ! 340: { ! 341: data = Fcdr (data); ! 342: if (!CONSP (data)) data = Qnil; ! 343: errmsg = Fcar (data); ! 344: file_error = Qnil; ! 345: } ! 346: else ! 347: { ! 348: errmsg = Fget (errname, Qerror_message); ! 349: file_error = Fmemq (Qfile_error, ! 350: Fget (errname, Qerror_conditions)); ! 351: } ! 352: ! 353: /* Print an error message including the data items. ! 354: This is done by printing it into a scratch buffer ! 355: and then making a copy of the text in the buffer. */ ! 356: ! 357: if (!CONSP (data)) data = Qnil; ! 358: tail = Fcdr (data); ! 359: ! 360: /* For file-error, make error message by concatenating ! 361: all the data items. They are all strings. */ ! 362: if (!NULL (file_error)) ! 363: errmsg = XCONS (tail)->car, tail = XCONS (tail)->cdr; ! 364: ! 365: if (XTYPE (errmsg) == Lisp_String) ! 366: Fprinc (errmsg, Qt); ! 367: else ! 368: write_string_1 ("peculiar error", -1, Qt); ! 369: ! 370: for (i = 0; CONSP (tail); tail = Fcdr (tail), i++) ! 371: { ! 372: write_string_1 (i ? ", " : ": ", 2, Qt); ! 373: if (!NULL (file_error)) ! 374: Fprinc (Fcar (tail), Qt); ! 375: else ! 376: Fprin1 (Fcar (tail), Qt); ! 377: } ! 378: ! 379: /* In -batch mode, force out the error message and newlines after it ! 380: and then die. */ ! 381: if (noninteractive) ! 382: { ! 383: message (""); ! 384: Fkill_emacs (make_number (-1)); ! 385: } ! 386: ! 387: Vquit_flag = Qnil; ! 388: ! 389: Vinhibit_quit = Qnil; ! 390: return make_number (0); ! 391: } ! 392: ! 393: Lisp_Object command_loop_1 (); ! 394: Lisp_Object command_loop_2 (); ! 395: Lisp_Object cmd_error (); ! 396: Lisp_Object top_level_1 (); ! 397: ! 398: /* Entry to editor-command-loop. ! 399: This level has the catches for exiting/returning to editor command loop. ! 400: It returns nil to exit recursive edit, t to abort it. */ ! 401: ! 402: Lisp_Object ! 403: command_loop () ! 404: { ! 405: if (RecurseDepth) ! 406: { ! 407: return internal_catch (Qexit, command_loop_2, Qnil); ! 408: } ! 409: else ! 410: while (1) ! 411: { ! 412: internal_catch (Qtop_level, top_level_1, Qnil); ! 413: internal_catch (Qtop_level, command_loop_2, Qnil); ! 414: /* End of file in -batch run causes exit here. */ ! 415: if (noninteractive) ! 416: Fkill_emacs (Qt); ! 417: } ! 418: } ! 419: ! 420: /* Here we catch errors in execution of commands within the ! 421: editing loop, and reenter the editing loop. ! 422: When there is an error, cmd_error runs and returns a non-nil ! 423: value to us. A value of nil means that cmd_loop_1 itself ! 424: returned due to end of file (or end of kbd macro). */ ! 425: ! 426: Lisp_Object ! 427: command_loop_2 () ! 428: { ! 429: register Lisp_Object val; ! 430: do ! 431: val = internal_condition_case (command_loop_1, Qerror, cmd_error); ! 432: while (!NULL (val)); ! 433: return Qnil; ! 434: } ! 435: ! 436: Lisp_Object ! 437: top_level_2 () ! 438: { ! 439: return Feval (Vtop_level); ! 440: } ! 441: ! 442: Lisp_Object ! 443: top_level_1 () ! 444: { ! 445: /* On entry to the outer level, run the startup file */ ! 446: if (!NULL (Vtop_level)) ! 447: internal_condition_case (top_level_2, Qerror, cmd_error); ! 448: else if (!NULL (Vpurify_flag)) ! 449: message ("Bare impure Emacs (standard Lisp code not loaded)"); ! 450: else ! 451: message ("Bare Emacs (standard Lisp code not loaded)"); ! 452: return Qnil; ! 453: } ! 454: ! 455: DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "", ! 456: "Exit all recursive editing levels.") ! 457: () ! 458: { ! 459: Fthrow (Qtop_level, Qnil); ! 460: } ! 461: ! 462: DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "", ! 463: "Exit from the innermost recursive edit or minibuffer.") ! 464: () ! 465: { ! 466: if (RecurseDepth) ! 467: Fthrow (Qexit, Qnil); ! 468: error ("No recursive edit is in progress"); ! 469: } ! 470: ! 471: DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "", ! 472: "Abort the command that requested this recursive edit or minibuffer input.") ! 473: () ! 474: { ! 475: if (RecurseDepth) ! 476: Fthrow (Qexit, Qt); ! 477: error ("No recursive edit is in progress"); ! 478: } ! 479: ! 480: /* This is the actual command reading loop, ! 481: sans error-handling encapsulation */ ! 482: ! 483: Lisp_Object Fcommand_execute (); ! 484: ! 485: Lisp_Object ! 486: command_loop_1 () ! 487: { ! 488: Lisp_Object cmd; ! 489: int lose; ! 490: int nonundocount; ! 491: char keybuf[30]; ! 492: int i; ! 493: int no_redisplay; ! 494: int no_direct; ! 495: ! 496: Vprefix_arg = Qnil; ! 497: waiting_for_input = 0; ! 498: Echo1 = 0; ! 499: NextK = 0; ! 500: last_command = Qt; ! 501: nonundocount = 0; ! 502: no_redisplay = 0; ! 503: ! 504: while (1) ! 505: { ! 506: /* Install chars successfully executed in kbd macro */ ! 507: if (defining_kbd_macro && NULL (Vprefix_arg)) ! 508: finalize_kbd_macro_chars (); ! 509: ! 510: /* Make sure current window's buffer is selected. */ ! 511: ! 512: if (XBUFFER (XWINDOW (selected_window)->buffer) != bf_cur) ! 513: SetBfp (XBUFFER (XWINDOW (selected_window)->buffer)); ! 514: ! 515: no_direct = 0; ! 516: ! 517: /* If minibuffer on and echo area in use, ! 518: wait 2 sec and redraw minibufer. */ ! 519: ! 520: if (MinibufDepth && minibuf_message) ! 521: { ! 522: Fsit_for (make_number (2), Qnil); ! 523: minibuf_message = 0; ! 524: no_direct = 1; ! 525: if (!NULL (Vquit_flag)) ! 526: { ! 527: Vquit_flag = Qnil; ! 528: unread_command_char = Ctl ('g'); ! 529: } ! 530: } ! 531: ! 532: i = 0; ! 533: #if 0 ! 534: /* If prev. command was directly displayed, we don't need ! 535: redisplay. Try shortcut for reading single-char key sequence. */ ! 536: if (no_redisplay) ! 537: i = fast_read_one_key (keybuf); ! 538: #endif /* 0 */ ! 539: /* Shortcut not applicable or found a prefix key. ! 540: Take full precautions and read key sequence the hard way. */ ! 541: if (i == 0) ! 542: { ! 543: #ifdef C_ALLOCA ! 544: alloca (0); /* Cause a garbage collection now */ ! 545: /* Since we can free the most stuff here. */ ! 546: #endif /* C_ALLOCA */ ! 547: ! 548: /* Read next key sequence; i gets its length. */ ! 549: ! 550: i = read_key_sequence (keybuf, sizeof keybuf, 0, ! 551: no_redisplay && buffer_shared <= 1); ! 552: } ! 553: ! 554: /* Now we have read a key sequence of length I, ! 555: or else I is 0 and we found end of file. */ ! 556: ! 557: if (i == 0) /* End of file -- happens only in */ ! 558: return Qnil; /* a kbd macro, at the end */ ! 559: ! 560: last_command_char = keybuf[i - 1]; ! 561: ! 562: cmd = read_key_sequence_cmd; ! 563: if (!NULL (Vexecuting_macro)) ! 564: { ! 565: if (!NULL (Vquit_flag)) ! 566: { ! 567: Vexecuting_macro = Qt; ! 568: QUIT; /* Make some noise. */ ! 569: /* Will return since macro now empty. */ ! 570: } ! 571: } ! 572: ! 573: /* Do redisplay processing after this command except in special ! 574: cases identified below that set no_redisplay to 1. */ ! 575: no_redisplay = 0; ! 576: ! 577: /* Execute the command. */ ! 578: ! 579: if (NULL (cmd)) ! 580: { ! 581: /* nil means key is undefined. */ ! 582: Ding (); ! 583: defining_kbd_macro = 0; ! 584: RedoModes++; ! 585: Vprefix_arg = Qnil; ! 586: } ! 587: else ! 588: { ! 589: this_command = cmd; ! 590: if (NULL (Vprefix_arg) && ! no_direct) ! 591: { ! 592: if (EQ (cmd, Qforward_char) && point <= NumCharacters) ! 593: { ! 594: lose = CharAt (point); ! 595: SetPoint (point + 1); ! 596: if (lose >= ' ' && lose < 0177 ! 597: && (XFASTINT (XWINDOW (selected_window)->last_modified) ! 598: >= bf_modified) ! 599: && (XFASTINT (XWINDOW (selected_window)->last_point) ! 600: == point) ! 601: && !windows_or_buffers_changed ! 602: && EQ (bf_cur->selective_display, Qnil) ! 603: && !detect_input_pending () ! 604: && NULL (Vexecuting_macro)) ! 605: no_redisplay = direct_output_forward_char (1); ! 606: goto directly_done; ! 607: } ! 608: else if (EQ (cmd, Qbackward_char) && point > FirstCharacter) ! 609: { ! 610: SetPoint (point - 1); ! 611: lose = CharAt (point); ! 612: if (lose >= ' ' && lose < 0177 ! 613: && (XFASTINT (XWINDOW (selected_window)->last_modified) ! 614: >= bf_modified) ! 615: && (XFASTINT (XWINDOW (selected_window)->last_point) ! 616: == point) ! 617: && !windows_or_buffers_changed ! 618: && EQ (bf_cur->selective_display, Qnil) ! 619: && !detect_input_pending () ! 620: && NULL (Vexecuting_macro)) ! 621: no_redisplay = direct_output_forward_char (-1); ! 622: goto directly_done; ! 623: } ! 624: else if (EQ (cmd, Qself_insert_command)) ! 625: { ! 626: if (NULL (Vexecuting_macro) && ! 627: !EQ (minibuf_window, selected_window)) ! 628: { ! 629: if (!nonundocount || nonundocount >= 20) ! 630: { ! 631: Fundo_boundary (); ! 632: nonundocount = 0; ! 633: } ! 634: nonundocount++; ! 635: } ! 636: lose = (XFASTINT (XWINDOW (selected_window)->last_modified) ! 637: < bf_modified) ! 638: || (XFASTINT (XWINDOW (selected_window)->last_point) ! 639: != point) ! 640: || bf_modified <= bf_cur->save_modified ! 641: || windows_or_buffers_changed ! 642: || !EQ (bf_cur->selective_display, Qnil) ! 643: || detect_input_pending () ! 644: || !NULL (Vexecuting_macro); ! 645: if (SelfInsert (last_command_char, 0)) ! 646: { ! 647: lose = 1; ! 648: nonundocount = 0; ! 649: } ! 650: if (!lose ! 651: && (point == NumCharacters + 1 || CharAt (point) == '\n') ! 652: && last_command_char >= ' ' ! 653: && last_command_char < 0177) ! 654: no_redisplay ! 655: = direct_output_for_insert (last_command_char); ! 656: goto directly_done; ! 657: } ! 658: } ! 659: ! 660: /* Here for a command that isn't executed directly */ ! 661: ! 662: nonundocount = 0; ! 663: if (NULL (Vprefix_arg) && NULL (Vexecuting_macro) && ! 664: !EQ (minibuf_window, selected_window)) ! 665: Fundo_boundary (); ! 666: Fcommand_execute (cmd, Qnil); ! 667: ! 668: directly_done: ; ! 669: } ! 670: ! 671: if (NULL (Vprefix_arg)) ! 672: { ! 673: last_command = this_command; ! 674: NextK = 0; ! 675: Echo1 = 0; ! 676: } ! 677: } ! 678: } ! 679: ! 680: /* Input of single characters from keyboard */ ! 681: ! 682: Lisp_Object print_help (); ! 683: ! 684: int echo_flag; ! 685: int echo_now; ! 686: ! 687: /* Alarm interrupt calls this and requests echoing at earliest safe time. */ ! 688: request_echo () ! 689: { ! 690: int old_errno = errno; ! 691: ! 692: /* Note: no need to reestablish handler on USG systems ! 693: because it is established, if approriate, each time an alarm is requested. */ ! 694: #ifdef subprocesses ! 695: #ifdef BSD4_1 ! 696: extern int select_alarmed; ! 697: if (select_alarmed == 0) ! 698: { ! 699: select_alarmed = 1; ! 700: sigrelse (SIGALRM); ! 701: return; ! 702: } ! 703: #endif ! 704: #endif ! 705: ! 706: #ifdef BSD4_1 ! 707: sigisheld (SIGALRM); ! 708: #endif ! 709: ! 710: if (echo_now) ! 711: EchoThem (1); ! 712: else ! 713: echo_flag = 1; ! 714: ! 715: #ifdef BSD4_1 ! 716: sigunhold (SIGALRM); ! 717: #endif ! 718: ! 719: errno = old_errno; ! 720: } ! 721: ! 722: /* read a character from the keyboard; call the redisplay if needed */ ! 723: /* commandflag 0 means do not do auto-saving, but do do redisplay. ! 724: -1 means do not do redisplay, but do do autosaving. ! 725: 1 means do both. */ ! 726: ! 727: get_char (commandflag) ! 728: int commandflag; ! 729: { ! 730: register int c; ! 731: int alarmtime; ! 732: int count; ! 733: Lisp_Object tem; ! 734: extern request_echo (); ! 735: ! 736: if ((c = unread_command_char) >= 0) ! 737: { ! 738: unread_command_char = -1; ! 739: goto reread; ! 740: } ! 741: ! 742: if (!NULL (Vexecuting_macro)) ! 743: { ! 744: if (XTYPE (Vexecuting_macro) != Lisp_String ! 745: || XSTRING (Vexecuting_macro)->size <= executing_macro_index) ! 746: return -1; ! 747: QUIT; ! 748: c = XSTRING (Vexecuting_macro)->data[executing_macro_index++]; ! 749: goto from_macro; ! 750: } ! 751: ! 752: if (commandflag >= 0 && !input_pending && !detect_input_pending ()) ! 753: DoDsp (0); ! 754: ! 755: if (commandflag != 0 ! 756: && auto_save_interval > 0 ! 757: && Keystrokes > auto_save_interval ! 758: && Keystrokes > 20 ! 759: && !input_pending && !detect_input_pending ()) ! 760: { ! 761: Fdo_auto_save (Qnil); ! 762: Keystrokes = 0; ! 763: } ! 764: ! 765: Keystrokes++; ! 766: ! 767: if (_setjmp (getcjmp)) ! 768: { ! 769: c = Ctl('g'); ! 770: waiting_for_input = 0; ! 771: input_available_clear_word = 0; ! 772: ! 773: goto non_reread; ! 774: } ! 775: ! 776: /* Message turns off echoing unless more keystrokes turn it on again. */ ! 777: if (minibuf_message && *minibuf_message && minibuf_message != echobuf) ! 778: Echo1 = 0, NextK = 0; ! 779: ! 780: /* If already echoing, continue. */ ! 781: else if (Echo1 != 0 /*|| cursor_in_echo_area*/ ) ! 782: EchoThem (1); ! 783: ! 784: /* If in middle of key sequence and minibuffer not active, ! 785: start echoing if enough time elapses. */ ! 786: else if (MinibufDepth == 0 && NextK != 0 && echo_keystrokes > 0) ! 787: { ! 788: /* Else start echoing if user waits more than `alarmtime' seconds. */ ! 789: /* This interrupt either calls EchoThem right away ! 790: or sets echo_flag, which causes EchoThem to be called ! 791: by set_waiting_for_input's next invocation. */ ! 792: signal (SIGALRM, request_echo); ! 793: echo_flag = 0; ! 794: echo_now = 0; ! 795: alarmtime = echo_keystrokes; ! 796: alarm ((unsigned) alarmtime); ! 797: } ! 798: ! 799: c = kbd_buffer_get_char (); ! 800: ! 801: non_reread: ! 802: ! 803: /* Cancel alarm if it was set and has not already gone off. */ ! 804: if (alarmtime > 0) alarm (0); ! 805: ! 806: minibuf_message = 0; ! 807: ! 808: if (c < 0) return -1; ! 809: ! 810: c &= MetaFlag ? 0377 : 0177; ! 811: ! 812: if (XTYPE (Vkeyboard_translate_table) == Lisp_String ! 813: && XSTRING (Vkeyboard_translate_table)->size > c) ! 814: c = XSTRING (Vkeyboard_translate_table)->data[c]; ! 815: ! 816: total_keys++; ! 817: recent_keys[recent_keys_index] = c; ! 818: recent_keys_index = (recent_keys_index + 1) % sizeof recent_keys; ! 819: ! 820: if (dribble) ! 821: { ! 822: putc (c, dribble); ! 823: fflush (dribble); ! 824: } ! 825: ! 826: store_kbd_macro_char (c); ! 827: ! 828: from_macro: ! 829: if (NextK < sizeof KeyBuf) ! 830: KeyBuf[NextK++] = c; ! 831: ! 832: /* If already echoing, echo right away. */ ! 833: if (Echo1 /*|| cursor_in_echo_area*/ ) ! 834: EchoThem (0); ! 835: ! 836: reread: ! 837: /* If the first character of a command is being reread, ! 838: store it in case a pause follows and it must be echoed later. ! 839: This has no effect on a non-reread character ! 840: since NextK is not zero here for them. */ ! 841: if (NextK == 0) ! 842: KeyBuf[NextK++] = c; ! 843: ! 844: last_input_char = c; ! 845: ! 846: num_input_chars++; ! 847: ! 848: /* Process the help character specially if enabled */ ! 849: if (c == help_char && !NULL (Vhelp_form)) ! 850: { ! 851: count = specpdl_ptr - specpdl; ! 852: ! 853: record_unwind_protect (Fset_window_configuration, ! 854: Fcurrent_window_configuration ()); ! 855: ! 856: tem = Feval (Vhelp_form); ! 857: if (XTYPE (tem) == Lisp_String) ! 858: internal_with_output_to_temp_buffer ("*Help*", print_help, tem); ! 859: ! 860: NextK = 0; ! 861: c = get_char (0); ! 862: /* Remove the help from the screen */ ! 863: unbind_to (count); ! 864: DoDsp (0); ! 865: if (c == 040) ! 866: { ! 867: NextK = 0; ! 868: c = get_char (0); ! 869: } ! 870: } ! 871: ! 872: return c; ! 873: } ! 874: ! 875: Lisp_Object ! 876: print_help (object) ! 877: Lisp_Object object; ! 878: { ! 879: Fprinc (object, Qnil); ! 880: return Qnil; ! 881: } ! 882: ! 883: /* Low level keyboard input. ! 884: Read characters into kbd_buffer ! 885: from which they are obtained by kbd_buffer_get_char. */ ! 886: ! 887: /* Set this for debugging, to have a way to get out */ ! 888: int stop_character; ! 889: ! 890: /* Store a character obtained at interrupt level into kbd_buffer, fifo */ ! 891: kbd_buffer_store_char (c) ! 892: register int c; ! 893: { ! 894: c &= 0377; ! 895: ! 896: if (c == Ctl ('g') ! 897: || ((c == (0200 | Ctl ('g'))) && !MetaFlag)) ! 898: { ! 899: interrupt_signal (); ! 900: return; ! 901: } ! 902: ! 903: if (c && c == stop_character) ! 904: { ! 905: sys_suspend (); ! 906: return; ! 907: } ! 908: ! 909: if (kbd_ptr != kbd_buffer) ! 910: { ! 911: bcopy (kbd_ptr, kbd_buffer, kbd_count); ! 912: kbd_ptr = kbd_buffer; ! 913: } ! 914: ! 915: if (kbd_count < sizeof kbd_buffer) ! 916: { ! 917: kbd_buffer[kbd_count++] = c; ! 918: } ! 919: } ! 920: ! 921: kbd_buffer_get_char () ! 922: { ! 923: register int c; ! 924: ! 925: if (noninteractive) ! 926: { ! 927: c = getchar (); ! 928: return c; ! 929: } ! 930: ! 931: /* Either ordinary input buffer or C-g buffered means we can return. */ ! 932: while (!kbd_count) ! 933: { ! 934: if (!NULL (Vquit_flag)) ! 935: quit_throw_to_get_char (); ! 936: ! 937: /* One way or another, wait until input is available; then, if ! 938: interrupt handlers have not read it, read it now. */ ! 939: ! 940: #ifdef VMS ! 941: set_waiting_for_input (0); ! 942: wait_for_kbd_input (); ! 943: clear_waiting_for_input (0); ! 944: #else ! 945: /* Note SIGIO has been undef'd if FIONREAD is missing. */ ! 946: #ifdef SIGIO ! 947: gobble_input (); ! 948: #endif /* SIGIO */ ! 949: if (!kbd_count) ! 950: { ! 951: #ifdef subprocesses ! 952: wait_reading_process_input (0, -1, 1); ! 953: #else ! 954: /* Note SIGIO has been undef'd if FIONREAD is missing. */ ! 955: #ifdef SIGIO ! 956: if (interrupt_input) ! 957: { ! 958: sigblockx (SIGIO); ! 959: set_waiting_for_input (0); ! 960: while (!kbd_count) ! 961: sigpausex (SIGIO); ! 962: clear_waiting_for_input (); ! 963: sigunblockx (SIGIO); ! 964: } ! 965: #else ! 966: interrupt_input = 0; ! 967: #endif /* not SIGIO */ ! 968: #endif /* subprocesses */ ! 969: ! 970: if (!interrupt_input && !kbd_count) ! 971: { ! 972: read_avail_input (0); ! 973: } ! 974: } ! 975: #endif /* not VMS */ ! 976: } ! 977: ! 978: input_pending = --kbd_count > 0; ! 979: c = *kbd_ptr; /* *kbd_ptr++ would have a timing error. */ ! 980: kbd_ptr++; /* See kbd_buffer_store_char. */ ! 981: return (c & (MetaFlag ? 0377 : 0177)); /* Clean up if sign was extended. */ ! 982: } ! 983: ! 984: /* Force an attempt to read input regardless of what FIONREAD says. */ ! 985: ! 986: force_input_read () ! 987: { ! 988: force_input = 1; ! 989: detect_input_pending (); ! 990: force_input = 0; ! 991: } ! 992: ! 993: /* Store into *addr the number of terminal input chars available. ! 994: Equivalent to ioctl (0, FIONREAD, addr) but works ! 995: even if FIONREAD does not exist. */ ! 996: ! 997: static void ! 998: get_input_pending (addr) ! 999: int *addr; ! 1000: { ! 1001: #ifdef VMS ! 1002: /* On VMS, we always have something in the buffer ! 1003: if any input is available. */ ! 1004: /*** It might be simpler to make interrupt_input 1 on VMS ***/ ! 1005: *addr = kbd_count | !NULL (Vquit_flag); ! 1006: #else ! 1007: /* First of all, have we already counted some input? */ ! 1008: *addr = kbd_count | !NULL (Vquit_flag); ! 1009: /* If input is being read as it arrives, and we have none, there is none. */ ! 1010: if (*addr > 0 || (interrupt_input && ! interrupts_deferred && ! force_input)) ! 1011: return; ! 1012: #ifdef FIONREAD ! 1013: if (! force_input) ! 1014: { ! 1015: /* If we can count the input without reading it, do so. */ ! 1016: if (ioctl (0, FIONREAD, addr) < 0) ! 1017: *addr = 0; ! 1018: if (*addr == 0 || read_socket_hook == 0) ! 1019: return; ! 1020: /* If the input consists of window-events, not all of them ! 1021: are necessarily kbd chars. So process all the input ! 1022: and see how many kbd chars we got. */ ! 1023: } ! 1024: #endif ! 1025: #ifdef SIGIO ! 1026: { ! 1027: /* It seems there is a timing error such that a SIGIO can be handled here ! 1028: and cause kbd_count to become nonzero even though raising of SIGIO ! 1029: has already been turned off. */ ! 1030: int mask = sigblock (sigmask (SIGIO)); ! 1031: if (kbd_count == 0) ! 1032: read_avail_input (*addr); ! 1033: sigsetmask (mask); ! 1034: } ! 1035: #else ! 1036: /* If we can't count the input, read it (if any) and see what we got. */ ! 1037: read_avail_input (*addr); ! 1038: #endif ! 1039: *addr = kbd_count; ! 1040: #endif ! 1041: } ! 1042: ! 1043: /* Read any terminal input already buffered up by the system ! 1044: into the kbd_buffer, assuming the buffer is currently empty. ! 1045: Never waits. We assume that kbd_buffer is empty before you call. ! 1046: ! 1047: If NREAD is nonzero, assume it contains # chars of raw data waiting. ! 1048: If it is zero, we determine that datum. ! 1049: ! 1050: Input gets into the kbd_buffer either through this function ! 1051: (at main program level) or at interrupt level if input ! 1052: is interrupt-driven. */ ! 1053: ! 1054: static void ! 1055: read_avail_input (nread) ! 1056: int nread; ! 1057: { ! 1058: /* This function is not used on VMS. */ ! 1059: #ifndef VMS ! 1060: #ifdef FIONREAD ! 1061: char buf[256 * BUFFER_SIZE_FACTOR]; ! 1062: register char *p; ! 1063: register int i; ! 1064: ! 1065: if (kbd_count) ! 1066: abort (); ! 1067: ! 1068: if (! force_input) ! 1069: { ! 1070: if (nread == 0) ! 1071: get_input_pending (&nread); ! 1072: if (nread == 0) ! 1073: return; ! 1074: } ! 1075: if (nread > sizeof buf) ! 1076: nread = sizeof buf; ! 1077: ! 1078: /* Read what is waiting. */ ! 1079: if (read_socket_hook) ! 1080: nread = (*read_socket_hook) (0, buf, nread); ! 1081: else ! 1082: nread = read (0, buf, nread); ! 1083: ! 1084: /* Scan the chars for C-g and store them in kbd_buffer. */ ! 1085: kbd_ptr = kbd_buffer; ! 1086: for (i = 0; i < nread; i++) ! 1087: { ! 1088: kbd_buffer_store_char (buf[i]); ! 1089: /* Don't look at input that follows a C-g too closely. ! 1090: This reduces lossage due to autorepeat on C-g. */ ! 1091: if (buf[i] == Ctl ('G')) ! 1092: break; ! 1093: } ! 1094: ! 1095: #else /* no FIONREAD */ ! 1096: #ifdef USG ! 1097: if (kbd_count) ! 1098: abort (); ! 1099: ! 1100: fcntl (fileno (stdin), F_SETFL, O_NDELAY); ! 1101: kbd_ptr = kbd_buffer; ! 1102: if (read_socket_hook) ! 1103: { ! 1104: kbd_count = (*read_socket_hook) (0, kbd_buffer, sizeof kbd_buffer); ! 1105: } ! 1106: else ! 1107: { ! 1108: kbd_count = read (fileno (stdin), kbd_buffer, sizeof kbd_buffer); ! 1109: } ! 1110: #ifdef EBADSLT ! 1111: if (kbd_count == -1 && (errno == EAGAIN || errno == EBADSLT)) ! 1112: #else ! 1113: if (kbd_count == -1 && errno == EAGAIN) ! 1114: #endif ! 1115: kbd_count = 0; ! 1116: fcntl (fileno (stdin), F_SETFL, 0); ! 1117: #else /* not USG */ ! 1118: you lose ! 1119: #endif /* not USG */ ! 1120: #endif /* no FIONREAD */ ! 1121: #endif /* not VMS */ ! 1122: } ! 1123: ! 1124: #ifdef SIGIO /* for entire page */ ! 1125: /* Note SIGIO has been undef'd if FIONREAD is missing. */ ! 1126: ! 1127: /* If using interrupt input and some input chars snuck into the ! 1128: buffer before we enabled interrupts, fake an interrupt for them. */ ! 1129: ! 1130: gobble_input () ! 1131: { ! 1132: int nread; ! 1133: if (interrupt_input) ! 1134: { ! 1135: if (ioctl (0, FIONREAD, &nread) < 0) ! 1136: nread = 0; ! 1137: if (nread) ! 1138: { ! 1139: sigholdx (SIGIO); ! 1140: input_available_signal (SIGIO); ! 1141: sigfree (); ! 1142: } ! 1143: } ! 1144: } ! 1145: ! 1146: input_available_signal (signo) ! 1147: int signo; ! 1148: { ! 1149: unsigned char buf[256 * BUFFER_SIZE_FACTOR]; ! 1150: int nread; ! 1151: register int i; ! 1152: /* Must preserve main program's value of errno. */ ! 1153: int old_errno = errno; ! 1154: #ifdef BSD4_1 ! 1155: extern int select_alarmed; ! 1156: #endif ! 1157: ! 1158: #ifdef USG ! 1159: /* USG systems forget handlers when they are used; ! 1160: must reestablish each time */ ! 1161: signal (signo, input_available_signal); ! 1162: #endif /* USG */ ! 1163: ! 1164: #ifdef BSD4_1 ! 1165: sigisheld (SIGIO); ! 1166: #endif ! 1167: ! 1168: if (input_available_clear_word) ! 1169: *input_available_clear_word = 0; ! 1170: ! 1171: while (1) ! 1172: { ! 1173: if (ioctl (0, FIONREAD, &nread) < 0) ! 1174: nread = 0; ! 1175: if (nread <= 0) ! 1176: break; ! 1177: #ifdef BSD4_1 ! 1178: select_alarmed = 1; /* Force the select emulator back to life */ ! 1179: #endif ! 1180: if (read_socket_hook) ! 1181: { ! 1182: nread = (*read_socket_hook) (0, buf, sizeof buf); ! 1183: if (!nread) ! 1184: continue; ! 1185: } ! 1186: else ! 1187: { ! 1188: if (nread > sizeof buf) ! 1189: nread = sizeof buf; ! 1190: nread = read (0, buf, nread); ! 1191: } ! 1192: ! 1193: for (i = 0; i < nread; i++) ! 1194: { ! 1195: kbd_buffer_store_char (buf[i]); ! 1196: /* Don't look at input that follows a C-g too closely. ! 1197: This reduces lossage due to autorepeat on C-g. */ ! 1198: if (buf[i] == Ctl('G')) ! 1199: break; ! 1200: } ! 1201: } ! 1202: #ifdef BSD4_1 ! 1203: sigfree (); ! 1204: #endif ! 1205: errno = old_errno; ! 1206: } ! 1207: #endif /* SIGIO */ ! 1208: ! 1209: #if 0 ! 1210: /* This is turned off because it didn't produce much speedup. */ ! 1211: ! 1212: /* Read a single-char key sequence. Do not redisplay. ! 1213: Return 1 if successful, or 0 if what follows is not ! 1214: a single-char key. (In that case, a char has been unread.) ! 1215: This is used instead of read_key_sequence as an optimization ! 1216: just after a direct-updating command is done, since at such ! 1217: times we know that no redisplay is required. */ ! 1218: ! 1219: int ! 1220: fast_read_one_key (keybuf) ! 1221: char *keybuf; ! 1222: { ! 1223: register Lisp_Object map; ! 1224: register int c; ! 1225: register Lisp_Object tem; ! 1226: ! 1227: keys_prompt = 0; ! 1228: /* Read a character, and do not redisplay. */ ! 1229: c = get_char (-1); ! 1230: Vquit_flag = Qnil; ! 1231: ! 1232: /* Assume until further notice that we are unlucky ! 1233: and will return zero, so this char will be ! 1234: reread by read_key_sequence. */ ! 1235: ! 1236: unread_command_char = c; ! 1237: ! 1238: if (c < 0 || c >= 0200) ! 1239: return 0; ! 1240: ! 1241: map = bf_cur->keymap; ! 1242: if (!EQ (map, Qnil)) ! 1243: { ! 1244: tem = get_keyelt (access_keymap (map, c)); ! 1245: if (!EQ (tem, Qnil)) ! 1246: return 0; ! 1247: } ! 1248: ! 1249: XSET (map, Lisp_Vector, CurrentGlobalMap); ! 1250: tem = !NULL (map) ! 1251: ? get_keyelt (access_keymap (map, c)) ! 1252: : Qnil; ! 1253: ! 1254: read_key_sequence_cmd = tem; ! 1255: ! 1256: /* trace symbols to their function definitions */ ! 1257: ! 1258: while (XTYPE (tem) == Lisp_Symbol && !NULL (tem) ! 1259: && !EQ (tem, Qunbound)) ! 1260: tem = XSYMBOL (tem)->function; ! 1261: ! 1262: /* Is the definition a prefix character? */ ! 1263: ! 1264: if (XTYPE (tem) == Lisp_Vector || ! 1265: (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))) ! 1266: return 0; ! 1267: ! 1268: unread_command_char = -1; ! 1269: keybuf[0] = c; ! 1270: return 1; ! 1271: } ! 1272: ! 1273: #endif /* 0 */ ! 1274: ! 1275: /* Read a sequence of keys that ends with a non prefix character, ! 1276: and store them in KEYBUF, a buffer of size BUFSIZE. ! 1277: Prompt with PROMPT. Echo starting immediately unless `prompt' is 0. ! 1278: Return the length of the key sequence stored. ! 1279: NODISPLAY nonzero means don't do redisplay before the first character ! 1280: (just for speedup). */ ! 1281: ! 1282: int ! 1283: read_key_sequence (keybuf, bufsize, prompt, nodisplay) ! 1284: char *keybuf; ! 1285: int bufsize; ! 1286: unsigned char *prompt; ! 1287: int nodisplay; ! 1288: { ! 1289: register int i; ! 1290: Lisp_Object nextlocal, nextglobal; ! 1291: register int c, nextc; ! 1292: Lisp_Object local, global; ! 1293: ! 1294: keys_prompt = prompt; ! 1295: ! 1296: if (prompt) ! 1297: NextK = 0; ! 1298: if ((prompt || cursor_in_echo_area) && INTERACTIVE) ! 1299: EchoThem (1); ! 1300: ! 1301: nextc = get_char (nodisplay ? -1 : !prompt); ! 1302: nextlocal = bf_cur->keymap; ! 1303: XSET (nextglobal, Lisp_Vector, CurrentGlobalMap); ! 1304: ! 1305: i = 0; ! 1306: while (!NULL (nextlocal) || !NULL (nextglobal)) ! 1307: { ! 1308: if (i == bufsize) ! 1309: error ("key sequence too long"); ! 1310: ! 1311: if (nextc >= 0) ! 1312: { ! 1313: c = nextc; ! 1314: nextc = -1; ! 1315: } ! 1316: else ! 1317: c = get_char (!prompt); ! 1318: Vquit_flag = Qnil; ! 1319: nodisplay = 0; ! 1320: ! 1321: if (c < 0) ! 1322: return 0; ! 1323: if (c >= 0200) ! 1324: { ! 1325: nextc = c & 0177; ! 1326: c = meta_prefix_char; ! 1327: } ! 1328: ! 1329: keybuf[i] = c; ! 1330: ! 1331: global = !NULL (nextglobal) ! 1332: ? get_keyelt (access_keymap (nextglobal, c)) ! 1333: : Qnil; ! 1334: ! 1335: local = !NULL (nextlocal) ! 1336: ? get_keyelt (access_keymap (nextlocal, c)) ! 1337: : Qnil; ! 1338: ! 1339: /* If C is not defined in either keymap ! 1340: and it is an uppercase letter, try corresponding lowercase. */ ! 1341: ! 1342: if (NULL (global) && NULL (local) && UPPERCASEP (c)) ! 1343: { ! 1344: global = !NULL (nextglobal) ! 1345: ? get_keyelt (access_keymap (nextglobal, DOWNCASE (c))) ! 1346: : Qnil; ! 1347: ! 1348: local = !NULL (nextlocal) ! 1349: ? get_keyelt (access_keymap (nextlocal, DOWNCASE (c))) ! 1350: : Qnil; ! 1351: ! 1352: /* If that has worked better that the original char, ! 1353: downcase it permanently. */ ! 1354: ! 1355: if (!NULL (global) || !NULL (local)) ! 1356: { ! 1357: keybuf[i] = c = DOWNCASE (c); ! 1358: } ! 1359: } ! 1360: ! 1361: i++; ! 1362: ! 1363: nextlocal = Qnil; ! 1364: nextglobal = Qnil; ! 1365: ! 1366: read_key_sequence_cmd = !NULL (local) ? local : global; ! 1367: ! 1368: /* trace symbols to their function definitions */ ! 1369: ! 1370: while (XTYPE (global) == Lisp_Symbol && !NULL (global) ! 1371: && !EQ (global, Qunbound)) ! 1372: global = XSYMBOL (global)->function; ! 1373: while (XTYPE (local) == Lisp_Symbol && !NULL (local) ! 1374: && !EQ (local, Qunbound)) ! 1375: local = XSYMBOL (local)->function; ! 1376: ! 1377: /* Are the definitions prefix characters? */ ! 1378: ! 1379: if (XTYPE (local) == Lisp_Vector || ! 1380: (CONSP (local) && EQ (XCONS (local)->car, Qkeymap)) ! 1381: || ! 1382: /* If nextc is set, we are processing a prefix char ! 1383: that represents a meta-bit. ! 1384: Let a global prefix definition override a local non-prefix. ! 1385: This is for minibuffers that redefine Escape for completion. ! 1386: A real Escape gets completion, but Meta bits get ESC-prefix. */ ! 1387: ((NULL (local) || nextc >= 0) ! 1388: && (XTYPE (global) == Lisp_Vector || ! 1389: (CONSP (global) && EQ (XCONS (global)->car, Qkeymap))))) ! 1390: { ! 1391: if (XTYPE (local) == Lisp_Vector || ! 1392: (CONSP (local) && EQ (XCONS (local)->car, Qkeymap))) ! 1393: nextlocal = local; ! 1394: else ! 1395: nextlocal = Qnil; ! 1396: ! 1397: if (XTYPE (global) == Lisp_Vector || ! 1398: (CONSP (global) && EQ (XCONS (global)->car, Qkeymap))) ! 1399: nextglobal = global; ! 1400: else ! 1401: nextglobal = Qnil; ! 1402: } ! 1403: } ! 1404: ! 1405: keys_prompt = 0; ! 1406: return i; ! 1407: } ! 1408: ! 1409: DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 1, 0, ! 1410: "Read a sequence of keystrokes and return as a string.\n\ ! 1411: The sequence is sufficient to specify a non-prefix command\n\ ! 1412: starting from the current local and global keymaps.\n\ ! 1413: A C-g typed while in this function is treated like\n\ ! 1414: any other character, and quit-flag is not set.\n\ ! 1415: One arg, PROMPT, a prompt string or nil, meaning do not prompt specially.") ! 1416: (prompt) ! 1417: Lisp_Object prompt; ! 1418: { ! 1419: char keybuf[30]; ! 1420: register int i; ! 1421: ! 1422: if (!NULL (prompt)) ! 1423: CHECK_STRING (prompt, 0); ! 1424: QUIT; ! 1425: i = read_key_sequence (keybuf, sizeof keybuf, ! 1426: (NULL (prompt)) ? 0 : XSTRING (prompt)->data, ! 1427: 0); ! 1428: return make_string (keybuf, i); ! 1429: } ! 1430: ! 1431: DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 2, 0, ! 1432: "Execute CMD as an editor command.\n\ ! 1433: CMD must be a symbol that satisfies the `commandp' predicate.\n\ ! 1434: Optional second arg RECORD-FLAG non-nil\n\ ! 1435: means unconditionally put this command in the command-history.\n\ ! 1436: Otherwise, this is done only if an arg is read using the minibuffer.") ! 1437: (cmd, record) ! 1438: Lisp_Object cmd, record; ! 1439: { ! 1440: register Lisp_Object final; ! 1441: register Lisp_Object tem; ! 1442: Lisp_Object prefixarg; ! 1443: struct backtrace backtrace; ! 1444: extern int debug_on_next_call; ! 1445: ! 1446: prefixarg = Vprefix_arg, Vprefix_arg = Qnil; ! 1447: Vcurrent_prefix_arg = prefixarg; ! 1448: debug_on_next_call = 0; ! 1449: ! 1450: if (XTYPE (cmd) == Lisp_Symbol) ! 1451: { ! 1452: tem = Fget (cmd, Qdisabled); ! 1453: if (!NULL (tem)) ! 1454: return call0 (Vdisabled_command_hook); ! 1455: } ! 1456: ! 1457: while (1) ! 1458: { ! 1459: final = cmd; ! 1460: while (XTYPE (final) == Lisp_Symbol) ! 1461: { ! 1462: if (EQ (Qunbound, XSYMBOL (final)->function)) ! 1463: Fsymbol_function (final); /* Get an error! */ ! 1464: final = XSYMBOL (final)->function; ! 1465: } ! 1466: ! 1467: if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload))) ! 1468: do_autoload (final, cmd); ! 1469: else ! 1470: break; ! 1471: } ! 1472: ! 1473: if (CONSP (final) || XTYPE (final) == Lisp_Subr) ! 1474: { ! 1475: backtrace.next = backtrace_list; ! 1476: backtrace_list = &backtrace; ! 1477: backtrace.function = &Qcall_interactively; ! 1478: backtrace.args = &cmd; ! 1479: backtrace.nargs = 1; ! 1480: backtrace.evalargs = 0; ! 1481: ! 1482: tem = Fcall_interactively (cmd, record); ! 1483: ! 1484: backtrace_list = backtrace.next; ! 1485: return tem; ! 1486: } ! 1487: if (XTYPE (final) == Lisp_String) ! 1488: { ! 1489: return Fexecute_kbd_macro (final, prefixarg); ! 1490: } ! 1491: return Qnil; ! 1492: } ! 1493: ! 1494: DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command, ! 1495: 1, 1, "P", ! 1496: "Read function name, then read its arguments and call it.") ! 1497: (prefixarg) ! 1498: Lisp_Object prefixarg; ! 1499: { ! 1500: Lisp_Object function; ! 1501: char buf[40]; ! 1502: char saved_keys[40]; ! 1503: int saved_keys_len = min (NextK, sizeof (saved_keys)); ! 1504: ! 1505: bcopy (KeyBuf, saved_keys, saved_keys_len); ! 1506: ! 1507: buf[0] = 0; ! 1508: ! 1509: if (EQ (prefixarg, Qminus)) ! 1510: strcpy (buf, "- "); ! 1511: else if (CONSP (prefixarg) && XINT (XCONS (prefixarg)->car) == 4) ! 1512: strcpy (buf, "C-u "); ! 1513: else if (CONSP (prefixarg) && XTYPE (XCONS (prefixarg)->car) == Lisp_Int) ! 1514: sprintf (buf, "%d ", XINT (XCONS (prefixarg)->car)); ! 1515: else if (XTYPE (prefixarg) == Lisp_Int) ! 1516: sprintf (buf, "%d ", XINT (prefixarg)); ! 1517: ! 1518: /* This isn't strictly correct if execute-extended-command ! 1519: is bound to anything else */ ! 1520: strcat (buf, "M-x "); ! 1521: ! 1522: function = Fcompleting_read (build_string (buf), Vobarray, Qcommandp, Qt, Qnil); ! 1523: ! 1524: saved_keys_len = min (saved_keys_len, sizeof (KeyBuf)); ! 1525: bcopy (saved_keys, KeyBuf, saved_keys_len); ! 1526: if (saved_keys_len >= sizeof (KeyBuf)) ! 1527: NextK = sizeof (KeyBuf); ! 1528: else ! 1529: { ! 1530: int l = XSTRING (function)->size; ! 1531: l = min (sizeof (KeyBuf) - saved_keys_len, l); ! 1532: bcopy (XSTRING (function)->data, KeyBuf + saved_keys_len, l); ! 1533: NextK = saved_keys_len + l; ! 1534: } ! 1535: ! 1536: function = Fintern (function, Vobarray); ! 1537: Vprefix_arg = prefixarg; ! 1538: this_command = function; ! 1539: ! 1540: return Fcommand_execute (function, Qt); ! 1541: } ! 1542: ! 1543: ! 1544: detect_input_pending () ! 1545: { ! 1546: if (!input_pending) ! 1547: get_input_pending (&input_pending); ! 1548: ! 1549: return input_pending; ! 1550: } ! 1551: ! 1552: DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0, ! 1553: "T if command input is currently available with no waiting.\n\ ! 1554: Actually, the value is NIL only if we can be sure that no input is available.") ! 1555: () ! 1556: { ! 1557: if (unread_command_char >= 0) return Qt; ! 1558: ! 1559: return detect_input_pending () ? Qt : Qnil; ! 1560: } ! 1561: ! 1562: DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0, ! 1563: "Return string of last 100 chars read from terminal.") ! 1564: () ! 1565: { ! 1566: Lisp_Object val; ! 1567: if (total_keys < sizeof recent_keys) ! 1568: return make_string (recent_keys, total_keys); ! 1569: ! 1570: val = make_string (recent_keys, sizeof recent_keys); ! 1571: bcopy (recent_keys + recent_keys_index, ! 1572: XSTRING (val)->data, ! 1573: sizeof recent_keys - recent_keys_index); ! 1574: bcopy (recent_keys, ! 1575: XSTRING (val)->data + sizeof recent_keys - recent_keys_index, ! 1576: recent_keys_index); ! 1577: return val; ! 1578: } ! 1579: ! 1580: DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0, ! 1581: "Return string of the keystrokes that invoked this command.") ! 1582: () ! 1583: { ! 1584: return make_string (KeyBuf, NextK); ! 1585: } ! 1586: ! 1587: DEFSIMPLE ("recursion-depth", Frecursion_depth, Srecursion_depth, ! 1588: "Return the current depth in recursive edits.", ! 1589: Lisp_Int, XSETINT, RecurseDepth) ! 1590: ! 1591: DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1, ! 1592: "FOpen dribble file: ", ! 1593: "Start writing all keyboard characters to FILE.") ! 1594: (file) ! 1595: Lisp_Object file; ! 1596: { ! 1597: file = Fexpand_file_name (file, Qnil); ! 1598: dribble = fopen (XSTRING (file)->data, "w"); ! 1599: return Qnil; ! 1600: } ! 1601: ! 1602: DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0, ! 1603: "Discard the contents of the terminal input buffer.\n\ ! 1604: Also flush any kbd macro definition in progress.") ! 1605: () ! 1606: { ! 1607: defining_kbd_macro = 0; ! 1608: RedoModes++; ! 1609: ! 1610: unread_command_char = -1; ! 1611: discard_tty_input (); ! 1612: ! 1613: kbd_count = 0; ! 1614: input_pending = 0; ! 1615: ! 1616: return Qnil; ! 1617: } ! 1618: ! 1619: DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "", ! 1620: "Stop Emacs and return to superior process. You can resume.\n\ ! 1621: If optional arg STUFFSTRING is non-nil, its characters are stuffed\n\ ! 1622: to be read as terminal input by Emacs's superior shell.\n\ ! 1623: Before suspending, if `suspend-hook' is bound and value is non-nil\n\ ! 1624: call the value as a function of no args. Don't suspend if it returns non-nil.\n\ ! 1625: Otherwise, suspend normally and after resumption call\n\ ! 1626: `suspend-resume-hook' if that is bound and non-nil.") ! 1627: (stuffstring) ! 1628: Lisp_Object stuffstring; ! 1629: { ! 1630: register Lisp_Object tem; ! 1631: int count = specpdl_ptr - specpdl; ! 1632: extern init_sys_modes (); ! 1633: ! 1634: if (!NULL (stuffstring)) ! 1635: CHECK_STRING (stuffstring, 0); ! 1636: ! 1637: /* Call value of suspend-hook ! 1638: if it is bound and value is non-nil. */ ! 1639: tem = intern ("suspend-hook"); ! 1640: tem = XSYMBOL (tem)->value; ! 1641: if (! EQ (tem, Qunbound) && ! EQ (tem, Qnil)) ! 1642: { ! 1643: tem = call0 (tem); ! 1644: if (!EQ (tem, Qnil)) return Qnil; ! 1645: } ! 1646: ! 1647: reset_sys_modes (); ! 1648: /* sys_suspend can get an error if it tries to fork a subshell ! 1649: and the system resources aren't available for that. */ ! 1650: record_unwind_protect (init_sys_modes, 0); ! 1651: stuff_buffered_input (stuffstring); ! 1652: sys_suspend (); ! 1653: unbind_to (count); ! 1654: ! 1655: /* Call value of suspend-resume-hook ! 1656: if it is bound and value is non-nil. */ ! 1657: tem = intern ("suspend-resume-hook"); ! 1658: tem = XSYMBOL (tem)->value; ! 1659: if (! EQ (tem, Qunbound) && ! EQ (tem, Qnil)) ! 1660: call0 (tem); ! 1661: return Qnil; ! 1662: } ! 1663: ! 1664: /* If STUFFSTRING is a string, stuff its contents as pending terminal input. ! 1665: Then in any case stuff anthing Emacs has read ahead and not used. */ ! 1666: ! 1667: stuff_buffered_input (stuffstring) ! 1668: Lisp_Object stuffstring; ! 1669: { ! 1670: register unsigned char *p; ! 1671: ! 1672: /* stuff_char works only in BSD, versions 4.2 and up. */ ! 1673: #ifdef BSD ! 1674: #ifndef BSD4_1 ! 1675: if (XTYPE (stuffstring) == Lisp_String) ! 1676: { ! 1677: register int count; ! 1678: ! 1679: p = XSTRING (stuffstring)->data; ! 1680: count = XSTRING (stuffstring)->size; ! 1681: while (count-- > 0) ! 1682: stuff_char (*p++); ! 1683: stuff_char ('\n'); ! 1684: } ! 1685: /* Anything we have read ahead, put back for the shell to read. */ ! 1686: while (kbd_count) ! 1687: { ! 1688: stuff_char (*kbd_ptr++); ! 1689: kbd_count--; ! 1690: } ! 1691: input_pending = 0; ! 1692: #endif ! 1693: #endif /* BSD and not BSD4_1 */ ! 1694: } ! 1695: ! 1696: set_waiting_for_input (word_to_clear) ! 1697: long *word_to_clear; ! 1698: { ! 1699: input_available_clear_word = word_to_clear; ! 1700: ! 1701: /* Tell interrupt_signal to throw back to get_char, */ ! 1702: waiting_for_input = 1; ! 1703: ! 1704: /* If interrupt_signal was called before and buffered a C-g, ! 1705: make it run again now, to avoid timing error. */ ! 1706: if (!NULL (Vquit_flag)) ! 1707: quit_throw_to_get_char (); ! 1708: ! 1709: /* Tell alarm signal to echo right away */ ! 1710: echo_now = 1; ! 1711: ! 1712: /* If alarm has gone off already, echo now. */ ! 1713: if (echo_flag) ! 1714: { ! 1715: EchoThem (1); ! 1716: echo_flag = 0; ! 1717: } ! 1718: } ! 1719: ! 1720: clear_waiting_for_input () ! 1721: { ! 1722: /* Tell interrupt_signal not to throw back to get_char, */ ! 1723: waiting_for_input = 0; ! 1724: echo_now = 0; ! 1725: input_available_clear_word = 0; ! 1726: } ! 1727: ! 1728: /* This routine is called at interrupt level in response to C-G. ! 1729: If interrupt_input, this is the handler for SIGINT. ! 1730: Otherwise, it is called from kbd_buffer_store_char, ! 1731: in handling SIGIO or SIGTINT. ! 1732: ! 1733: If `waiting_for_input' is non zero, then unless `echoing' is nonzero, ! 1734: immediately throw back to get_char. ! 1735: ! 1736: Otherwise it sets the Lisp variable quit-flag not-nil. ! 1737: This causes eval to throw, when it gets a chance. ! 1738: If quit-flag is already non-nil, it stops the job right away. */ ! 1739: ! 1740: interrupt_signal () ! 1741: { ! 1742: char c; ! 1743: /* Must preserve main program's value of errno. */ ! 1744: int old_errno = errno; ! 1745: extern Lisp_Object Vwindow_system; ! 1746: ! 1747: #ifdef USG ! 1748: /* USG systems forget handlers when they are used; ! 1749: must reestablish each time */ ! 1750: signal (SIGINT, interrupt_signal); ! 1751: signal (SIGQUIT, interrupt_signal); ! 1752: #endif /* USG */ ! 1753: ! 1754: Echo1 = 0; ! 1755: ! 1756: if (!NULL (Vquit_flag) && NULL (Vwindow_system)) ! 1757: { ! 1758: fflush (stdout); ! 1759: reset_sys_modes (); ! 1760: sigfree (); ! 1761: #ifdef SIGTSTP /* Support possible in later USG versions */ ! 1762: /* ! 1763: * On systems which can suspend the current process and return to the original ! 1764: * shell, this command causes the user to end up back at the shell. ! 1765: * The "Auto-save" and "Abort" questions are not asked until ! 1766: * the user elects to return to emacs, at which point he can save the current ! 1767: * job and either dump core or continue. ! 1768: */ ! 1769: sys_suspend (); ! 1770: #else ! 1771: #ifdef VMS ! 1772: if (sys_suspend () == -1) ! 1773: { ! 1774: printf ("Not running as a subprocess;\n"); ! 1775: printf ("you can continue or abort.\n"); ! 1776: } ! 1777: #else /* not VMS */ ! 1778: /* Perhaps should really fork an inferior shell? ! 1779: But that would not provide any way to get back ! 1780: to the original shell, ever. */ ! 1781: printf ("No support for stopping a process on this operating system;\n"); ! 1782: printf ("you can continue or abort.\n"); ! 1783: #endif /* not VMS */ ! 1784: #endif /* not SIGTSTP */ ! 1785: printf ("Auto-save? (y or n) "); ! 1786: fflush (stdout); ! 1787: if (((c = getchar ()) & ~040) == 'Y') ! 1788: Fdo_auto_save (Qnil); ! 1789: while (c != '\n') c = getchar (); ! 1790: #ifdef VMS ! 1791: printf ("Abort (and enter debugger)? (y or n) "); ! 1792: #else /* not VMS */ ! 1793: printf ("Abort (and dump core)? (y or n) "); ! 1794: #endif /* not VMS */ ! 1795: fflush (stdout); ! 1796: if (((c = getchar ()) & ~040) == 'Y') ! 1797: abort (); ! 1798: while (c != '\n') c = getchar (); ! 1799: printf ("Continuing...\n"); ! 1800: fflush (stdout); ! 1801: init_sys_modes (); ! 1802: } ! 1803: else ! 1804: { ! 1805: /* If executing a function that wants to be interrupted out of ! 1806: and the user has not deferred quitting by binding `inhibit-quit' ! 1807: then quit right away. */ ! 1808: if (immediate_quit && NULL (Vinhibit_quit)) ! 1809: { ! 1810: immediate_quit = 0; ! 1811: sigfree (); ! 1812: Fsignal (Qquit, Qnil); ! 1813: } ! 1814: else ! 1815: /* Else request quit when it's safe */ ! 1816: Vquit_flag = Qt; ! 1817: } ! 1818: ! 1819: if (waiting_for_input && !echoing) ! 1820: quit_throw_to_get_char (); ! 1821: ! 1822: errno = old_errno; ! 1823: } ! 1824: ! 1825: /* Handle a C-g by making get_char return C-g. */ ! 1826: ! 1827: quit_throw_to_get_char () ! 1828: { ! 1829: quit_error_check (); ! 1830: sigfree (); ! 1831: /* Prevent another signal from doing this before we finish. */ ! 1832: waiting_for_input = 0; ! 1833: input_pending = 0; ! 1834: unread_command_char = -1; ! 1835: _longjmp (getcjmp, 1); ! 1836: } ! 1837: ! 1838: DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 2, 2, 0, ! 1839: "Set mode of reading keyboard input.\n\ ! 1840: First arg non-nil means use input interrupts; nil means use CBREAK mode.\n\ ! 1841: Second arg non-nil means use ^S/^Q flow control for output to terminal\n\ ! 1842: (no effect except in CBREAK mode).") ! 1843: (interrupt, flow) ! 1844: Lisp_Object interrupt, flow; ! 1845: { ! 1846: reset_sys_modes (); ! 1847: #ifdef SIGIO ! 1848: /* Note SIGIO has been undef'd if FIONREAD is missing. */ ! 1849: interrupt_input = !NULL (interrupt); ! 1850: #else /* not SIGIO */ ! 1851: interrupt_input = 0; ! 1852: #endif /* not SIGIO */ ! 1853: flow_control = !NULL (flow); ! 1854: init_sys_modes (); ! 1855: return Qnil; ! 1856: } ! 1857: ! 1858: init_keyboard () ! 1859: { ! 1860: RecurseDepth = -1; /* Correct, before outermost invocation of editor loop */ ! 1861: keys_prompt = 0; ! 1862: immediate_quit = 0; ! 1863: unread_command_char = -1; ! 1864: recent_keys_index = 0; ! 1865: total_keys = 0; ! 1866: kbd_count = 0; ! 1867: kbd_ptr = kbd_buffer; ! 1868: input_pending = 0; ! 1869: force_input = 0; ! 1870: if (!noninteractive) ! 1871: { ! 1872: signal (SIGINT, interrupt_signal); ! 1873: #ifdef USG ! 1874: /* On USG systems, C-g is set up for both SIGINT and SIGQUIT ! 1875: and we can't tell which one it will give us. */ ! 1876: signal (SIGQUIT, interrupt_signal); ! 1877: #endif /* USG */ ! 1878: /* Note SIGIO has been undef'd if FIONREAD is missing. */ ! 1879: #ifdef SIGIO ! 1880: signal (SIGIO, input_available_signal); ! 1881: #endif SIGIO ! 1882: } ! 1883: ! 1884: /* Use interrupt input by default, if it works and noninterrupt input ! 1885: has deficiencies. */ ! 1886: ! 1887: #ifdef INTERRUPT_INPUT ! 1888: interrupt_input = 1; ! 1889: #else ! 1890: interrupt_input = 0; ! 1891: #endif ! 1892: ! 1893: sigfree (); ! 1894: dribble = 0; ! 1895: ! 1896: if (keyboard_init_hook) ! 1897: (*keyboard_init_hook) (); ! 1898: } ! 1899: ! 1900: syms_of_keyboard () ! 1901: { ! 1902: Qself_insert_command = intern ("self-insert-command"); ! 1903: staticpro (&Qself_insert_command); ! 1904: ! 1905: Qforward_char = intern ("forward-char"); ! 1906: staticpro (&Qforward_char); ! 1907: ! 1908: Qbackward_char = intern ("backward-char"); ! 1909: staticpro (&Qbackward_char); ! 1910: ! 1911: Qtop_level = intern ("top-level"); ! 1912: staticpro (&Qtop_level); ! 1913: ! 1914: Qdisabled = intern ("disabled"); ! 1915: staticpro (&Qdisabled); ! 1916: ! 1917: defsubr (&Sread_key_sequence); ! 1918: defsubr (&Srecursive_edit); ! 1919: defsubr (&Sinput_pending_p); ! 1920: defsubr (&Scommand_execute); ! 1921: defsubr (&Srecent_keys); ! 1922: defsubr (&Sthis_command_keys); ! 1923: defsubr (&Ssuspend_emacs); ! 1924: defsubr (&Sabort_recursive_edit); ! 1925: defsubr (&Sexit_recursive_edit); ! 1926: defsubr (&Srecursion_depth); ! 1927: defsubr (&Stop_level); ! 1928: defsubr (&Sdiscard_input); ! 1929: defsubr (&Sopen_dribble_file); ! 1930: defsubr (&Sset_input_mode); ! 1931: defsubr (&Sexecute_extended_command); ! 1932: ! 1933: DEFVAR_LISP ("disabled-command-hook", &Vdisabled_command_hook, ! 1934: "Value is called instead of any command that is disabled\n\ ! 1935: \(has a non-nil disabled property)."); ! 1936: ! 1937: DEFVAR_BOOL ("meta-flag", &MetaFlag, ! 1938: "*Non-nil means treat 0200 bit in terminal input as Meta bit."); ! 1939: ! 1940: DEFVAR_INT ("last-command-char", &last_command_char, ! 1941: "Last terminal input character that was part of a command, as an integer."); ! 1942: ! 1943: DEFVAR_INT ("last-input-char", &last_input_char, ! 1944: "Last terminal input character, as an integer."); ! 1945: ! 1946: DEFVAR_INT ("unread-command-char", &unread_command_char, ! 1947: "Character to be read as next input from command input stream, or -1 if none."); ! 1948: ! 1949: DEFVAR_INT ("meta-prefix-char", &meta_prefix_char, ! 1950: "Meta-prefix character code. Meta-foo as command input\n\ ! 1951: turns into this character followed by foo."); ! 1952: meta_prefix_char = 033; ! 1953: ! 1954: DEFVAR_LISP ("last-command", &last_command, ! 1955: "The last command executed. Normally a symbol with a function definition,\n\ ! 1956: but can be whatever was found in the keymap, or whatever the variable\n\ ! 1957: `this-command' was set to by that command."); ! 1958: last_command = Qnil; ! 1959: ! 1960: DEFVAR_LISP ("this-command", &this_command, ! 1961: "The command now being executed.\n\ ! 1962: The command can set this variable; whatever is put here\n\ ! 1963: will be in last-command during the following command."); ! 1964: this_command = Qnil; ! 1965: ! 1966: DEFVAR_INT ("auto-save-interval", &auto_save_interval, ! 1967: "*Number of keyboard input characters between auto-saves.\n\ ! 1968: Zero means disable autosaving."); ! 1969: auto_save_interval = 300; ! 1970: ! 1971: DEFVAR_INT ("echo-keystrokes", &echo_keystrokes, ! 1972: "*Nonzero means echo unfinished commands after this many seconds of pause."); ! 1973: echo_keystrokes = 1; ! 1974: ! 1975: DEFVAR_INT ("help-char", &help_char, ! 1976: "Character to recognize as meaning Help.\n\ ! 1977: When it is read, do (eval help-form), and display result if it's a string.\n\ ! 1978: If help-form's value is nil, this char can be read normally."); ! 1979: help_char = Ctl ('H'); ! 1980: ! 1981: DEFVAR_LISP ("help-form", &Vhelp_form, ! 1982: "Form to execute when character help-char is read.\n\ ! 1983: If the form returns a string, that string is displayed.\n\ ! 1984: If help-form is nil, the help char is not recognized."); ! 1985: Vhelp_form = Qnil; ! 1986: ! 1987: DEFVAR_LISP ("top-level", &Vtop_level, ! 1988: "Form to evaluate when Emacs starts up.\n\ ! 1989: Useful to set before you dump a modified Emacs."); ! 1990: Vtop_level = Qnil; ! 1991: ! 1992: DEFVAR_LISP ("keyboard-translate-table", &Vkeyboard_translate_table, ! 1993: "String used as translate table for keyboard input, or nil.\n\ ! 1994: Each character is looked up in this string and the contents used instead.\n\ ! 1995: If string is of length N, character codes N and up are untranslated."); ! 1996: Vkeyboard_translate_table = Qnil; ! 1997: } ! 1998: ! 1999: keys_of_keyboard () ! 2000: { ! 2001: defkey (GlobalMap, Ctl ('Z'), "suspend-emacs"); ! 2002: defkey (CtlXmap, Ctl ('Z'), "suspend-emacs"); ! 2003: defkey (ESCmap, Ctl ('C'), "exit-recursive-edit"); ! 2004: defkey (GlobalMap, Ctl (']'), "abort-recursive-edit"); ! 2005: defkey (ESCmap, 'x', "execute-extended-command"); ! 2006: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.