|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.