Annotation of 43BSD/contrib/emacs/src/keyboard.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.