1*6b445a62SJohn Marino /* readline.c -- a general facility for reading lines of input
2*6b445a62SJohn Marino with emacs style editing and completion. */
3*6b445a62SJohn Marino
4*6b445a62SJohn Marino /* Copyright (C) 1987-2009 Free Software Foundation, Inc.
5*6b445a62SJohn Marino
6*6b445a62SJohn Marino This file is part of the GNU Readline Library (Readline), a library
7*6b445a62SJohn Marino for reading lines of text with interactive input and history editing.
8*6b445a62SJohn Marino
9*6b445a62SJohn Marino Readline is free software: you can redistribute it and/or modify
10*6b445a62SJohn Marino it under the terms of the GNU General Public License as published by
11*6b445a62SJohn Marino the Free Software Foundation, either version 3 of the License, or
12*6b445a62SJohn Marino (at your option) any later version.
13*6b445a62SJohn Marino
14*6b445a62SJohn Marino Readline is distributed in the hope that it will be useful,
15*6b445a62SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
16*6b445a62SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17*6b445a62SJohn Marino GNU General Public License for more details.
18*6b445a62SJohn Marino
19*6b445a62SJohn Marino You should have received a copy of the GNU General Public License
20*6b445a62SJohn Marino along with Readline. If not, see <http://www.gnu.org/licenses/>.
21*6b445a62SJohn Marino */
22*6b445a62SJohn Marino
23*6b445a62SJohn Marino #define READLINE_LIBRARY
24*6b445a62SJohn Marino
25*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
26*6b445a62SJohn Marino # include <config.h>
27*6b445a62SJohn Marino #endif
28*6b445a62SJohn Marino
29*6b445a62SJohn Marino #include <sys/types.h>
30*6b445a62SJohn Marino #include "posixstat.h"
31*6b445a62SJohn Marino #include <fcntl.h>
32*6b445a62SJohn Marino #if defined (HAVE_SYS_FILE_H)
33*6b445a62SJohn Marino # include <sys/file.h>
34*6b445a62SJohn Marino #endif /* HAVE_SYS_FILE_H */
35*6b445a62SJohn Marino
36*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
37*6b445a62SJohn Marino # include <unistd.h>
38*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
39*6b445a62SJohn Marino
40*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H)
41*6b445a62SJohn Marino # include <stdlib.h>
42*6b445a62SJohn Marino #else
43*6b445a62SJohn Marino # include "ansi_stdlib.h"
44*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */
45*6b445a62SJohn Marino
46*6b445a62SJohn Marino #if defined (HAVE_LOCALE_H)
47*6b445a62SJohn Marino # include <locale.h>
48*6b445a62SJohn Marino #endif
49*6b445a62SJohn Marino
50*6b445a62SJohn Marino #include <stdio.h>
51*6b445a62SJohn Marino #include "posixjmp.h"
52*6b445a62SJohn Marino #include <errno.h>
53*6b445a62SJohn Marino
54*6b445a62SJohn Marino #if !defined (errno)
55*6b445a62SJohn Marino extern int errno;
56*6b445a62SJohn Marino #endif /* !errno */
57*6b445a62SJohn Marino
58*6b445a62SJohn Marino /* System-specific feature definitions and include files. */
59*6b445a62SJohn Marino #include "rldefs.h"
60*6b445a62SJohn Marino #include "rlmbutil.h"
61*6b445a62SJohn Marino
62*6b445a62SJohn Marino #if defined (__EMX__)
63*6b445a62SJohn Marino # define INCL_DOSPROCESS
64*6b445a62SJohn Marino # include <os2.h>
65*6b445a62SJohn Marino #endif /* __EMX__ */
66*6b445a62SJohn Marino
67*6b445a62SJohn Marino /* Some standard library routines. */
68*6b445a62SJohn Marino #include "readline.h"
69*6b445a62SJohn Marino #include "history.h"
70*6b445a62SJohn Marino
71*6b445a62SJohn Marino #include "rlprivate.h"
72*6b445a62SJohn Marino #include "rlshell.h"
73*6b445a62SJohn Marino #include "xmalloc.h"
74*6b445a62SJohn Marino
75*6b445a62SJohn Marino #ifndef RL_LIBRARY_VERSION
76*6b445a62SJohn Marino # define RL_LIBRARY_VERSION "5.1"
77*6b445a62SJohn Marino #endif
78*6b445a62SJohn Marino
79*6b445a62SJohn Marino #ifndef RL_READLINE_VERSION
80*6b445a62SJohn Marino # define RL_READLINE_VERSION 0x0501
81*6b445a62SJohn Marino #endif
82*6b445a62SJohn Marino
83*6b445a62SJohn Marino extern void _rl_free_history_entry PARAMS((HIST_ENTRY *));
84*6b445a62SJohn Marino
85*6b445a62SJohn Marino /* Forward declarations used in this file. */
86*6b445a62SJohn Marino static char *readline_internal PARAMS((void));
87*6b445a62SJohn Marino static void readline_initialize_everything PARAMS((void));
88*6b445a62SJohn Marino
89*6b445a62SJohn Marino static void bind_arrow_keys_internal PARAMS((Keymap));
90*6b445a62SJohn Marino static void bind_arrow_keys PARAMS((void));
91*6b445a62SJohn Marino
92*6b445a62SJohn Marino static void readline_default_bindings PARAMS((void));
93*6b445a62SJohn Marino static void reset_default_bindings PARAMS((void));
94*6b445a62SJohn Marino
95*6b445a62SJohn Marino static int _rl_subseq_result PARAMS((int, Keymap, int, int));
96*6b445a62SJohn Marino static int _rl_subseq_getchar PARAMS((int));
97*6b445a62SJohn Marino
98*6b445a62SJohn Marino /* **************************************************************** */
99*6b445a62SJohn Marino /* */
100*6b445a62SJohn Marino /* Line editing input utility */
101*6b445a62SJohn Marino /* */
102*6b445a62SJohn Marino /* **************************************************************** */
103*6b445a62SJohn Marino
104*6b445a62SJohn Marino const char *rl_library_version = RL_LIBRARY_VERSION;
105*6b445a62SJohn Marino
106*6b445a62SJohn Marino int rl_readline_version = RL_READLINE_VERSION;
107*6b445a62SJohn Marino
108*6b445a62SJohn Marino /* True if this is `real' readline as opposed to some stub substitute. */
109*6b445a62SJohn Marino int rl_gnu_readline_p = 1;
110*6b445a62SJohn Marino
111*6b445a62SJohn Marino /* A pointer to the keymap that is currently in use.
112*6b445a62SJohn Marino By default, it is the standard emacs keymap. */
113*6b445a62SJohn Marino Keymap _rl_keymap = emacs_standard_keymap;
114*6b445a62SJohn Marino
115*6b445a62SJohn Marino
116*6b445a62SJohn Marino /* The current style of editing. */
117*6b445a62SJohn Marino int rl_editing_mode = emacs_mode;
118*6b445a62SJohn Marino
119*6b445a62SJohn Marino /* The current insert mode: input (the default) or overwrite */
120*6b445a62SJohn Marino int rl_insert_mode = RL_IM_DEFAULT;
121*6b445a62SJohn Marino
122*6b445a62SJohn Marino /* Non-zero if we called this function from _rl_dispatch(). It's present
123*6b445a62SJohn Marino so functions can find out whether they were called from a key binding
124*6b445a62SJohn Marino or directly from an application. */
125*6b445a62SJohn Marino int rl_dispatching;
126*6b445a62SJohn Marino
127*6b445a62SJohn Marino /* Non-zero if the previous command was a kill command. */
128*6b445a62SJohn Marino int _rl_last_command_was_kill = 0;
129*6b445a62SJohn Marino
130*6b445a62SJohn Marino /* The current value of the numeric argument specified by the user. */
131*6b445a62SJohn Marino int rl_numeric_arg = 1;
132*6b445a62SJohn Marino
133*6b445a62SJohn Marino /* Non-zero if an argument was typed. */
134*6b445a62SJohn Marino int rl_explicit_arg = 0;
135*6b445a62SJohn Marino
136*6b445a62SJohn Marino /* Temporary value used while generating the argument. */
137*6b445a62SJohn Marino int rl_arg_sign = 1;
138*6b445a62SJohn Marino
139*6b445a62SJohn Marino /* Non-zero means we have been called at least once before. */
140*6b445a62SJohn Marino static int rl_initialized;
141*6b445a62SJohn Marino
142*6b445a62SJohn Marino #if 0
143*6b445a62SJohn Marino /* If non-zero, this program is running in an EMACS buffer. */
144*6b445a62SJohn Marino static int running_in_emacs;
145*6b445a62SJohn Marino #endif
146*6b445a62SJohn Marino
147*6b445a62SJohn Marino /* Flags word encapsulating the current readline state. */
148*6b445a62SJohn Marino int rl_readline_state = RL_STATE_NONE;
149*6b445a62SJohn Marino
150*6b445a62SJohn Marino /* The current offset in the current input line. */
151*6b445a62SJohn Marino int rl_point;
152*6b445a62SJohn Marino
153*6b445a62SJohn Marino /* Mark in the current input line. */
154*6b445a62SJohn Marino int rl_mark;
155*6b445a62SJohn Marino
156*6b445a62SJohn Marino /* Length of the current input line. */
157*6b445a62SJohn Marino int rl_end;
158*6b445a62SJohn Marino
159*6b445a62SJohn Marino /* Make this non-zero to return the current input_line. */
160*6b445a62SJohn Marino int rl_done;
161*6b445a62SJohn Marino
162*6b445a62SJohn Marino /* The last function executed by readline. */
163*6b445a62SJohn Marino rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL;
164*6b445a62SJohn Marino
165*6b445a62SJohn Marino /* Top level environment for readline_internal (). */
166*6b445a62SJohn Marino procenv_t _rl_top_level;
167*6b445a62SJohn Marino
168*6b445a62SJohn Marino /* The streams we interact with. */
169*6b445a62SJohn Marino FILE *_rl_in_stream, *_rl_out_stream;
170*6b445a62SJohn Marino
171*6b445a62SJohn Marino /* The names of the streams that we do input and output to. */
172*6b445a62SJohn Marino FILE *rl_instream = (FILE *)NULL;
173*6b445a62SJohn Marino FILE *rl_outstream = (FILE *)NULL;
174*6b445a62SJohn Marino
175*6b445a62SJohn Marino /* Non-zero means echo characters as they are read. Defaults to no echo;
176*6b445a62SJohn Marino set to 1 if there is a controlling terminal, we can get its attributes,
177*6b445a62SJohn Marino and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings
178*6b445a62SJohn Marino for the code that sets it. */
179*6b445a62SJohn Marino int _rl_echoing_p = 0;
180*6b445a62SJohn Marino
181*6b445a62SJohn Marino /* Current prompt. */
182*6b445a62SJohn Marino char *rl_prompt = (char *)NULL;
183*6b445a62SJohn Marino int rl_visible_prompt_length = 0;
184*6b445a62SJohn Marino
185*6b445a62SJohn Marino /* Set to non-zero by calling application if it has already printed rl_prompt
186*6b445a62SJohn Marino and does not want readline to do it the first time. */
187*6b445a62SJohn Marino int rl_already_prompted = 0;
188*6b445a62SJohn Marino
189*6b445a62SJohn Marino /* The number of characters read in order to type this complete command. */
190*6b445a62SJohn Marino int rl_key_sequence_length = 0;
191*6b445a62SJohn Marino
192*6b445a62SJohn Marino /* If non-zero, then this is the address of a function to call just
193*6b445a62SJohn Marino before readline_internal_setup () prints the first prompt. */
194*6b445a62SJohn Marino rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL;
195*6b445a62SJohn Marino
196*6b445a62SJohn Marino /* If non-zero, this is the address of a function to call just before
197*6b445a62SJohn Marino readline_internal_setup () returns and readline_internal starts
198*6b445a62SJohn Marino reading input characters. */
199*6b445a62SJohn Marino rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL;
200*6b445a62SJohn Marino
201*6b445a62SJohn Marino /* What we use internally. You should always refer to RL_LINE_BUFFER. */
202*6b445a62SJohn Marino static char *the_line;
203*6b445a62SJohn Marino
204*6b445a62SJohn Marino /* The character that can generate an EOF. Really read from
205*6b445a62SJohn Marino the terminal driver... just defaulted here. */
206*6b445a62SJohn Marino int _rl_eof_char = CTRL ('D');
207*6b445a62SJohn Marino
208*6b445a62SJohn Marino /* Non-zero makes this the next keystroke to read. */
209*6b445a62SJohn Marino int rl_pending_input = 0;
210*6b445a62SJohn Marino
211*6b445a62SJohn Marino /* Pointer to a useful terminal name. */
212*6b445a62SJohn Marino const char *rl_terminal_name = (const char *)NULL;
213*6b445a62SJohn Marino
214*6b445a62SJohn Marino /* Non-zero means to always use horizontal scrolling in line display. */
215*6b445a62SJohn Marino int _rl_horizontal_scroll_mode = 0;
216*6b445a62SJohn Marino
217*6b445a62SJohn Marino /* Non-zero means to display an asterisk at the starts of history lines
218*6b445a62SJohn Marino which have been modified. */
219*6b445a62SJohn Marino int _rl_mark_modified_lines = 0;
220*6b445a62SJohn Marino
221*6b445a62SJohn Marino /* The style of `bell' notification preferred. This can be set to NO_BELL,
222*6b445a62SJohn Marino AUDIBLE_BELL, or VISIBLE_BELL. */
223*6b445a62SJohn Marino int _rl_bell_preference = AUDIBLE_BELL;
224*6b445a62SJohn Marino
225*6b445a62SJohn Marino /* String inserted into the line by rl_insert_comment (). */
226*6b445a62SJohn Marino char *_rl_comment_begin;
227*6b445a62SJohn Marino
228*6b445a62SJohn Marino /* Keymap holding the function currently being executed. */
229*6b445a62SJohn Marino Keymap rl_executing_keymap;
230*6b445a62SJohn Marino
231*6b445a62SJohn Marino /* Keymap we're currently using to dispatch. */
232*6b445a62SJohn Marino Keymap _rl_dispatching_keymap;
233*6b445a62SJohn Marino
234*6b445a62SJohn Marino /* Non-zero means to erase entire line, including prompt, on empty input lines. */
235*6b445a62SJohn Marino int rl_erase_empty_line = 0;
236*6b445a62SJohn Marino
237*6b445a62SJohn Marino /* Non-zero means to read only this many characters rather than up to a
238*6b445a62SJohn Marino character bound to accept-line. */
239*6b445a62SJohn Marino int rl_num_chars_to_read;
240*6b445a62SJohn Marino
241*6b445a62SJohn Marino /* Line buffer and maintenence. */
242*6b445a62SJohn Marino char *rl_line_buffer = (char *)NULL;
243*6b445a62SJohn Marino int rl_line_buffer_len = 0;
244*6b445a62SJohn Marino
245*6b445a62SJohn Marino /* Key sequence `contexts' */
246*6b445a62SJohn Marino _rl_keyseq_cxt *_rl_kscxt = 0;
247*6b445a62SJohn Marino
248*6b445a62SJohn Marino /* Forward declarations used by the display, termcap, and history code. */
249*6b445a62SJohn Marino
250*6b445a62SJohn Marino /* **************************************************************** */
251*6b445a62SJohn Marino /* */
252*6b445a62SJohn Marino /* `Forward' declarations */
253*6b445a62SJohn Marino /* */
254*6b445a62SJohn Marino /* **************************************************************** */
255*6b445a62SJohn Marino
256*6b445a62SJohn Marino /* Non-zero means do not parse any lines other than comments and
257*6b445a62SJohn Marino parser directives. */
258*6b445a62SJohn Marino unsigned char _rl_parsing_conditionalized_out = 0;
259*6b445a62SJohn Marino
260*6b445a62SJohn Marino /* Non-zero means to convert characters with the meta bit set to
261*6b445a62SJohn Marino escape-prefixed characters so we can indirect through
262*6b445a62SJohn Marino emacs_meta_keymap or vi_escape_keymap. */
263*6b445a62SJohn Marino int _rl_convert_meta_chars_to_ascii = 1;
264*6b445a62SJohn Marino
265*6b445a62SJohn Marino /* Non-zero means to output characters with the meta bit set directly
266*6b445a62SJohn Marino rather than as a meta-prefixed escape sequence. */
267*6b445a62SJohn Marino int _rl_output_meta_chars = 0;
268*6b445a62SJohn Marino
269*6b445a62SJohn Marino /* Non-zero means to look at the termios special characters and bind
270*6b445a62SJohn Marino them to equivalent readline functions at startup. */
271*6b445a62SJohn Marino int _rl_bind_stty_chars = 1;
272*6b445a62SJohn Marino
273*6b445a62SJohn Marino /* Non-zero means to go through the history list at every newline (or
274*6b445a62SJohn Marino whenever rl_done is set and readline returns) and revert each line to
275*6b445a62SJohn Marino its initial state. */
276*6b445a62SJohn Marino int _rl_revert_all_at_newline = 0;
277*6b445a62SJohn Marino
278*6b445a62SJohn Marino /* Non-zero means to honor the termios ECHOCTL bit and echo control
279*6b445a62SJohn Marino characters corresponding to keyboard-generated signals. */
280*6b445a62SJohn Marino int _rl_echo_control_chars = 1;
281*6b445a62SJohn Marino
282*6b445a62SJohn Marino /* **************************************************************** */
283*6b445a62SJohn Marino /* */
284*6b445a62SJohn Marino /* Top Level Functions */
285*6b445a62SJohn Marino /* */
286*6b445a62SJohn Marino /* **************************************************************** */
287*6b445a62SJohn Marino
288*6b445a62SJohn Marino /* Non-zero means treat 0200 bit in terminal input as Meta bit. */
289*6b445a62SJohn Marino int _rl_meta_flag = 0; /* Forward declaration */
290*6b445a62SJohn Marino
291*6b445a62SJohn Marino /* Set up the prompt and expand it. Called from readline() and
292*6b445a62SJohn Marino rl_callback_handler_install (). */
293*6b445a62SJohn Marino int
rl_set_prompt(prompt)294*6b445a62SJohn Marino rl_set_prompt (prompt)
295*6b445a62SJohn Marino const char *prompt;
296*6b445a62SJohn Marino {
297*6b445a62SJohn Marino FREE (rl_prompt);
298*6b445a62SJohn Marino rl_prompt = prompt ? savestring (prompt) : (char *)NULL;
299*6b445a62SJohn Marino rl_display_prompt = rl_prompt ? rl_prompt : "";
300*6b445a62SJohn Marino
301*6b445a62SJohn Marino rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
302*6b445a62SJohn Marino return 0;
303*6b445a62SJohn Marino }
304*6b445a62SJohn Marino
305*6b445a62SJohn Marino /* Read a line of input. Prompt with PROMPT. An empty PROMPT means
306*6b445a62SJohn Marino none. A return value of NULL means that EOF was encountered. */
307*6b445a62SJohn Marino char *
readline(prompt)308*6b445a62SJohn Marino readline (prompt)
309*6b445a62SJohn Marino const char *prompt;
310*6b445a62SJohn Marino {
311*6b445a62SJohn Marino char *value;
312*6b445a62SJohn Marino #if 0
313*6b445a62SJohn Marino int in_callback;
314*6b445a62SJohn Marino #endif
315*6b445a62SJohn Marino
316*6b445a62SJohn Marino /* If we are at EOF return a NULL string. */
317*6b445a62SJohn Marino if (rl_pending_input == EOF)
318*6b445a62SJohn Marino {
319*6b445a62SJohn Marino rl_clear_pending_input ();
320*6b445a62SJohn Marino return ((char *)NULL);
321*6b445a62SJohn Marino }
322*6b445a62SJohn Marino
323*6b445a62SJohn Marino #if 0
324*6b445a62SJohn Marino /* If readline() is called after installing a callback handler, temporarily
325*6b445a62SJohn Marino turn off the callback state to avoid ensuing messiness. Patch supplied
326*6b445a62SJohn Marino by the gdb folks. XXX -- disabled. This can be fooled and readline
327*6b445a62SJohn Marino left in a strange state by a poorly-timed longjmp. */
328*6b445a62SJohn Marino if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK))
329*6b445a62SJohn Marino RL_UNSETSTATE (RL_STATE_CALLBACK);
330*6b445a62SJohn Marino #endif
331*6b445a62SJohn Marino
332*6b445a62SJohn Marino rl_set_prompt (prompt);
333*6b445a62SJohn Marino
334*6b445a62SJohn Marino rl_initialize ();
335*6b445a62SJohn Marino if (rl_prep_term_function)
336*6b445a62SJohn Marino (*rl_prep_term_function) (_rl_meta_flag);
337*6b445a62SJohn Marino
338*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
339*6b445a62SJohn Marino rl_set_signals ();
340*6b445a62SJohn Marino #endif
341*6b445a62SJohn Marino
342*6b445a62SJohn Marino value = readline_internal ();
343*6b445a62SJohn Marino if (rl_deprep_term_function)
344*6b445a62SJohn Marino (*rl_deprep_term_function) ();
345*6b445a62SJohn Marino
346*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
347*6b445a62SJohn Marino rl_clear_signals ();
348*6b445a62SJohn Marino #endif
349*6b445a62SJohn Marino
350*6b445a62SJohn Marino #if 0
351*6b445a62SJohn Marino if (in_callback)
352*6b445a62SJohn Marino RL_SETSTATE (RL_STATE_CALLBACK);
353*6b445a62SJohn Marino #endif
354*6b445a62SJohn Marino
355*6b445a62SJohn Marino return (value);
356*6b445a62SJohn Marino }
357*6b445a62SJohn Marino
358*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
359*6b445a62SJohn Marino # define STATIC_CALLBACK
360*6b445a62SJohn Marino #else
361*6b445a62SJohn Marino # define STATIC_CALLBACK static
362*6b445a62SJohn Marino #endif
363*6b445a62SJohn Marino
364*6b445a62SJohn Marino STATIC_CALLBACK void
readline_internal_setup()365*6b445a62SJohn Marino readline_internal_setup ()
366*6b445a62SJohn Marino {
367*6b445a62SJohn Marino char *nprompt;
368*6b445a62SJohn Marino
369*6b445a62SJohn Marino _rl_in_stream = rl_instream;
370*6b445a62SJohn Marino _rl_out_stream = rl_outstream;
371*6b445a62SJohn Marino
372*6b445a62SJohn Marino if (rl_startup_hook)
373*6b445a62SJohn Marino (*rl_startup_hook) ();
374*6b445a62SJohn Marino
375*6b445a62SJohn Marino /* If we're not echoing, we still want to at least print a prompt, because
376*6b445a62SJohn Marino rl_redisplay will not do it for us. If the calling application has a
377*6b445a62SJohn Marino custom redisplay function, though, let that function handle it. */
378*6b445a62SJohn Marino if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay)
379*6b445a62SJohn Marino {
380*6b445a62SJohn Marino if (rl_prompt && rl_already_prompted == 0)
381*6b445a62SJohn Marino {
382*6b445a62SJohn Marino nprompt = _rl_strip_prompt (rl_prompt);
383*6b445a62SJohn Marino fprintf (_rl_out_stream, "%s", nprompt);
384*6b445a62SJohn Marino fflush (_rl_out_stream);
385*6b445a62SJohn Marino xfree (nprompt);
386*6b445a62SJohn Marino }
387*6b445a62SJohn Marino }
388*6b445a62SJohn Marino else
389*6b445a62SJohn Marino {
390*6b445a62SJohn Marino if (rl_prompt && rl_already_prompted)
391*6b445a62SJohn Marino rl_on_new_line_with_prompt ();
392*6b445a62SJohn Marino else
393*6b445a62SJohn Marino rl_on_new_line ();
394*6b445a62SJohn Marino (*rl_redisplay_function) ();
395*6b445a62SJohn Marino }
396*6b445a62SJohn Marino
397*6b445a62SJohn Marino #if defined (VI_MODE)
398*6b445a62SJohn Marino if (rl_editing_mode == vi_mode)
399*6b445a62SJohn Marino rl_vi_insert_mode (1, 'i');
400*6b445a62SJohn Marino #endif /* VI_MODE */
401*6b445a62SJohn Marino
402*6b445a62SJohn Marino if (rl_pre_input_hook)
403*6b445a62SJohn Marino (*rl_pre_input_hook) ();
404*6b445a62SJohn Marino
405*6b445a62SJohn Marino RL_CHECK_SIGNALS ();
406*6b445a62SJohn Marino }
407*6b445a62SJohn Marino
408*6b445a62SJohn Marino STATIC_CALLBACK char *
readline_internal_teardown(eof)409*6b445a62SJohn Marino readline_internal_teardown (eof)
410*6b445a62SJohn Marino int eof;
411*6b445a62SJohn Marino {
412*6b445a62SJohn Marino char *temp;
413*6b445a62SJohn Marino HIST_ENTRY *entry;
414*6b445a62SJohn Marino
415*6b445a62SJohn Marino RL_CHECK_SIGNALS ();
416*6b445a62SJohn Marino
417*6b445a62SJohn Marino /* Restore the original of this history line, iff the line that we
418*6b445a62SJohn Marino are editing was originally in the history, AND the line has changed. */
419*6b445a62SJohn Marino entry = current_history ();
420*6b445a62SJohn Marino
421*6b445a62SJohn Marino if (entry && rl_undo_list)
422*6b445a62SJohn Marino {
423*6b445a62SJohn Marino temp = savestring (the_line);
424*6b445a62SJohn Marino rl_revert_line (1, 0);
425*6b445a62SJohn Marino entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL);
426*6b445a62SJohn Marino _rl_free_history_entry (entry);
427*6b445a62SJohn Marino
428*6b445a62SJohn Marino strcpy (the_line, temp);
429*6b445a62SJohn Marino xfree (temp);
430*6b445a62SJohn Marino }
431*6b445a62SJohn Marino
432*6b445a62SJohn Marino if (_rl_revert_all_at_newline)
433*6b445a62SJohn Marino _rl_revert_all_lines ();
434*6b445a62SJohn Marino
435*6b445a62SJohn Marino /* At any rate, it is highly likely that this line has an undo list. Get
436*6b445a62SJohn Marino rid of it now. */
437*6b445a62SJohn Marino if (rl_undo_list)
438*6b445a62SJohn Marino rl_free_undo_list ();
439*6b445a62SJohn Marino
440*6b445a62SJohn Marino /* Restore normal cursor, if available. */
441*6b445a62SJohn Marino _rl_set_insert_mode (RL_IM_INSERT, 0);
442*6b445a62SJohn Marino
443*6b445a62SJohn Marino return (eof ? (char *)NULL : savestring (the_line));
444*6b445a62SJohn Marino }
445*6b445a62SJohn Marino
446*6b445a62SJohn Marino void
_rl_internal_char_cleanup()447*6b445a62SJohn Marino _rl_internal_char_cleanup ()
448*6b445a62SJohn Marino {
449*6b445a62SJohn Marino #if defined (VI_MODE)
450*6b445a62SJohn Marino /* In vi mode, when you exit insert mode, the cursor moves back
451*6b445a62SJohn Marino over the previous character. We explicitly check for that here. */
452*6b445a62SJohn Marino if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
453*6b445a62SJohn Marino rl_vi_check ();
454*6b445a62SJohn Marino #endif /* VI_MODE */
455*6b445a62SJohn Marino
456*6b445a62SJohn Marino if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read)
457*6b445a62SJohn Marino {
458*6b445a62SJohn Marino (*rl_redisplay_function) ();
459*6b445a62SJohn Marino _rl_want_redisplay = 0;
460*6b445a62SJohn Marino rl_newline (1, '\n');
461*6b445a62SJohn Marino }
462*6b445a62SJohn Marino
463*6b445a62SJohn Marino if (rl_done == 0)
464*6b445a62SJohn Marino {
465*6b445a62SJohn Marino (*rl_redisplay_function) ();
466*6b445a62SJohn Marino _rl_want_redisplay = 0;
467*6b445a62SJohn Marino }
468*6b445a62SJohn Marino
469*6b445a62SJohn Marino /* If the application writer has told us to erase the entire line if
470*6b445a62SJohn Marino the only character typed was something bound to rl_newline, do so. */
471*6b445a62SJohn Marino if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline &&
472*6b445a62SJohn Marino rl_point == 0 && rl_end == 0)
473*6b445a62SJohn Marino _rl_erase_entire_line ();
474*6b445a62SJohn Marino }
475*6b445a62SJohn Marino
476*6b445a62SJohn Marino STATIC_CALLBACK int
477*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
readline_internal_char()478*6b445a62SJohn Marino readline_internal_char ()
479*6b445a62SJohn Marino #else
480*6b445a62SJohn Marino readline_internal_charloop ()
481*6b445a62SJohn Marino #endif
482*6b445a62SJohn Marino {
483*6b445a62SJohn Marino static int lastc, eof_found;
484*6b445a62SJohn Marino int c, code, lk;
485*6b445a62SJohn Marino
486*6b445a62SJohn Marino lastc = -1;
487*6b445a62SJohn Marino eof_found = 0;
488*6b445a62SJohn Marino
489*6b445a62SJohn Marino #if !defined (READLINE_CALLBACKS)
490*6b445a62SJohn Marino while (rl_done == 0)
491*6b445a62SJohn Marino {
492*6b445a62SJohn Marino #endif
493*6b445a62SJohn Marino lk = _rl_last_command_was_kill;
494*6b445a62SJohn Marino
495*6b445a62SJohn Marino code = setjmp (_rl_top_level);
496*6b445a62SJohn Marino
497*6b445a62SJohn Marino if (code)
498*6b445a62SJohn Marino {
499*6b445a62SJohn Marino (*rl_redisplay_function) ();
500*6b445a62SJohn Marino _rl_want_redisplay = 0;
501*6b445a62SJohn Marino /* If we get here, we're not being called from something dispatched
502*6b445a62SJohn Marino from _rl_callback_read_char(), which sets up its own value of
503*6b445a62SJohn Marino _rl_top_level (saving and restoring the old, of course), so
504*6b445a62SJohn Marino we can just return here. */
505*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK))
506*6b445a62SJohn Marino return (0);
507*6b445a62SJohn Marino }
508*6b445a62SJohn Marino
509*6b445a62SJohn Marino if (rl_pending_input == 0)
510*6b445a62SJohn Marino {
511*6b445a62SJohn Marino /* Then initialize the argument and number of keys read. */
512*6b445a62SJohn Marino _rl_reset_argument ();
513*6b445a62SJohn Marino rl_key_sequence_length = 0;
514*6b445a62SJohn Marino }
515*6b445a62SJohn Marino
516*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_READCMD);
517*6b445a62SJohn Marino c = rl_read_key ();
518*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_READCMD);
519*6b445a62SJohn Marino
520*6b445a62SJohn Marino /* look at input.c:rl_getc() for the circumstances under which this will
521*6b445a62SJohn Marino be returned; punt immediately on read error without converting it to
522*6b445a62SJohn Marino a newline. */
523*6b445a62SJohn Marino if (c == READERR)
524*6b445a62SJohn Marino {
525*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
526*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_DONE);
527*6b445a62SJohn Marino return (rl_done = 1);
528*6b445a62SJohn Marino #else
529*6b445a62SJohn Marino eof_found = 1;
530*6b445a62SJohn Marino break;
531*6b445a62SJohn Marino #endif
532*6b445a62SJohn Marino }
533*6b445a62SJohn Marino
534*6b445a62SJohn Marino /* EOF typed to a non-blank line is a <NL>. */
535*6b445a62SJohn Marino if (c == EOF && rl_end)
536*6b445a62SJohn Marino c = NEWLINE;
537*6b445a62SJohn Marino
538*6b445a62SJohn Marino /* The character _rl_eof_char typed to blank line, and not as the
539*6b445a62SJohn Marino previous character is interpreted as EOF. */
540*6b445a62SJohn Marino if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
541*6b445a62SJohn Marino {
542*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
543*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_DONE);
544*6b445a62SJohn Marino return (rl_done = 1);
545*6b445a62SJohn Marino #else
546*6b445a62SJohn Marino eof_found = 1;
547*6b445a62SJohn Marino break;
548*6b445a62SJohn Marino #endif
549*6b445a62SJohn Marino }
550*6b445a62SJohn Marino
551*6b445a62SJohn Marino lastc = c;
552*6b445a62SJohn Marino _rl_dispatch ((unsigned char)c, _rl_keymap);
553*6b445a62SJohn Marino RL_CHECK_SIGNALS ();
554*6b445a62SJohn Marino
555*6b445a62SJohn Marino /* If there was no change in _rl_last_command_was_kill, then no kill
556*6b445a62SJohn Marino has taken place. Note that if input is pending we are reading
557*6b445a62SJohn Marino a prefix command, so nothing has changed yet. */
558*6b445a62SJohn Marino if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
559*6b445a62SJohn Marino _rl_last_command_was_kill = 0;
560*6b445a62SJohn Marino
561*6b445a62SJohn Marino _rl_internal_char_cleanup ();
562*6b445a62SJohn Marino
563*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
564*6b445a62SJohn Marino return 0;
565*6b445a62SJohn Marino #else
566*6b445a62SJohn Marino }
567*6b445a62SJohn Marino
568*6b445a62SJohn Marino return (eof_found);
569*6b445a62SJohn Marino #endif
570*6b445a62SJohn Marino }
571*6b445a62SJohn Marino
572*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
573*6b445a62SJohn Marino static int
readline_internal_charloop()574*6b445a62SJohn Marino readline_internal_charloop ()
575*6b445a62SJohn Marino {
576*6b445a62SJohn Marino int eof = 1;
577*6b445a62SJohn Marino
578*6b445a62SJohn Marino while (rl_done == 0)
579*6b445a62SJohn Marino eof = readline_internal_char ();
580*6b445a62SJohn Marino return (eof);
581*6b445a62SJohn Marino }
582*6b445a62SJohn Marino #endif /* READLINE_CALLBACKS */
583*6b445a62SJohn Marino
584*6b445a62SJohn Marino /* Read a line of input from the global rl_instream, doing output on
585*6b445a62SJohn Marino the global rl_outstream.
586*6b445a62SJohn Marino If rl_prompt is non-null, then that is our prompt. */
587*6b445a62SJohn Marino static char *
readline_internal()588*6b445a62SJohn Marino readline_internal ()
589*6b445a62SJohn Marino {
590*6b445a62SJohn Marino int eof;
591*6b445a62SJohn Marino
592*6b445a62SJohn Marino readline_internal_setup ();
593*6b445a62SJohn Marino eof = readline_internal_charloop ();
594*6b445a62SJohn Marino return (readline_internal_teardown (eof));
595*6b445a62SJohn Marino }
596*6b445a62SJohn Marino
597*6b445a62SJohn Marino void
_rl_init_line_state()598*6b445a62SJohn Marino _rl_init_line_state ()
599*6b445a62SJohn Marino {
600*6b445a62SJohn Marino rl_point = rl_end = rl_mark = 0;
601*6b445a62SJohn Marino the_line = rl_line_buffer;
602*6b445a62SJohn Marino the_line[0] = 0;
603*6b445a62SJohn Marino }
604*6b445a62SJohn Marino
605*6b445a62SJohn Marino void
_rl_set_the_line()606*6b445a62SJohn Marino _rl_set_the_line ()
607*6b445a62SJohn Marino {
608*6b445a62SJohn Marino the_line = rl_line_buffer;
609*6b445a62SJohn Marino }
610*6b445a62SJohn Marino
611*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
612*6b445a62SJohn Marino _rl_keyseq_cxt *
_rl_keyseq_cxt_alloc()613*6b445a62SJohn Marino _rl_keyseq_cxt_alloc ()
614*6b445a62SJohn Marino {
615*6b445a62SJohn Marino _rl_keyseq_cxt *cxt;
616*6b445a62SJohn Marino
617*6b445a62SJohn Marino cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt));
618*6b445a62SJohn Marino
619*6b445a62SJohn Marino cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0;
620*6b445a62SJohn Marino
621*6b445a62SJohn Marino cxt->okey = 0;
622*6b445a62SJohn Marino cxt->ocxt = _rl_kscxt;
623*6b445a62SJohn Marino cxt->childval = 42; /* sentinel value */
624*6b445a62SJohn Marino
625*6b445a62SJohn Marino return cxt;
626*6b445a62SJohn Marino }
627*6b445a62SJohn Marino
628*6b445a62SJohn Marino void
_rl_keyseq_cxt_dispose(cxt)629*6b445a62SJohn Marino _rl_keyseq_cxt_dispose (cxt)
630*6b445a62SJohn Marino _rl_keyseq_cxt *cxt;
631*6b445a62SJohn Marino {
632*6b445a62SJohn Marino xfree (cxt);
633*6b445a62SJohn Marino }
634*6b445a62SJohn Marino
635*6b445a62SJohn Marino void
_rl_keyseq_chain_dispose()636*6b445a62SJohn Marino _rl_keyseq_chain_dispose ()
637*6b445a62SJohn Marino {
638*6b445a62SJohn Marino _rl_keyseq_cxt *cxt;
639*6b445a62SJohn Marino
640*6b445a62SJohn Marino while (_rl_kscxt)
641*6b445a62SJohn Marino {
642*6b445a62SJohn Marino cxt = _rl_kscxt;
643*6b445a62SJohn Marino _rl_kscxt = _rl_kscxt->ocxt;
644*6b445a62SJohn Marino _rl_keyseq_cxt_dispose (cxt);
645*6b445a62SJohn Marino }
646*6b445a62SJohn Marino }
647*6b445a62SJohn Marino #endif
648*6b445a62SJohn Marino
649*6b445a62SJohn Marino static int
_rl_subseq_getchar(key)650*6b445a62SJohn Marino _rl_subseq_getchar (key)
651*6b445a62SJohn Marino int key;
652*6b445a62SJohn Marino {
653*6b445a62SJohn Marino int k;
654*6b445a62SJohn Marino
655*6b445a62SJohn Marino if (key == ESC)
656*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_METANEXT);
657*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MOREINPUT);
658*6b445a62SJohn Marino k = rl_read_key ();
659*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MOREINPUT);
660*6b445a62SJohn Marino if (key == ESC)
661*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_METANEXT);
662*6b445a62SJohn Marino
663*6b445a62SJohn Marino return k;
664*6b445a62SJohn Marino }
665*6b445a62SJohn Marino
666*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
667*6b445a62SJohn Marino int
_rl_dispatch_callback(cxt)668*6b445a62SJohn Marino _rl_dispatch_callback (cxt)
669*6b445a62SJohn Marino _rl_keyseq_cxt *cxt;
670*6b445a62SJohn Marino {
671*6b445a62SJohn Marino int nkey, r;
672*6b445a62SJohn Marino
673*6b445a62SJohn Marino /* For now */
674*6b445a62SJohn Marino /* The first time this context is used, we want to read input and dispatch
675*6b445a62SJohn Marino on it. When traversing the chain of contexts back `up', we want to use
676*6b445a62SJohn Marino the value from the next context down. We're simulating recursion using
677*6b445a62SJohn Marino a chain of contexts. */
678*6b445a62SJohn Marino if ((cxt->flags & KSEQ_DISPATCHED) == 0)
679*6b445a62SJohn Marino {
680*6b445a62SJohn Marino nkey = _rl_subseq_getchar (cxt->okey);
681*6b445a62SJohn Marino if (nkey < 0)
682*6b445a62SJohn Marino {
683*6b445a62SJohn Marino _rl_abort_internal ();
684*6b445a62SJohn Marino return -1;
685*6b445a62SJohn Marino }
686*6b445a62SJohn Marino r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
687*6b445a62SJohn Marino cxt->flags |= KSEQ_DISPATCHED;
688*6b445a62SJohn Marino }
689*6b445a62SJohn Marino else
690*6b445a62SJohn Marino r = cxt->childval;
691*6b445a62SJohn Marino
692*6b445a62SJohn Marino /* For now */
693*6b445a62SJohn Marino if (r != -3) /* don't do this if we indicate there will be other matches */
694*6b445a62SJohn Marino r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
695*6b445a62SJohn Marino
696*6b445a62SJohn Marino RL_CHECK_SIGNALS ();
697*6b445a62SJohn Marino if (r == 0) /* success! */
698*6b445a62SJohn Marino {
699*6b445a62SJohn Marino _rl_keyseq_chain_dispose ();
700*6b445a62SJohn Marino RL_UNSETSTATE (RL_STATE_MULTIKEY);
701*6b445a62SJohn Marino return r;
702*6b445a62SJohn Marino }
703*6b445a62SJohn Marino
704*6b445a62SJohn Marino if (r != -3) /* magic value that says we added to the chain */
705*6b445a62SJohn Marino _rl_kscxt = cxt->ocxt;
706*6b445a62SJohn Marino if (_rl_kscxt)
707*6b445a62SJohn Marino _rl_kscxt->childval = r;
708*6b445a62SJohn Marino if (r != -3)
709*6b445a62SJohn Marino _rl_keyseq_cxt_dispose (cxt);
710*6b445a62SJohn Marino
711*6b445a62SJohn Marino return r;
712*6b445a62SJohn Marino }
713*6b445a62SJohn Marino #endif /* READLINE_CALLBACKS */
714*6b445a62SJohn Marino
715*6b445a62SJohn Marino /* Do the command associated with KEY in MAP.
716*6b445a62SJohn Marino If the associated command is really a keymap, then read
717*6b445a62SJohn Marino another key, and dispatch into that map. */
718*6b445a62SJohn Marino int
_rl_dispatch(key,map)719*6b445a62SJohn Marino _rl_dispatch (key, map)
720*6b445a62SJohn Marino register int key;
721*6b445a62SJohn Marino Keymap map;
722*6b445a62SJohn Marino {
723*6b445a62SJohn Marino _rl_dispatching_keymap = map;
724*6b445a62SJohn Marino return _rl_dispatch_subseq (key, map, 0);
725*6b445a62SJohn Marino }
726*6b445a62SJohn Marino
727*6b445a62SJohn Marino int
_rl_dispatch_subseq(key,map,got_subseq)728*6b445a62SJohn Marino _rl_dispatch_subseq (key, map, got_subseq)
729*6b445a62SJohn Marino register int key;
730*6b445a62SJohn Marino Keymap map;
731*6b445a62SJohn Marino int got_subseq;
732*6b445a62SJohn Marino {
733*6b445a62SJohn Marino int r, newkey;
734*6b445a62SJohn Marino char *macro;
735*6b445a62SJohn Marino rl_command_func_t *func;
736*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
737*6b445a62SJohn Marino _rl_keyseq_cxt *cxt;
738*6b445a62SJohn Marino #endif
739*6b445a62SJohn Marino
740*6b445a62SJohn Marino if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
741*6b445a62SJohn Marino {
742*6b445a62SJohn Marino if (map[ESC].type == ISKMAP)
743*6b445a62SJohn Marino {
744*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_MACRODEF))
745*6b445a62SJohn Marino _rl_add_macro_char (ESC);
746*6b445a62SJohn Marino map = FUNCTION_TO_KEYMAP (map, ESC);
747*6b445a62SJohn Marino key = UNMETA (key);
748*6b445a62SJohn Marino rl_key_sequence_length += 2;
749*6b445a62SJohn Marino return (_rl_dispatch (key, map));
750*6b445a62SJohn Marino }
751*6b445a62SJohn Marino else
752*6b445a62SJohn Marino rl_ding ();
753*6b445a62SJohn Marino return 0;
754*6b445a62SJohn Marino }
755*6b445a62SJohn Marino
756*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_MACRODEF))
757*6b445a62SJohn Marino _rl_add_macro_char (key);
758*6b445a62SJohn Marino
759*6b445a62SJohn Marino r = 0;
760*6b445a62SJohn Marino switch (map[key].type)
761*6b445a62SJohn Marino {
762*6b445a62SJohn Marino case ISFUNC:
763*6b445a62SJohn Marino func = map[key].function;
764*6b445a62SJohn Marino if (func)
765*6b445a62SJohn Marino {
766*6b445a62SJohn Marino /* Special case rl_do_lowercase_version (). */
767*6b445a62SJohn Marino if (func == rl_do_lowercase_version)
768*6b445a62SJohn Marino return (_rl_dispatch (_rl_to_lower (key), map));
769*6b445a62SJohn Marino
770*6b445a62SJohn Marino rl_executing_keymap = map;
771*6b445a62SJohn Marino
772*6b445a62SJohn Marino rl_dispatching = 1;
773*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_DISPATCHING);
774*6b445a62SJohn Marino (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
775*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_DISPATCHING);
776*6b445a62SJohn Marino rl_dispatching = 0;
777*6b445a62SJohn Marino
778*6b445a62SJohn Marino /* If we have input pending, then the last command was a prefix
779*6b445a62SJohn Marino command. Don't change the state of rl_last_func. Otherwise,
780*6b445a62SJohn Marino remember the last command executed in this variable. */
781*6b445a62SJohn Marino if (rl_pending_input == 0 && map[key].function != rl_digit_argument)
782*6b445a62SJohn Marino rl_last_func = map[key].function;
783*6b445a62SJohn Marino
784*6b445a62SJohn Marino RL_CHECK_SIGNALS ();
785*6b445a62SJohn Marino }
786*6b445a62SJohn Marino else if (map[ANYOTHERKEY].function)
787*6b445a62SJohn Marino {
788*6b445a62SJohn Marino /* OK, there's no function bound in this map, but there is a
789*6b445a62SJohn Marino shadow function that was overridden when the current keymap
790*6b445a62SJohn Marino was created. Return -2 to note that. */
791*6b445a62SJohn Marino _rl_unget_char (key);
792*6b445a62SJohn Marino return -2;
793*6b445a62SJohn Marino }
794*6b445a62SJohn Marino else if (got_subseq)
795*6b445a62SJohn Marino {
796*6b445a62SJohn Marino /* Return -1 to note that we're in a subsequence, but we don't
797*6b445a62SJohn Marino have a matching key, nor was one overridden. This means
798*6b445a62SJohn Marino we need to back up the recursion chain and find the last
799*6b445a62SJohn Marino subsequence that is bound to a function. */
800*6b445a62SJohn Marino _rl_unget_char (key);
801*6b445a62SJohn Marino return -1;
802*6b445a62SJohn Marino }
803*6b445a62SJohn Marino else
804*6b445a62SJohn Marino {
805*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
806*6b445a62SJohn Marino RL_UNSETSTATE (RL_STATE_MULTIKEY);
807*6b445a62SJohn Marino _rl_keyseq_chain_dispose ();
808*6b445a62SJohn Marino #endif
809*6b445a62SJohn Marino _rl_abort_internal ();
810*6b445a62SJohn Marino return -1;
811*6b445a62SJohn Marino }
812*6b445a62SJohn Marino break;
813*6b445a62SJohn Marino
814*6b445a62SJohn Marino case ISKMAP:
815*6b445a62SJohn Marino if (map[key].function != 0)
816*6b445a62SJohn Marino {
817*6b445a62SJohn Marino #if defined (VI_MODE)
818*6b445a62SJohn Marino /* The only way this test will be true is if a subsequence has been
819*6b445a62SJohn Marino bound starting with ESC, generally the arrow keys. What we do is
820*6b445a62SJohn Marino check whether there's input in the queue, which there generally
821*6b445a62SJohn Marino will be if an arrow key has been pressed, and, if there's not,
822*6b445a62SJohn Marino just dispatch to (what we assume is) rl_vi_movement_mode right
823*6b445a62SJohn Marino away. This is essentially an input test with a zero timeout. */
824*6b445a62SJohn Marino if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap
825*6b445a62SJohn Marino && _rl_input_queued (0) == 0)
826*6b445a62SJohn Marino return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)));
827*6b445a62SJohn Marino #endif
828*6b445a62SJohn Marino
829*6b445a62SJohn Marino rl_key_sequence_length++;
830*6b445a62SJohn Marino _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key);
831*6b445a62SJohn Marino
832*6b445a62SJohn Marino /* Allocate new context here. Use linked contexts (linked through
833*6b445a62SJohn Marino cxt->ocxt) to simulate recursion */
834*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
835*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK))
836*6b445a62SJohn Marino {
837*6b445a62SJohn Marino /* Return 0 only the first time, to indicate success to
838*6b445a62SJohn Marino _rl_callback_read_char. The rest of the time, we're called
839*6b445a62SJohn Marino from _rl_dispatch_callback, so we return -3 to indicate
840*6b445a62SJohn Marino special handling is necessary. */
841*6b445a62SJohn Marino r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0;
842*6b445a62SJohn Marino cxt = _rl_keyseq_cxt_alloc ();
843*6b445a62SJohn Marino
844*6b445a62SJohn Marino if (got_subseq)
845*6b445a62SJohn Marino cxt->flags |= KSEQ_SUBSEQ;
846*6b445a62SJohn Marino cxt->okey = key;
847*6b445a62SJohn Marino cxt->oldmap = map;
848*6b445a62SJohn Marino cxt->dmap = _rl_dispatching_keymap;
849*6b445a62SJohn Marino cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function;
850*6b445a62SJohn Marino
851*6b445a62SJohn Marino RL_SETSTATE (RL_STATE_MULTIKEY);
852*6b445a62SJohn Marino _rl_kscxt = cxt;
853*6b445a62SJohn Marino
854*6b445a62SJohn Marino return r; /* don't indicate immediate success */
855*6b445a62SJohn Marino }
856*6b445a62SJohn Marino #endif
857*6b445a62SJohn Marino
858*6b445a62SJohn Marino newkey = _rl_subseq_getchar (key);
859*6b445a62SJohn Marino if (newkey < 0)
860*6b445a62SJohn Marino {
861*6b445a62SJohn Marino _rl_abort_internal ();
862*6b445a62SJohn Marino return -1;
863*6b445a62SJohn Marino }
864*6b445a62SJohn Marino
865*6b445a62SJohn Marino r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function);
866*6b445a62SJohn Marino return _rl_subseq_result (r, map, key, got_subseq);
867*6b445a62SJohn Marino }
868*6b445a62SJohn Marino else
869*6b445a62SJohn Marino {
870*6b445a62SJohn Marino _rl_abort_internal ();
871*6b445a62SJohn Marino return -1;
872*6b445a62SJohn Marino }
873*6b445a62SJohn Marino break;
874*6b445a62SJohn Marino
875*6b445a62SJohn Marino case ISMACR:
876*6b445a62SJohn Marino if (map[key].function != 0)
877*6b445a62SJohn Marino {
878*6b445a62SJohn Marino macro = savestring ((char *)map[key].function);
879*6b445a62SJohn Marino _rl_with_macro_input (macro);
880*6b445a62SJohn Marino return 0;
881*6b445a62SJohn Marino }
882*6b445a62SJohn Marino break;
883*6b445a62SJohn Marino }
884*6b445a62SJohn Marino #if defined (VI_MODE)
885*6b445a62SJohn Marino if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
886*6b445a62SJohn Marino key != ANYOTHERKEY &&
887*6b445a62SJohn Marino _rl_vi_textmod_command (key))
888*6b445a62SJohn Marino _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
889*6b445a62SJohn Marino #endif
890*6b445a62SJohn Marino
891*6b445a62SJohn Marino return (r);
892*6b445a62SJohn Marino }
893*6b445a62SJohn Marino
894*6b445a62SJohn Marino static int
_rl_subseq_result(r,map,key,got_subseq)895*6b445a62SJohn Marino _rl_subseq_result (r, map, key, got_subseq)
896*6b445a62SJohn Marino int r;
897*6b445a62SJohn Marino Keymap map;
898*6b445a62SJohn Marino int key, got_subseq;
899*6b445a62SJohn Marino {
900*6b445a62SJohn Marino Keymap m;
901*6b445a62SJohn Marino int type, nt;
902*6b445a62SJohn Marino rl_command_func_t *func, *nf;
903*6b445a62SJohn Marino
904*6b445a62SJohn Marino if (r == -2)
905*6b445a62SJohn Marino /* We didn't match anything, and the keymap we're indexed into
906*6b445a62SJohn Marino shadowed a function previously bound to that prefix. Call
907*6b445a62SJohn Marino the function. The recursive call to _rl_dispatch_subseq has
908*6b445a62SJohn Marino already taken care of pushing any necessary input back onto
909*6b445a62SJohn Marino the input queue with _rl_unget_char. */
910*6b445a62SJohn Marino {
911*6b445a62SJohn Marino m = _rl_dispatching_keymap;
912*6b445a62SJohn Marino type = m[ANYOTHERKEY].type;
913*6b445a62SJohn Marino func = m[ANYOTHERKEY].function;
914*6b445a62SJohn Marino if (type == ISFUNC && func == rl_do_lowercase_version)
915*6b445a62SJohn Marino r = _rl_dispatch (_rl_to_lower (key), map);
916*6b445a62SJohn Marino else if (type == ISFUNC && func == rl_insert)
917*6b445a62SJohn Marino {
918*6b445a62SJohn Marino /* If the function that was shadowed was self-insert, we
919*6b445a62SJohn Marino somehow need a keymap with map[key].func == self-insert.
920*6b445a62SJohn Marino Let's use this one. */
921*6b445a62SJohn Marino nt = m[key].type;
922*6b445a62SJohn Marino nf = m[key].function;
923*6b445a62SJohn Marino
924*6b445a62SJohn Marino m[key].type = type;
925*6b445a62SJohn Marino m[key].function = func;
926*6b445a62SJohn Marino r = _rl_dispatch (key, m);
927*6b445a62SJohn Marino m[key].type = nt;
928*6b445a62SJohn Marino m[key].function = nf;
929*6b445a62SJohn Marino }
930*6b445a62SJohn Marino else
931*6b445a62SJohn Marino r = _rl_dispatch (ANYOTHERKEY, m);
932*6b445a62SJohn Marino }
933*6b445a62SJohn Marino else if (r && map[ANYOTHERKEY].function)
934*6b445a62SJohn Marino {
935*6b445a62SJohn Marino /* We didn't match (r is probably -1), so return something to
936*6b445a62SJohn Marino tell the caller that it should try ANYOTHERKEY for an
937*6b445a62SJohn Marino overridden function. */
938*6b445a62SJohn Marino _rl_unget_char (key);
939*6b445a62SJohn Marino _rl_dispatching_keymap = map;
940*6b445a62SJohn Marino return -2;
941*6b445a62SJohn Marino }
942*6b445a62SJohn Marino else if (r && got_subseq)
943*6b445a62SJohn Marino {
944*6b445a62SJohn Marino /* OK, back up the chain. */
945*6b445a62SJohn Marino _rl_unget_char (key);
946*6b445a62SJohn Marino _rl_dispatching_keymap = map;
947*6b445a62SJohn Marino return -1;
948*6b445a62SJohn Marino }
949*6b445a62SJohn Marino
950*6b445a62SJohn Marino return r;
951*6b445a62SJohn Marino }
952*6b445a62SJohn Marino
953*6b445a62SJohn Marino /* **************************************************************** */
954*6b445a62SJohn Marino /* */
955*6b445a62SJohn Marino /* Initializations */
956*6b445a62SJohn Marino /* */
957*6b445a62SJohn Marino /* **************************************************************** */
958*6b445a62SJohn Marino
959*6b445a62SJohn Marino /* Initialize readline (and terminal if not already). */
960*6b445a62SJohn Marino int
rl_initialize()961*6b445a62SJohn Marino rl_initialize ()
962*6b445a62SJohn Marino {
963*6b445a62SJohn Marino /* If we have never been called before, initialize the
964*6b445a62SJohn Marino terminal and data structures. */
965*6b445a62SJohn Marino if (!rl_initialized)
966*6b445a62SJohn Marino {
967*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_INITIALIZING);
968*6b445a62SJohn Marino readline_initialize_everything ();
969*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_INITIALIZING);
970*6b445a62SJohn Marino rl_initialized++;
971*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_INITIALIZED);
972*6b445a62SJohn Marino }
973*6b445a62SJohn Marino
974*6b445a62SJohn Marino /* Initalize the current line information. */
975*6b445a62SJohn Marino _rl_init_line_state ();
976*6b445a62SJohn Marino
977*6b445a62SJohn Marino /* We aren't done yet. We haven't even gotten started yet! */
978*6b445a62SJohn Marino rl_done = 0;
979*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_DONE);
980*6b445a62SJohn Marino
981*6b445a62SJohn Marino /* Tell the history routines what is going on. */
982*6b445a62SJohn Marino _rl_start_using_history ();
983*6b445a62SJohn Marino
984*6b445a62SJohn Marino /* Make the display buffer match the state of the line. */
985*6b445a62SJohn Marino rl_reset_line_state ();
986*6b445a62SJohn Marino
987*6b445a62SJohn Marino /* No such function typed yet. */
988*6b445a62SJohn Marino rl_last_func = (rl_command_func_t *)NULL;
989*6b445a62SJohn Marino
990*6b445a62SJohn Marino /* Parsing of key-bindings begins in an enabled state. */
991*6b445a62SJohn Marino _rl_parsing_conditionalized_out = 0;
992*6b445a62SJohn Marino
993*6b445a62SJohn Marino #if defined (VI_MODE)
994*6b445a62SJohn Marino if (rl_editing_mode == vi_mode)
995*6b445a62SJohn Marino _rl_vi_initialize_line ();
996*6b445a62SJohn Marino #endif
997*6b445a62SJohn Marino
998*6b445a62SJohn Marino /* Each line starts in insert mode (the default). */
999*6b445a62SJohn Marino _rl_set_insert_mode (RL_IM_DEFAULT, 1);
1000*6b445a62SJohn Marino
1001*6b445a62SJohn Marino return 0;
1002*6b445a62SJohn Marino }
1003*6b445a62SJohn Marino
1004*6b445a62SJohn Marino #if 0
1005*6b445a62SJohn Marino #if defined (__EMX__)
1006*6b445a62SJohn Marino static void
1007*6b445a62SJohn Marino _emx_build_environ ()
1008*6b445a62SJohn Marino {
1009*6b445a62SJohn Marino TIB *tibp;
1010*6b445a62SJohn Marino PIB *pibp;
1011*6b445a62SJohn Marino char *t, **tp;
1012*6b445a62SJohn Marino int c;
1013*6b445a62SJohn Marino
1014*6b445a62SJohn Marino DosGetInfoBlocks (&tibp, &pibp);
1015*6b445a62SJohn Marino t = pibp->pib_pchenv;
1016*6b445a62SJohn Marino for (c = 1; *t; c++)
1017*6b445a62SJohn Marino t += strlen (t) + 1;
1018*6b445a62SJohn Marino tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
1019*6b445a62SJohn Marino t = pibp->pib_pchenv;
1020*6b445a62SJohn Marino while (*t)
1021*6b445a62SJohn Marino {
1022*6b445a62SJohn Marino *tp++ = t;
1023*6b445a62SJohn Marino t += strlen (t) + 1;
1024*6b445a62SJohn Marino }
1025*6b445a62SJohn Marino *tp = 0;
1026*6b445a62SJohn Marino }
1027*6b445a62SJohn Marino #endif /* __EMX__ */
1028*6b445a62SJohn Marino #endif
1029*6b445a62SJohn Marino
1030*6b445a62SJohn Marino /* Initialize the entire state of the world. */
1031*6b445a62SJohn Marino static void
readline_initialize_everything()1032*6b445a62SJohn Marino readline_initialize_everything ()
1033*6b445a62SJohn Marino {
1034*6b445a62SJohn Marino #if 0
1035*6b445a62SJohn Marino #if defined (__EMX__)
1036*6b445a62SJohn Marino if (environ == 0)
1037*6b445a62SJohn Marino _emx_build_environ ();
1038*6b445a62SJohn Marino #endif
1039*6b445a62SJohn Marino #endif
1040*6b445a62SJohn Marino
1041*6b445a62SJohn Marino #if 0
1042*6b445a62SJohn Marino /* Find out if we are running in Emacs -- UNUSED. */
1043*6b445a62SJohn Marino running_in_emacs = sh_get_env_value ("EMACS") != (char *)0;
1044*6b445a62SJohn Marino #endif
1045*6b445a62SJohn Marino
1046*6b445a62SJohn Marino /* Set up input and output if they are not already set up. */
1047*6b445a62SJohn Marino if (!rl_instream)
1048*6b445a62SJohn Marino rl_instream = stdin;
1049*6b445a62SJohn Marino
1050*6b445a62SJohn Marino if (!rl_outstream)
1051*6b445a62SJohn Marino rl_outstream = stdout;
1052*6b445a62SJohn Marino
1053*6b445a62SJohn Marino /* Bind _rl_in_stream and _rl_out_stream immediately. These values
1054*6b445a62SJohn Marino may change, but they may also be used before readline_internal ()
1055*6b445a62SJohn Marino is called. */
1056*6b445a62SJohn Marino _rl_in_stream = rl_instream;
1057*6b445a62SJohn Marino _rl_out_stream = rl_outstream;
1058*6b445a62SJohn Marino
1059*6b445a62SJohn Marino /* Allocate data structures. */
1060*6b445a62SJohn Marino if (rl_line_buffer == 0)
1061*6b445a62SJohn Marino rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
1062*6b445a62SJohn Marino
1063*6b445a62SJohn Marino /* Initialize the terminal interface. */
1064*6b445a62SJohn Marino if (rl_terminal_name == 0)
1065*6b445a62SJohn Marino rl_terminal_name = sh_get_env_value ("TERM");
1066*6b445a62SJohn Marino _rl_init_terminal_io (rl_terminal_name);
1067*6b445a62SJohn Marino
1068*6b445a62SJohn Marino /* Bind tty characters to readline functions. */
1069*6b445a62SJohn Marino readline_default_bindings ();
1070*6b445a62SJohn Marino
1071*6b445a62SJohn Marino /* Initialize the function names. */
1072*6b445a62SJohn Marino rl_initialize_funmap ();
1073*6b445a62SJohn Marino
1074*6b445a62SJohn Marino /* Decide whether we should automatically go into eight-bit mode. */
1075*6b445a62SJohn Marino _rl_init_eightbit ();
1076*6b445a62SJohn Marino
1077*6b445a62SJohn Marino /* Read in the init file. */
1078*6b445a62SJohn Marino rl_read_init_file ((char *)NULL);
1079*6b445a62SJohn Marino
1080*6b445a62SJohn Marino /* XXX */
1081*6b445a62SJohn Marino if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
1082*6b445a62SJohn Marino {
1083*6b445a62SJohn Marino _rl_screenwidth--;
1084*6b445a62SJohn Marino _rl_screenchars -= _rl_screenheight;
1085*6b445a62SJohn Marino }
1086*6b445a62SJohn Marino
1087*6b445a62SJohn Marino /* Override the effect of any `set keymap' assignments in the
1088*6b445a62SJohn Marino inputrc file. */
1089*6b445a62SJohn Marino rl_set_keymap_from_edit_mode ();
1090*6b445a62SJohn Marino
1091*6b445a62SJohn Marino /* Try to bind a common arrow key prefix, if not already bound. */
1092*6b445a62SJohn Marino bind_arrow_keys ();
1093*6b445a62SJohn Marino
1094*6b445a62SJohn Marino /* Enable the meta key, if this terminal has one. */
1095*6b445a62SJohn Marino if (_rl_enable_meta)
1096*6b445a62SJohn Marino _rl_enable_meta_key ();
1097*6b445a62SJohn Marino
1098*6b445a62SJohn Marino /* If the completion parser's default word break characters haven't
1099*6b445a62SJohn Marino been set yet, then do so now. */
1100*6b445a62SJohn Marino if (rl_completer_word_break_characters == (char *)NULL)
1101*6b445a62SJohn Marino rl_completer_word_break_characters = (char *)rl_basic_word_break_characters;
1102*6b445a62SJohn Marino }
1103*6b445a62SJohn Marino
1104*6b445a62SJohn Marino /* If this system allows us to look at the values of the regular
1105*6b445a62SJohn Marino input editing characters, then bind them to their readline
1106*6b445a62SJohn Marino equivalents, iff the characters are not bound to keymaps. */
1107*6b445a62SJohn Marino static void
readline_default_bindings()1108*6b445a62SJohn Marino readline_default_bindings ()
1109*6b445a62SJohn Marino {
1110*6b445a62SJohn Marino if (_rl_bind_stty_chars)
1111*6b445a62SJohn Marino rl_tty_set_default_bindings (_rl_keymap);
1112*6b445a62SJohn Marino }
1113*6b445a62SJohn Marino
1114*6b445a62SJohn Marino /* Reset the default bindings for the terminal special characters we're
1115*6b445a62SJohn Marino interested in back to rl_insert and read the new ones. */
1116*6b445a62SJohn Marino static void
reset_default_bindings()1117*6b445a62SJohn Marino reset_default_bindings ()
1118*6b445a62SJohn Marino {
1119*6b445a62SJohn Marino if (_rl_bind_stty_chars)
1120*6b445a62SJohn Marino {
1121*6b445a62SJohn Marino rl_tty_unset_default_bindings (_rl_keymap);
1122*6b445a62SJohn Marino rl_tty_set_default_bindings (_rl_keymap);
1123*6b445a62SJohn Marino }
1124*6b445a62SJohn Marino }
1125*6b445a62SJohn Marino
1126*6b445a62SJohn Marino /* Bind some common arrow key sequences in MAP. */
1127*6b445a62SJohn Marino static void
bind_arrow_keys_internal(map)1128*6b445a62SJohn Marino bind_arrow_keys_internal (map)
1129*6b445a62SJohn Marino Keymap map;
1130*6b445a62SJohn Marino {
1131*6b445a62SJohn Marino Keymap xkeymap;
1132*6b445a62SJohn Marino
1133*6b445a62SJohn Marino xkeymap = _rl_keymap;
1134*6b445a62SJohn Marino _rl_keymap = map;
1135*6b445a62SJohn Marino
1136*6b445a62SJohn Marino #if defined (__MSDOS__)
1137*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history);
1138*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char);
1139*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char);
1140*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history);
1141*6b445a62SJohn Marino #endif
1142*6b445a62SJohn Marino
1143*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history);
1144*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history);
1145*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char);
1146*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char);
1147*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line);
1148*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line);
1149*6b445a62SJohn Marino
1150*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history);
1151*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history);
1152*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char);
1153*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char);
1154*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line);
1155*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line);
1156*6b445a62SJohn Marino
1157*6b445a62SJohn Marino #if defined (__MINGW32__)
1158*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history);
1159*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history);
1160*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\340M", rl_forward_char);
1161*6b445a62SJohn Marino rl_bind_keyseq_if_unbound ("\340K", rl_backward_char);
1162*6b445a62SJohn Marino #endif
1163*6b445a62SJohn Marino
1164*6b445a62SJohn Marino _rl_keymap = xkeymap;
1165*6b445a62SJohn Marino }
1166*6b445a62SJohn Marino
1167*6b445a62SJohn Marino /* Try and bind the common arrow key prefixes after giving termcap and
1168*6b445a62SJohn Marino the inputrc file a chance to bind them and create `real' keymaps
1169*6b445a62SJohn Marino for the arrow key prefix. */
1170*6b445a62SJohn Marino static void
bind_arrow_keys()1171*6b445a62SJohn Marino bind_arrow_keys ()
1172*6b445a62SJohn Marino {
1173*6b445a62SJohn Marino bind_arrow_keys_internal (emacs_standard_keymap);
1174*6b445a62SJohn Marino
1175*6b445a62SJohn Marino #if defined (VI_MODE)
1176*6b445a62SJohn Marino bind_arrow_keys_internal (vi_movement_keymap);
1177*6b445a62SJohn Marino /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC
1178*6b445a62SJohn Marino in vi command mode while still allowing the arrow keys to work. */
1179*6b445a62SJohn Marino if (vi_movement_keymap[ESC].type == ISKMAP)
1180*6b445a62SJohn Marino rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap);
1181*6b445a62SJohn Marino bind_arrow_keys_internal (vi_insertion_keymap);
1182*6b445a62SJohn Marino #endif
1183*6b445a62SJohn Marino }
1184*6b445a62SJohn Marino
1185*6b445a62SJohn Marino /* **************************************************************** */
1186*6b445a62SJohn Marino /* */
1187*6b445a62SJohn Marino /* Saving and Restoring Readline's state */
1188*6b445a62SJohn Marino /* */
1189*6b445a62SJohn Marino /* **************************************************************** */
1190*6b445a62SJohn Marino
1191*6b445a62SJohn Marino int
rl_save_state(sp)1192*6b445a62SJohn Marino rl_save_state (sp)
1193*6b445a62SJohn Marino struct readline_state *sp;
1194*6b445a62SJohn Marino {
1195*6b445a62SJohn Marino if (sp == 0)
1196*6b445a62SJohn Marino return -1;
1197*6b445a62SJohn Marino
1198*6b445a62SJohn Marino sp->point = rl_point;
1199*6b445a62SJohn Marino sp->end = rl_end;
1200*6b445a62SJohn Marino sp->mark = rl_mark;
1201*6b445a62SJohn Marino sp->buffer = rl_line_buffer;
1202*6b445a62SJohn Marino sp->buflen = rl_line_buffer_len;
1203*6b445a62SJohn Marino sp->ul = rl_undo_list;
1204*6b445a62SJohn Marino sp->prompt = rl_prompt;
1205*6b445a62SJohn Marino
1206*6b445a62SJohn Marino sp->rlstate = rl_readline_state;
1207*6b445a62SJohn Marino sp->done = rl_done;
1208*6b445a62SJohn Marino sp->kmap = _rl_keymap;
1209*6b445a62SJohn Marino
1210*6b445a62SJohn Marino sp->lastfunc = rl_last_func;
1211*6b445a62SJohn Marino sp->insmode = rl_insert_mode;
1212*6b445a62SJohn Marino sp->edmode = rl_editing_mode;
1213*6b445a62SJohn Marino sp->kseqlen = rl_key_sequence_length;
1214*6b445a62SJohn Marino sp->inf = rl_instream;
1215*6b445a62SJohn Marino sp->outf = rl_outstream;
1216*6b445a62SJohn Marino sp->pendingin = rl_pending_input;
1217*6b445a62SJohn Marino sp->macro = rl_executing_macro;
1218*6b445a62SJohn Marino
1219*6b445a62SJohn Marino sp->catchsigs = rl_catch_signals;
1220*6b445a62SJohn Marino sp->catchsigwinch = rl_catch_sigwinch;
1221*6b445a62SJohn Marino
1222*6b445a62SJohn Marino return (0);
1223*6b445a62SJohn Marino }
1224*6b445a62SJohn Marino
1225*6b445a62SJohn Marino int
rl_restore_state(sp)1226*6b445a62SJohn Marino rl_restore_state (sp)
1227*6b445a62SJohn Marino struct readline_state *sp;
1228*6b445a62SJohn Marino {
1229*6b445a62SJohn Marino if (sp == 0)
1230*6b445a62SJohn Marino return -1;
1231*6b445a62SJohn Marino
1232*6b445a62SJohn Marino rl_point = sp->point;
1233*6b445a62SJohn Marino rl_end = sp->end;
1234*6b445a62SJohn Marino rl_mark = sp->mark;
1235*6b445a62SJohn Marino the_line = rl_line_buffer = sp->buffer;
1236*6b445a62SJohn Marino rl_line_buffer_len = sp->buflen;
1237*6b445a62SJohn Marino rl_undo_list = sp->ul;
1238*6b445a62SJohn Marino rl_prompt = sp->prompt;
1239*6b445a62SJohn Marino
1240*6b445a62SJohn Marino rl_readline_state = sp->rlstate;
1241*6b445a62SJohn Marino rl_done = sp->done;
1242*6b445a62SJohn Marino _rl_keymap = sp->kmap;
1243*6b445a62SJohn Marino
1244*6b445a62SJohn Marino rl_last_func = sp->lastfunc;
1245*6b445a62SJohn Marino rl_insert_mode = sp->insmode;
1246*6b445a62SJohn Marino rl_editing_mode = sp->edmode;
1247*6b445a62SJohn Marino rl_key_sequence_length = sp->kseqlen;
1248*6b445a62SJohn Marino rl_instream = sp->inf;
1249*6b445a62SJohn Marino rl_outstream = sp->outf;
1250*6b445a62SJohn Marino rl_pending_input = sp->pendingin;
1251*6b445a62SJohn Marino rl_executing_macro = sp->macro;
1252*6b445a62SJohn Marino
1253*6b445a62SJohn Marino rl_catch_signals = sp->catchsigs;
1254*6b445a62SJohn Marino rl_catch_sigwinch = sp->catchsigwinch;
1255*6b445a62SJohn Marino
1256*6b445a62SJohn Marino return (0);
1257*6b445a62SJohn Marino }
1258