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