1 /* bashline.c -- Bash's interface to the readline library. */
3 /* Copyright (C) 1987-2006 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 Bash is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23 #if defined (READLINE)
25 #include "bashtypes.h"
26 #include "posixstat.h"
28 #if defined (HAVE_UNISTD_H)
32 #if defined (HAVE_GRP_H)
36 #if defined (HAVE_NETDB_H)
41 #include "chartypes.h"
50 #include "execute_cmd.h"
53 #include "builtins/common.h"
54 #include <readline/rlconf.h>
55 #include <readline/readline.h>
56 #include <readline/history.h>
58 #include <glob/glob.h>
64 #if defined (PROGRAMMABLE_COMPLETION)
65 # include "pcomplete.h"
68 /* These should agree with the defines for emacs_mode and vi_mode in
69 rldefs.h, even though that's not a public readline header file. */
70 #ifndef EMACS_EDITING_MODE
71 # define NO_EDITING_MODE -1
72 # define EMACS_EDITING_MODE 1
73 # define VI_EDITING_MODE 0
76 #if defined (BRACE_COMPLETION)
77 extern int bash_brace_completion
__P((int, int));
78 #endif /* BRACE_COMPLETION */
80 /* Forward declarations */
82 /* Functions bound to keys in Readline for Bash users. */
83 static int shell_expand_line
__P((int, int));
84 static int display_shell_version
__P((int, int));
85 static int operate_and_get_next
__P((int, int));
87 static int bash_ignore_filenames
__P((char **));
88 static int bash_ignore_everything
__P((char **));
90 #if defined (BANG_HISTORY)
91 static char *history_expand_line_internal
__P((char *));
92 static int history_expand_line
__P((int, int));
93 static int tcsh_magic_space
__P((int, int));
94 #endif /* BANG_HISTORY */
96 static int alias_expand_line
__P((int, int));
98 #if defined (BANG_HISTORY) && defined (ALIAS)
99 static int history_and_alias_expand_line
__P((int, int));
102 /* Helper functions for Readline. */
103 static void bash_directory_expansion
__P((char **));
104 static int bash_directory_completion_hook
__P((char **));
105 static int filename_completion_ignore
__P((char **));
106 static int bash_push_line
__P((void));
108 static void cleanup_expansion_error
__P((void));
109 static void maybe_make_readline_line
__P((char *));
110 static void set_up_new_line
__P((char *));
112 static int check_redir
__P((int));
113 static char **attempt_shell_completion
__P((const char *, int, int));
114 static char *variable_completion_function
__P((const char *, int));
115 static char *hostname_completion_function
__P((const char *, int));
116 static char *command_subst_completion_function
__P((const char *, int));
118 static void build_history_completion_array
__P((void));
119 static char *history_completion_generator
__P((const char *, int));
120 static int dynamic_complete_history
__P((int, int));
122 static void initialize_hostname_list
__P((void));
123 static void add_host_name
__P((char *));
124 static void snarf_hosts_from_file
__P((char *));
125 static char **hostnames_matching
__P((char *));
127 static void _ignore_completion_names
__P((char **, sh_ignore_func_t
*));
128 static int name_is_acceptable
__P((const char *));
129 static int test_for_directory
__P((const char *));
130 static int return_zero
__P((const char *));
132 static char *bash_dequote_filename
__P((char *, int));
133 static char *quote_word_break_chars
__P((char *));
134 static char *bash_quote_filename
__P((char *, int, char *));
136 static int bash_execute_unix_command
__P((int, int));
137 static void init_unix_command_map
__P((void));
138 static int isolate_sequence
__P((char *, int, int, int *));
140 static int set_saved_history
__P((void));
143 static int posix_edit_macros
__P((int, int));
146 #if defined (PROGRAMMABLE_COMPLETION)
147 static int find_cmd_start
__P((int));
148 static int find_cmd_end
__P((int));
149 static char *find_cmd_name
__P((int));
150 static char *prog_complete_return
__P((const char *, int));
152 static char **prog_complete_matches
;
155 /* Variables used here but defined in other files. */
156 #if defined (BANG_HISTORY)
157 extern int hist_verify
;
160 extern int current_command_line_count
, last_command_exit_value
;
161 extern int posixly_correct
, no_symbolic_links
;
162 extern char *current_prompt_string
, *ps1_prompt
;
163 extern STRING_INT_ALIST word_token_alist
[];
164 extern sh_builtin_func_t
*last_shell_builtin
, *this_shell_builtin
;
166 /* SPECIFIC_COMPLETION_FUNCTIONS specifies that we have individual
167 completion functions which indicate what type of completion should be
168 done (at or before point) that can be bound to key sequences with
169 the readline library. */
170 #define SPECIFIC_COMPLETION_FUNCTIONS
172 #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
173 static int bash_specific_completion
__P((int, rl_compentry_func_t
*));
175 static int bash_complete_filename_internal
__P((int));
176 static int bash_complete_username_internal
__P((int));
177 static int bash_complete_hostname_internal
__P((int));
178 static int bash_complete_variable_internal
__P((int));
179 static int bash_complete_command_internal
__P((int));
181 static int bash_complete_filename
__P((int, int));
182 static int bash_possible_filename_completions
__P((int, int));
183 static int bash_complete_username
__P((int, int));
184 static int bash_possible_username_completions
__P((int, int));
185 static int bash_complete_hostname
__P((int, int));
186 static int bash_possible_hostname_completions
__P((int, int));
187 static int bash_complete_variable
__P((int, int));
188 static int bash_possible_variable_completions
__P((int, int));
189 static int bash_complete_command
__P((int, int));
190 static int bash_possible_command_completions
__P((int, int));
192 static char *glob_complete_word
__P((const char *, int));
193 static int bash_glob_completion_internal
__P((int));
194 static int bash_glob_complete_word
__P((int, int));
195 static int bash_glob_expand_word
__P((int, int));
196 static int bash_glob_list_expansions
__P((int, int));
198 #endif /* SPECIFIC_COMPLETION_FUNCTIONS */
200 static int edit_and_execute_command
__P((int, int, int, char *));
201 #if defined (VI_MODE)
202 static int vi_edit_and_execute_command
__P((int, int));
203 static int bash_vi_complete
__P((int, int));
205 static int emacs_edit_and_execute_command
__P((int, int));
207 /* Non-zero once initalize_readline () has been called. */
208 int bash_readline_initialized
= 0;
210 /* If non-zero, we do hostname completion, breaking words at `@' and
211 trying to complete the stuff after the `@' from our own internal
213 int perform_hostname_completion
= 1;
215 /* If non-zero, we don't do command completion on an empty line. */
216 int no_empty_command_completion
;
218 /* Set FORCE_FIGNORE if you want to honor FIGNORE even if it ignores the
219 only possible matches. Set to 0 if you want to match filenames if they
220 are the only possible matches, even if FIGNORE says to. */
221 int force_fignore
= 1;
223 static char *bash_completer_word_break_characters
= " \t\n\"'@><=;|&(:";
224 static char *bash_nohostname_word_break_characters
= " \t\n\"'><=;|&(:";
227 static rl_hook_func_t
*old_rl_startup_hook
= (rl_hook_func_t
*)NULL
;
229 static int dot_in_path
= 0;
231 /* What kind of quoting is performed by bash_quote_filename:
232 COMPLETE_DQUOTE = double-quoting the filename
233 COMPLETE_SQUOTE = single_quoting the filename
234 COMPLETE_BSQUOTE = backslash-quoting special chars in the filename
236 #define COMPLETE_DQUOTE 1
237 #define COMPLETE_SQUOTE 2
238 #define COMPLETE_BSQUOTE 3
239 static int completion_quoting_style
= COMPLETE_BSQUOTE
;
241 /* Flag values for the final argument to bash_default_completion */
242 #define DEFCOMP_CMDPOS 1
244 /* Change the readline VI-mode keymaps into or out of Posix.2 compliance.
245 Called when the shell is put into or out of `posix' mode. */
247 posix_readline_initialize (on_or_off
)
251 rl_variable_bind ("comment-begin", "#");
252 #if defined (VI_MODE)
253 rl_bind_key_in_map (CTRL ('I'), on_or_off
? rl_insert
: rl_complete
, vi_insertion_keymap
);
257 /* When this function returns, rl_completer_word_break_characters points to
258 dynamically allocated memory. */
260 enable_hostname_completion (on_or_off
)
264 char *at
, *nv
, *nval
;
266 old_value
= perform_hostname_completion
;
270 perform_hostname_completion
= 1;
271 rl_special_prefixes
= "$@";
275 perform_hostname_completion
= 0;
276 rl_special_prefixes
= "$";
279 /* Now we need to figure out how to appropriately modify and assign
280 rl_completer_word_break_characters depending on whether we want
281 hostname completion on or off. */
283 /* If this is the first time this has been called
284 (bash_readline_initialized == 0), use the sames values as before, but
285 allocate new memory for rl_completer_word_break_characters. */
287 if (bash_readline_initialized
== 0 &&
288 (rl_completer_word_break_characters
== 0 ||
289 rl_completer_word_break_characters
== rl_basic_word_break_characters
))
292 rl_completer_word_break_characters
= savestring (bash_completer_word_break_characters
);
294 rl_completer_word_break_characters
= savestring (bash_nohostname_word_break_characters
);
298 /* See if we have anything to do. */
299 at
= strchr (rl_completer_word_break_characters
, '@');
300 if ((at
== 0 && on_or_off
== 0) || (at
!= 0 && on_or_off
!= 0))
303 /* We have something to do. Do it. */
304 nval
= (char *)xmalloc (strlen (rl_completer_word_break_characters
) + 1 + on_or_off
);
308 /* Turn it off -- just remove `@' from word break chars. We want
309 to remove all occurrences of `@' from the char list, so we loop
310 rather than just copy the rest of the list over AT. */
311 for (nv
= nval
, at
= rl_completer_word_break_characters
; *at
; )
321 strcpy (nval
+ 1, rl_completer_word_break_characters
);
324 free (rl_completer_word_break_characters
);
325 rl_completer_word_break_characters
= nval
;
331 /* Called once from parse.y if we are going to use readline. */
333 initialize_readline ()
335 rl_command_func_t
*func
;
338 if (bash_readline_initialized
)
341 rl_terminal_name
= get_string_value ("TERM");
343 rl_outstream
= stderr
;
345 /* Allow conditional parsing of the ~/.inputrc file. */
346 rl_readline_name
= "Bash";
348 /* Add bindable names before calling rl_initialize so they may be
349 referenced in the various inputrc files. */
350 rl_add_defun ("shell-expand-line", shell_expand_line
, -1);
352 rl_add_defun ("history-expand-line", history_expand_line
, -1);
353 rl_add_defun ("magic-space", tcsh_magic_space
, -1);
357 rl_add_defun ("alias-expand-line", alias_expand_line
, -1);
359 rl_add_defun ("history-and-alias-expand-line", history_and_alias_expand_line
, -1);
363 /* Backwards compatibility. */
364 rl_add_defun ("insert-last-argument", rl_yank_last_arg
, -1);
366 rl_add_defun ("operate-and-get-next", operate_and_get_next
, -1);
367 rl_add_defun ("display-shell-version", display_shell_version
, -1);
368 rl_add_defun ("edit-and-execute-command", emacs_edit_and_execute_command
, -1);
370 #if defined (BRACE_COMPLETION)
371 rl_add_defun ("complete-into-braces", bash_brace_completion
, -1);
374 #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
375 rl_add_defun ("complete-filename", bash_complete_filename
, -1);
376 rl_add_defun ("possible-filename-completions", bash_possible_filename_completions
, -1);
377 rl_add_defun ("complete-username", bash_complete_username
, -1);
378 rl_add_defun ("possible-username-completions", bash_possible_username_completions
, -1);
379 rl_add_defun ("complete-hostname", bash_complete_hostname
, -1);
380 rl_add_defun ("possible-hostname-completions", bash_possible_hostname_completions
, -1);
381 rl_add_defun ("complete-variable", bash_complete_variable
, -1);
382 rl_add_defun ("possible-variable-completions", bash_possible_variable_completions
, -1);
383 rl_add_defun ("complete-command", bash_complete_command
, -1);
384 rl_add_defun ("possible-command-completions", bash_possible_command_completions
, -1);
385 rl_add_defun ("glob-complete-word", bash_glob_complete_word
, -1);
386 rl_add_defun ("glob-expand-word", bash_glob_expand_word
, -1);
387 rl_add_defun ("glob-list-expansions", bash_glob_list_expansions
, -1);
390 rl_add_defun ("dynamic-complete-history", dynamic_complete_history
, -1);
392 /* Bind defaults before binding our custom shell keybindings. */
393 if (RL_ISSTATE(RL_STATE_INITIALIZED
) == 0)
396 /* Bind up our special shell functions. */
397 rl_bind_key_if_unbound_in_map (CTRL('E'), shell_expand_line
, emacs_meta_keymap
);
400 rl_bind_key_if_unbound_in_map ('^', history_expand_line
, emacs_meta_keymap
);
403 rl_bind_key_if_unbound_in_map (CTRL ('O'), operate_and_get_next
, emacs_standard_keymap
);
404 rl_bind_key_if_unbound_in_map (CTRL ('V'), display_shell_version
, emacs_ctlx_keymap
);
406 /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
407 so it is not necessary to allow C-M-j for context switching. Turn
408 off this occasionally confusing behaviour. */
411 func
= rl_function_of_keyseq (kseq
, emacs_meta_keymap
, (int *)NULL
);
412 if (func
== rl_vi_editing_mode
)
413 rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap
);
415 func
= rl_function_of_keyseq (kseq
, emacs_meta_keymap
, (int *)NULL
);
416 if (func
== rl_vi_editing_mode
)
417 rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap
);
418 #if defined (VI_MODE)
419 rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap
);
422 #if defined (BRACE_COMPLETION)
423 rl_bind_key_if_unbound_in_map ('{', bash_brace_completion
, emacs_meta_keymap
); /*}*/
424 #endif /* BRACE_COMPLETION */
426 #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
427 rl_bind_key_if_unbound_in_map ('/', bash_complete_filename
, emacs_meta_keymap
);
428 rl_bind_key_if_unbound_in_map ('/', bash_possible_filename_completions
, emacs_ctlx_keymap
);
430 /* Have to jump through hoops here because there is a default binding for
431 M-~ (rl_tilde_expand) */
434 func
= rl_function_of_keyseq (kseq
, emacs_meta_keymap
, (int *)NULL
);
435 if (func
== 0 || func
== rl_tilde_expand
)
436 rl_bind_keyseq_in_map (kseq
, bash_complete_username
, emacs_meta_keymap
);
438 rl_bind_key_if_unbound_in_map ('~', bash_possible_username_completions
, emacs_ctlx_keymap
);
440 rl_bind_key_if_unbound_in_map ('@', bash_complete_hostname
, emacs_meta_keymap
);
441 rl_bind_key_if_unbound_in_map ('@', bash_possible_hostname_completions
, emacs_ctlx_keymap
);
443 rl_bind_key_if_unbound_in_map ('$', bash_complete_variable
, emacs_meta_keymap
);
444 rl_bind_key_if_unbound_in_map ('$', bash_possible_variable_completions
, emacs_ctlx_keymap
);
446 rl_bind_key_if_unbound_in_map ('!', bash_complete_command
, emacs_meta_keymap
);
447 rl_bind_key_if_unbound_in_map ('!', bash_possible_command_completions
, emacs_ctlx_keymap
);
449 rl_bind_key_if_unbound_in_map ('g', bash_glob_complete_word
, emacs_meta_keymap
);
450 rl_bind_key_if_unbound_in_map ('*', bash_glob_expand_word
, emacs_ctlx_keymap
);
451 rl_bind_key_if_unbound_in_map ('g', bash_glob_list_expansions
, emacs_ctlx_keymap
);
453 #endif /* SPECIFIC_COMPLETION_FUNCTIONS */
457 func
= rl_function_of_keyseq (kseq
, emacs_meta_keymap
, (int *)NULL
);
458 if (func
== 0 || func
== rl_tab_insert
)
459 rl_bind_key_in_map (TAB
, dynamic_complete_history
, emacs_meta_keymap
);
461 /* Tell the completer that we want a crack first. */
462 rl_attempted_completion_function
= attempt_shell_completion
;
464 /* Tell the completer that we might want to follow symbolic links or
465 do other expansion on directory names. */
466 rl_directory_completion_hook
= bash_directory_completion_hook
;
468 /* Tell the filename completer we want a chance to ignore some names. */
469 rl_ignore_some_completions_function
= filename_completion_ignore
;
471 /* Bind C-xC-e to invoke emacs and run result as commands. */
472 rl_bind_key_if_unbound_in_map (CTRL ('E'), emacs_edit_and_execute_command
, emacs_ctlx_keymap
);
473 #if defined (VI_MODE)
474 rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command
, vi_movement_keymap
);
476 rl_bind_key_if_unbound_in_map ('@', posix_edit_macros
, vi_movement_keymap
);
479 rl_bind_key_in_map ('\\', bash_vi_complete
, vi_movement_keymap
);
480 rl_bind_key_in_map ('*', bash_vi_complete
, vi_movement_keymap
);
481 rl_bind_key_in_map ('=', bash_vi_complete
, vi_movement_keymap
);
484 rl_completer_quote_characters
= "'\"";
486 /* This sets rl_completer_word_break_characters and rl_special_prefixes
487 to the appropriate values, depending on whether or not hostname
488 completion is enabled. */
489 enable_hostname_completion (perform_hostname_completion
);
491 /* characters that need to be quoted when appearing in filenames. */
492 rl_filename_quote_characters
= " \t\n\\\"'@<>=;|&()#$`?*[!:{"; /*}*/
493 rl_filename_quoting_function
= bash_quote_filename
;
494 rl_filename_dequoting_function
= bash_dequote_filename
;
495 rl_char_is_quoted_p
= char_is_quoted
;
498 /* This is superfluous and makes it impossible to use tab completion in
499 vi mode even when explicitly binding it in ~/.inputrc. sv_strict_posix()
500 should already have called posix_readline_initialize() when
501 posixly_correct was set. */
503 posix_readline_initialize (1);
506 bash_readline_initialized
= 1;
509 /* On Sun systems at least, rl_attempted_completion_function can end up
510 getting set to NULL, and rl_completion_entry_function set to do command
511 word completion if Bash is interrupted while trying to complete a command
512 word. This just resets all the completion functions to the right thing.
513 It's called from throw_to_top_level(). */
515 bashline_reinitialize ()
518 rl_attempted_completion_function
= attempt_shell_completion
;
519 rl_completion_entry_function
= NULL
;
520 rl_directory_completion_hook
= bash_directory_completion_hook
;
521 rl_ignore_some_completions_function
= filename_completion_ignore
;
524 /* Contains the line to push into readline. */
525 static char *push_to_readline
= (char *)NULL
;
527 /* Push the contents of push_to_readline into the
532 if (push_to_readline
)
534 rl_insert_text (push_to_readline
);
535 free (push_to_readline
);
536 push_to_readline
= (char *)NULL
;
537 rl_startup_hook
= old_rl_startup_hook
;
542 /* Call this to set the initial text for the next line to read
548 FREE (push_to_readline
);
550 push_to_readline
= savestring (line
);
551 old_rl_startup_hook
= rl_startup_hook
;
552 rl_startup_hook
= bash_push_line
;
558 display_shell_version (count
, c
)
562 show_shell_version (0);
563 putc ('\r', rl_outstream
);
564 fflush (rl_outstream
);
570 /* **************************************************************** */
574 /* **************************************************************** */
576 /* If the user requests hostname completion, then simply build a list
577 of hosts, and complete from that forever more, or at least until
578 HOSTFILE is unset. */
580 /* THIS SHOULD BE A STRINGLIST. */
581 /* The kept list of hostnames. */
582 static char **hostname_list
= (char **)NULL
;
584 /* The physical size of the above list. */
585 static int hostname_list_size
;
587 /* The number of hostnames in the above list. */
588 static int hostname_list_length
;
590 /* Whether or not HOSTNAME_LIST has been initialized. */
591 int hostname_list_initialized
= 0;
593 /* Initialize the hostname completion table. */
595 initialize_hostname_list ()
599 temp
= get_string_value ("HOSTFILE");
601 temp
= get_string_value ("hostname_completion_file");
603 temp
= DEFAULT_HOSTS_FILE
;
605 snarf_hosts_from_file (temp
);
608 hostname_list_initialized
++;
611 /* Add NAME to the list of hosts. */
616 if (hostname_list_length
+ 2 > hostname_list_size
)
618 hostname_list_size
= (hostname_list_size
+ 32) - (hostname_list_size
% 32);
619 hostname_list
= strvec_resize (hostname_list
, hostname_list_size
);
622 hostname_list
[hostname_list_length
++] = savestring (name
);
623 hostname_list
[hostname_list_length
] = (char *)NULL
;
626 #define cr_whitespace(c) ((c) == '\r' || (c) == '\n' || whitespace(c))
629 snarf_hosts_from_file (filename
)
633 char *temp
, buffer
[256], name
[256];
634 register int i
, start
;
636 file
= fopen (filename
, "r");
640 while (temp
= fgets (buffer
, 255, file
))
642 /* Skip to first character. */
643 for (i
= 0; buffer
[i
] && cr_whitespace (buffer
[i
]); i
++)
646 /* If comment or blank line, ignore. */
647 if (buffer
[i
] == '\0' || buffer
[i
] == '#')
650 /* If `preprocessor' directive, do the include. */
651 if (strncmp (buffer
+ i
, "$include ", 9) == 0)
655 /* Find start of filename. */
656 for (incfile
= buffer
+ i
+ 9; *incfile
&& whitespace (*incfile
); incfile
++)
659 /* Find end of filename. */
660 for (t
= incfile
; *t
&& cr_whitespace (*t
) == 0; t
++)
665 snarf_hosts_from_file (incfile
);
669 /* Skip internet address if present. */
670 if (DIGIT (buffer
[i
]))
671 for (; buffer
[i
] && cr_whitespace (buffer
[i
]) == 0; i
++);
673 /* Gobble up names. Each name is separated with whitespace. */
676 for (; cr_whitespace (buffer
[i
]); i
++)
678 if (buffer
[i
] == '\0' || buffer
[i
] == '#')
681 /* Isolate the current word. */
682 for (start
= i
; buffer
[i
] && cr_whitespace (buffer
[i
]) == 0; i
++)
686 strncpy (name
, buffer
+ start
, i
- start
);
687 name
[i
- start
] = '\0';
688 add_host_name (name
);
694 /* Return the hostname list. */
698 if (hostname_list_initialized
== 0)
699 initialize_hostname_list ();
700 return (hostname_list
);
704 clear_hostname_list ()
708 if (hostname_list_initialized
== 0)
710 for (i
= 0; i
< hostname_list_length
; i
++)
711 free (hostname_list
[i
]);
712 hostname_list_length
= 0;
715 /* Return a NULL terminated list of hostnames which begin with TEXT.
716 Initialize the hostname list the first time if neccessary.
717 The array is malloc ()'ed, but not the individual strings. */
719 hostnames_matching (text
)
722 register int i
, len
, nmatch
, rsize
;
725 if (hostname_list_initialized
== 0)
726 initialize_hostname_list ();
728 if (hostname_list_initialized
== 0)
729 return ((char **)NULL
);
731 /* Special case. If TEXT consists of nothing, then the whole list is
735 result
= strvec_create (1 + hostname_list_length
);
736 for (i
= 0; i
< hostname_list_length
; i
++)
737 result
[i
] = hostname_list
[i
];
738 result
[i
] = (char *)NULL
;
742 /* Scan until found, or failure. */
744 result
= (char **)NULL
;
745 for (i
= nmatch
= rsize
= 0; i
< hostname_list_length
; i
++)
747 if (STREQN (text
, hostname_list
[i
], len
) == 0)
750 /* OK, it matches. Add it to the list. */
751 if (nmatch
>= (rsize
- 1))
753 rsize
= (rsize
+ 16) - (rsize
% 16);
754 result
= strvec_resize (result
, rsize
);
757 result
[nmatch
++] = hostname_list
[i
];
760 result
[nmatch
] = (char *)NULL
;
764 /* The equivalent of the Korn shell C-o operate-and-get-next-history-line
766 static int saved_history_line_to_use
= -1;
771 if (saved_history_line_to_use
>= 0)
772 rl_get_previous_history (history_length
- saved_history_line_to_use
, 0);
773 saved_history_line_to_use
= -1;
774 rl_startup_hook
= old_rl_startup_hook
;
779 operate_and_get_next (count
, c
)
784 /* Accept the current line. */
787 /* Find the current line, and find the next line to use. */
788 where
= where_history ();
790 if ((history_is_stifled () && (history_length
>= history_max_entries
)) ||
791 (where
>= history_length
- 1))
792 saved_history_line_to_use
= where
;
794 saved_history_line_to_use
= where
+ 1;
796 old_rl_startup_hook
= rl_startup_hook
;
797 rl_startup_hook
= set_saved_history
;
802 /* This vi mode command causes VI_EDIT_COMMAND to be run on the current
803 command being entered (if no explicit argument is given), otherwise on
804 a command from the history file. */
806 #define VI_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-vi}}\""
807 #define EMACS_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-emacs}}\""
808 #define POSIX_VI_EDIT_COMMAND "fc -e vi"
811 edit_and_execute_command (count
, c
, editing_mode
, edit_command
)
812 int count
, c
, editing_mode
;
818 rrs
= rl_readline_state
;
819 cclc
= current_command_line_count
;
821 /* Accept the current line. */
826 command
= (char *)xmalloc (strlen (edit_command
) + 8);
827 sprintf (command
, "%s %d", edit_command
, count
);
831 /* Take the command we were just editing, add it to the history file,
832 then call fc to operate on it. We have to add a dummy command to
833 the end of the history because fc ignores the last command (assumes
834 it's supposed to deal with the command before the `fc'). */
836 bash_add_history (rl_line_buffer
);
837 bash_add_history ("");
838 history_lines_this_session
++;
840 command
= savestring (edit_command
);
843 /* Now, POSIX.1-2001 and SUSv3 say that the commands executed from the
844 temporary file should be placed into the history. We don't do that
846 r
= parse_and_execute (command
, (editing_mode
== VI_EDITING_MODE
) ? "v" : "C-xC-e", SEVAL_NOHIST
);
848 current_command_line_count
= cclc
;
850 /* Now erase the contents of the current line and undo the effects of the
851 rl_accept_line() above. We don't even want to make the text we just
852 executed available for undoing. */
853 rl_line_buffer
[0] = '\0'; /* XXX */
854 rl_point
= rl_end
= 0;
856 rl_readline_state
= rrs
;
858 rl_forced_update_display ();
863 #if defined (VI_MODE)
865 vi_edit_and_execute_command (count
, c
)
869 return (edit_and_execute_command (count
, c
, VI_EDITING_MODE
, POSIX_VI_EDIT_COMMAND
));
871 return (edit_and_execute_command (count
, c
, VI_EDITING_MODE
, VI_EDIT_COMMAND
));
876 emacs_edit_and_execute_command (count
, c
)
879 return (edit_and_execute_command (count
, c
, EMACS_EDITING_MODE
, EMACS_EDIT_COMMAND
));
884 posix_edit_macros (count
, key
)
888 char alias_name
[3], *alias_value
, *macro
;
893 alias_name
[2] = '\0';
895 alias_value
= get_alias_value (alias_name
);
896 if (alias_value
&& *alias_value
)
898 macro
= savestring (alias_value
);
899 rl_push_macro_input (macro
);
905 /* **************************************************************** */
907 /* How To Do Shell Completion */
909 /* **************************************************************** */
911 #define COMMAND_SEPARATORS ";|&{(`"
918 register int this_char
, prev_char
;
920 /* Handle the two character tokens `>&', `<&', and `>|'.
921 We are not in a command position after one of these. */
922 this_char
= rl_line_buffer
[ti
];
923 prev_char
= rl_line_buffer
[ti
- 1];
925 if ((this_char
== '&' && (prev_char
== '<' || prev_char
== '>')) ||
926 (this_char
== '|' && prev_char
== '>'))
928 else if ((this_char
== '{' && prev_char
== '$') || /* } */
929 (char_is_quoted (rl_line_buffer
, ti
)))
934 #if defined (PROGRAMMABLE_COMPLETION)
936 * XXX - because of the <= start test, and setting os = s+1, this can
937 * potentially return os > start. This is probably not what we want to
938 * happen, but fix later after 2.05a-release.
941 find_cmd_start (start
)
947 while (((s
= skip_to_delim (rl_line_buffer
, os
, COMMAND_SEPARATORS
)) <= start
) &&
959 e
= skip_to_delim (rl_line_buffer
, end
, COMMAND_SEPARATORS
);
964 find_cmd_name (start
)
970 for (s
= start
; whitespace (rl_line_buffer
[s
]); s
++)
973 /* skip until a shell break character */
974 e
= skip_to_delim (rl_line_buffer
, s
, "()<>;&| \t\n");
976 name
= substring (rl_line_buffer
, s
, e
);
982 prog_complete_return (text
, matchnum
)
991 if (prog_complete_matches
== 0 || prog_complete_matches
[ind
] == 0)
993 return (prog_complete_matches
[ind
++]);
996 #endif /* PROGRAMMABLE_COMPLETION */
998 /* Do some completion on TEXT. The indices of TEXT in RL_LINE_BUFFER are
999 at START and END. Return an array of matches, or NULL if none. */
1001 attempt_shell_completion (text
, start
, end
)
1005 int in_command_position
, ti
, saveti
, qc
, dflags
;
1006 char **matches
, *command_separator_chars
;
1008 command_separator_chars
= COMMAND_SEPARATORS
;
1009 matches
= (char **)NULL
;
1010 rl_ignore_some_completions_function
= filename_completion_ignore
;
1012 /* Determine if this could be a command word. It is if it appears at
1013 the start of the line (ignoring preceding whitespace), or if it
1014 appears after a character that separates commands. It cannot be a
1015 command word if we aren't at the top-level prompt. */
1019 while ((ti
> -1) && (whitespace (rl_line_buffer
[ti
])))
1023 /* If this is an open quote, maybe we're trying to complete a quoted
1025 if (ti
>= 0 && (rl_line_buffer
[ti
] == '"' || rl_line_buffer
[ti
] == '\''))
1027 qc
= rl_line_buffer
[ti
];
1029 while (ti
> -1 && (whitespace (rl_line_buffer
[ti
])))
1034 in_command_position
= 0;
1037 /* Only do command completion at the start of a line when we
1038 are prompting at the top level. */
1039 if (current_prompt_string
== ps1_prompt
)
1040 in_command_position
++;
1042 else if (member (rl_line_buffer
[ti
], command_separator_chars
))
1044 in_command_position
++;
1046 if (check_redir (ti
) == 1)
1047 in_command_position
= 0;
1051 /* This still could be in command position. It is possible
1052 that all of the previous words on the line are variable
1056 /* Check that we haven't incorrectly flagged a closed command substitution
1057 as indicating we're in a command position. */
1058 if (in_command_position
&& ti
>= 0 && rl_line_buffer
[ti
] == '`' &&
1059 *text
!= '`' && unclosed_pair (rl_line_buffer
, end
, "`") == 0)
1060 in_command_position
= 0;
1062 /* Special handling for command substitution. If *TEXT is a backquote,
1063 it can be the start or end of an old-style command substitution, or
1064 unmatched. If it's unmatched, both calls to unclosed_pair will
1067 (in_command_position
|| (unclosed_pair (rl_line_buffer
, start
, "`") &&
1068 unclosed_pair (rl_line_buffer
, end
, "`"))))
1069 matches
= rl_completion_matches (text
, command_subst_completion_function
);
1071 #if defined (PROGRAMMABLE_COMPLETION)
1072 /* Attempt programmable completion. */
1073 if (!matches
&& in_command_position
== 0 && prog_completion_enabled
&&
1074 (progcomp_size () > 0) && current_prompt_string
== ps1_prompt
)
1079 /* XXX - don't free the members */
1080 if (prog_complete_matches
)
1081 free (prog_complete_matches
);
1082 prog_complete_matches
= (char **)NULL
;
1084 s
= find_cmd_start (start
);
1085 e
= find_cmd_end (end
);
1086 n
= find_cmd_name (s
);
1087 if (e
> s
&& assignment (n
, 0) == 0)
1088 prog_complete_matches
= programmable_completions (n
, text
, s
, e
, &foundcs
);
1092 /* XXX - if we found a COMPSPEC for the command, just return whatever
1093 the programmable completion code returns, and disable the default
1094 filename completion that readline will do unless the COPT_DEFAULT
1095 option has been set with the `-o default' option to complete. */
1098 /* If the user specified that the compspec returns filenames, make
1099 sure that readline knows it. */
1100 if (foundcs
& COPT_FILENAMES
)
1101 rl_filename_completion_desired
= 1;
1102 /* If the user doesn't want a space appended, tell readline. */
1103 if (foundcs
& COPT_NOSPACE
)
1104 rl_completion_suppress_append
= 1;
1105 /* Turn what the programmable completion code returns into what
1106 readline wants. I should have made compute_lcd_of_matches
1108 matches
= rl_completion_matches (text
, prog_complete_return
);
1109 if ((foundcs
& COPT_DEFAULT
) == 0)
1110 rl_attempted_completion_over
= 1; /* no default */
1111 if (matches
|| ((foundcs
& COPT_BASHDEFAULT
) == 0))
1120 if (in_command_position
)
1121 dflags
|= DEFCOMP_CMDPOS
;
1122 matches
= bash_default_completion (text
, start
, end
, qc
, dflags
);
1129 bash_default_completion (text
, start
, end
, qc
, compflags
)
1131 int start
, end
, qc
, compflags
;
1135 matches
= (char **)NULL
;
1137 /* New posix-style command substitution or variable name? */
1138 if (!matches
&& *text
== '$')
1140 if (qc
!= '\'' && text
[1] == '(') /* ) */
1141 matches
= rl_completion_matches (text
, command_subst_completion_function
);
1143 matches
= rl_completion_matches (text
, variable_completion_function
);
1146 /* If the word starts in `~', and there is no slash in the word, then
1147 try completing this word as a username. */
1148 if (!matches
&& *text
== '~' && !xstrchr (text
, '/'))
1149 matches
= rl_completion_matches (text
, rl_username_completion_function
);
1151 /* Another one. Why not? If the word starts in '@', then look through
1152 the world of known hostnames for completion first. */
1153 if (!matches
&& perform_hostname_completion
&& *text
== '@')
1154 matches
= rl_completion_matches (text
, hostname_completion_function
);
1156 /* And last, (but not least) if this word is in a command position, then
1157 complete over possible command names, including aliases, functions,
1158 and command names. */
1159 if (matches
== 0 && (compflags
& DEFCOMP_CMDPOS
))
1161 /* If END == START and text[0] == 0, we are trying to complete an empty
1163 if (no_empty_command_completion
&& end
== start
&& text
[0] == '\0')
1165 matches
= (char **)NULL
;
1166 rl_ignore_some_completions_function
= bash_ignore_everything
;
1170 #define CMD_IS_DIR(x) (absolute_pathname(x) == 0 && absolute_program(x) == 0 && *(x) != '~' && test_for_directory (x))
1173 matches
= rl_completion_matches (text
, command_word_completion_function
);
1175 /* If we are attempting command completion and nothing matches, we
1176 do not want readline to perform filename completion for us. We
1177 still want to be able to complete partial pathnames, so set the
1178 completion ignore function to something which will remove
1179 filenames and leave directories in the match list. */
1180 if (matches
== (char **)NULL
)
1181 rl_ignore_some_completions_function
= bash_ignore_filenames
;
1182 else if (matches
[1] == 0 && CMD_IS_DIR(matches
[0]) && dot_in_path
== 0)
1183 /* If we found a single match, without looking in the current
1184 directory (because it's not in $PATH), but the found name is
1185 also a command in the current directory, suppress appending any
1186 terminating character, since it's ambiguous. */
1188 rl_completion_suppress_append
= 1;
1189 rl_filename_completion_desired
= 0;
1191 else if (matches
[0] && matches
[1] && STREQ (matches
[0], matches
[1]) && CMD_IS_DIR (matches
[0]))
1192 /* There are multiple instances of the same match (duplicate
1193 completions haven't yet been removed). In this case, all of
1194 the matches will be the same, and the duplicate removal code
1195 will distill them all down to one. We turn on
1196 rl_completion_suppress_append for the same reason as above.
1197 Remember: we only care if there's eventually a single unique
1198 completion. If there are multiple completions this won't
1199 make a difference and the problem won't occur. */
1201 rl_completion_suppress_append
= 1;
1202 rl_filename_completion_desired
= 0;
1207 /* This could be a globbing pattern, so try to expand it using pathname
1209 if (!matches
&& glob_pattern_p (text
))
1211 matches
= rl_completion_matches (text
, glob_complete_word
);
1212 /* A glob expression that matches more than one filename is problematic.
1213 If we match more than one filename, punt. */
1214 if (matches
&& matches
[1] && rl_completion_type
== TAB
)
1216 strvec_dispose (matches
);
1217 matches
= (char **)0;
1224 /* This is the function to call when the word to complete is in a position
1225 where a command word can be found. It grovels $PATH, looking for commands
1226 that match. It also scans aliases, function names, and the shell_builtin
1229 command_word_completion_function (hint_text
, state
)
1230 const char *hint_text
;
1233 static char *hint
= (char *)NULL
;
1234 static char *path
= (char *)NULL
;
1235 static char *val
= (char *)NULL
;
1236 static char *filename_hint
= (char *)NULL
;
1237 static char *dequoted_hint
= (char *)NULL
;
1238 static int path_index
, hint_len
, dequoted_len
, istate
, igncase
;
1239 static int mapping_over
, local_index
, searching_path
, hint_is_dir
;
1240 static SHELL_VAR
**varlist
= (SHELL_VAR
**)NULL
;
1242 static alias_t
**alias_list
= (alias_t
**)NULL
;
1246 /* We have to map over the possibilities for command words. If we have
1247 no state, then make one just for that purpose. */
1250 if (dequoted_hint
&& dequoted_hint
!= hint
)
1251 free (dequoted_hint
);
1255 mapping_over
= searching_path
= 0;
1256 hint_is_dir
= CMD_IS_DIR (hint_text
);
1259 temp
= rl_variable_value ("completion-ignore-case");
1260 igncase
= strcmp (temp
, "on") == 0;
1262 /* If this is an absolute program name, do not check it against
1263 aliases, reserved words, functions or builtins. We must check
1264 whether or not it is unique, and, if so, whether that filename
1266 if (absolute_program (hint_text
))
1268 /* Perform tilde expansion on what's passed, so we don't end up
1269 passing filenames with tildes directly to stat(). */
1270 if (*hint_text
== '~')
1271 hint
= bash_tilde_expand (hint_text
, 0);
1273 hint
= savestring (hint_text
);
1275 dequoted_hint
= hint
;
1276 /* If readline's completer found a quote character somewhere, but
1277 didn't set the quote character, there must have been a quote
1278 character embedded in the filename. It can't be at the start of
1279 the filename, so we need to dequote the filename before we look
1280 in the file system for it. */
1281 if (rl_completion_found_quote
&& rl_completion_quote_character
== 0)
1283 dequoted_hint
= bash_dequote_filename (hint
, 0);
1285 hint
= dequoted_hint
;
1287 dequoted_len
= hint_len
= strlen (hint
);
1290 free (filename_hint
);
1292 filename_hint
= savestring (hint
);
1299 dequoted_hint
= hint
= savestring (hint_text
);
1300 dequoted_len
= hint_len
= strlen (hint
);
1302 if (rl_completion_found_quote
&& rl_completion_quote_character
== 0)
1304 dequoted_hint
= bash_dequote_filename (hint
, 0);
1305 dequoted_len
= strlen (dequoted_hint
);
1308 path
= get_string_value ("PATH");
1309 path_index
= dot_in_path
= 0;
1311 /* Initialize the variables for each type of command word. */
1317 varlist
= all_visible_functions ();
1323 alias_list
= all_aliases ();
1327 /* mapping_over says what we are currently hacking. Note that every case
1328 in this list must fall through when there are no more possibilities. */
1330 switch (mapping_over
)
1332 case 0: /* Aliases come first. */
1334 while (alias_list
&& alias_list
[local_index
])
1336 register char *alias
;
1338 alias
= alias_list
[local_index
++]->name
;
1340 if (STREQN (alias
, hint
, hint_len
))
1341 return (savestring (alias
));
1347 case 1: /* Then shell reserved words. */
1349 while (word_token_alist
[local_index
].word
)
1351 register char *reserved_word
;
1353 reserved_word
= word_token_alist
[local_index
++].word
;
1355 if (STREQN (reserved_word
, hint
, hint_len
))
1356 return (savestring (reserved_word
));
1362 case 2: /* Then function names. */
1363 while (varlist
&& varlist
[local_index
])
1365 register char *varname
;
1367 varname
= varlist
[local_index
++]->name
;
1369 if (STREQN (varname
, hint
, hint_len
))
1370 return (savestring (varname
));
1375 case 3: /* Then shell builtins. */
1376 for (; local_index
< num_shell_builtins
; local_index
++)
1378 /* Ignore it if it doesn't have a function pointer or if it
1379 is not currently enabled. */
1380 if (!shell_builtins
[local_index
].function
||
1381 (shell_builtins
[local_index
].flags
& BUILTIN_ENABLED
) == 0)
1384 if (STREQN (shell_builtins
[local_index
].name
, hint
, hint_len
))
1386 int i
= local_index
++;
1388 return (savestring (shell_builtins
[i
].name
));
1395 /* If the text passed is a directory in the current directory, return it
1396 as a possible match. Executables in directories in the current
1397 directory can be specified using relative pathnames and successfully
1398 executed even when `.' is not in $PATH. */
1401 hint_is_dir
= 0; /* only return the hint text once */
1402 return (savestring (hint_text
));
1405 /* Repeatedly call filename_completion_function while we have
1406 members of PATH left. Question: should we stat each file?
1407 Answer: we call executable_file () on each file. */
1410 istate
= (val
!= (char *)NULL
);
1416 /* Get the next directory from the path. If there is none, then we
1418 if (!path
|| !path
[path_index
] ||
1419 (current_path
= extract_colon_unit (path
, &path_index
)) == 0)
1420 return ((char *)NULL
);
1423 if (*current_path
== 0)
1425 free (current_path
);
1426 current_path
= savestring (".");
1429 if (*current_path
== '~')
1433 t
= bash_tilde_expand (current_path
, 0);
1434 free (current_path
);
1438 if (current_path
[0] == '.' && current_path
[1] == '\0')
1442 free (filename_hint
);
1444 filename_hint
= sh_makepath (current_path
, hint
, 0);
1445 free (current_path
);
1449 val
= rl_filename_completion_function (filename_hint
, istate
);
1454 /* If the hint text is an absolute program, then don't bother
1455 searching through PATH. */
1456 if (absolute_program (hint
))
1457 return ((char *)NULL
);
1463 int match
, freetemp
;
1465 char *temp
; /* shadows previous declaration */
1468 if (absolute_program (hint
))
1471 match
= strncmp (val
, hint
, hint_len
) == 0;
1473 match
= strncasecmp (val
, hint
, hint_len
) == 0;
1475 /* If we performed tilde expansion, restore the original
1477 if (*hint_text
== '~')
1482 tl
= strlen (hint_text
);
1484 l
= vl
- hint_len
; /* # of chars added */
1486 rd
= savestring (filename_hint
);
1487 bash_directory_expansion (&rd
);
1489 l
= vl
- dl
; /* # of chars added */
1492 temp
= (char *)xmalloc (l
+ 2 + tl
);
1493 strcpy (temp
, hint_text
);
1494 strcpy (temp
+ tl
, val
+ vl
- l
);
1497 temp
= savestring (val
);
1502 temp
= strrchr (val
, '/');
1508 freetemp
= match
= strncmp (temp
, hint
, hint_len
) == 0;
1510 freetemp
= match
= strncasecmp (temp
, hint
, hint_len
) == 0;
1512 temp
= savestring (temp
);
1515 freetemp
= match
= 0;
1519 /* If we have found a match, and it is an executable file or a
1520 directory name, return it. */
1521 if (match
&& executable_or_directory (val
))
1523 /* If we have found a match, and it is an executable file, return it.
1524 We don't return directory names when searching $PATH, since the
1525 bash execution code won't find executables in directories which
1526 appear in directories in $PATH when they're specified using
1527 relative pathnames. */
1528 if (match
&& (searching_path
? executable_file (val
) : executable_or_directory (val
)))
1532 val
= ""; /* So it won't be NULL. */
1545 /* Completion inside an unterminated command substitution. */
1547 command_subst_completion_function (text
, state
)
1551 static char **matches
= (char **)NULL
;
1552 static const char *orig_start
;
1553 static char *filename_text
= (char *)NULL
;
1554 static int cmd_index
, start_len
;
1560 free (filename_text
);
1564 else if (*text
== '$' && text
[1] == '(') /* ) */
1566 /* If the text was quoted, suppress any quote character that the
1567 readline completion code would insert. */
1568 rl_completion_suppress_quote
= 1;
1569 start_len
= text
- orig_start
;
1570 filename_text
= savestring (text
);
1575 * At this point we can entertain the idea of re-parsing
1576 * `filename_text' into a (possibly incomplete) command name and
1577 * arguments, and doing completion based on that. This is
1578 * currently very rudimentary, but it is a small improvement.
1580 for (value
= filename_text
+ strlen (filename_text
) - 1; value
> filename_text
; value
--)
1581 if (whitespace (*value
) || member (*value
, COMMAND_SEPARATORS
))
1583 if (value
<= filename_text
)
1584 matches
= rl_completion_matches (filename_text
, command_word_completion_function
);
1588 start_len
+= value
- filename_text
;
1589 if (whitespace (value
[-1]))
1590 matches
= rl_completion_matches (value
, rl_filename_completion_function
);
1592 matches
= rl_completion_matches (value
, command_word_completion_function
);
1595 /* If there is more than one match, rl_completion_matches has already
1596 put the lcd in matches[0]. Skip over it. */
1597 cmd_index
= matches
&& matches
[0] && matches
[1];
1599 /* If there's a single match and it's a directory, set the append char
1600 to the expected `/'. Otherwise, don't append anything. */
1601 if (matches
&& matches
[0] && matches
[1] == 0 && test_for_directory (matches
[0]))
1602 rl_completion_append_character
= '/';
1604 rl_completion_suppress_append
= 1;
1607 if (!matches
|| !matches
[cmd_index
])
1609 rl_filename_quoting_desired
= 0; /* disable quoting */
1610 return ((char *)NULL
);
1614 value
= (char *)xmalloc (1 + start_len
+ strlen (matches
[cmd_index
]));
1617 value
[0] = *orig_start
;
1619 strncpy (value
, orig_start
, start_len
);
1621 strcpy (value
+ start_len
, matches
[cmd_index
]);
1628 /* Okay, now we write the entry_function for variable completion. */
1630 variable_completion_function (text
, state
)
1634 static char **varlist
= (char **)NULL
;
1635 static int varlist_index
;
1636 static char *varname
= (char *)NULL
;
1638 static int first_char
, first_char_loc
;
1646 first_char
= text
[0];
1648 if (first_char
== '$')
1651 if (text
[first_char_loc
] == '{')
1654 varname
= savestring (text
+ first_char_loc
);
1656 namelen
= strlen (varname
);
1658 strvec_dispose (varlist
);
1660 varlist
= all_variables_matching_prefix (varname
);
1664 if (!varlist
|| !varlist
[varlist_index
])
1666 return ((char *)NULL
);
1672 value
= (char *)xmalloc (4 + strlen (varlist
[varlist_index
]));
1676 value
[0] = first_char
;
1677 if (first_char_loc
== 2)
1681 strcpy (value
+ first_char_loc
, varlist
[varlist_index
]);
1682 if (first_char_loc
== 2)
1683 strcat (value
, "}");
1690 /* How about a completion function for hostnames? */
1692 hostname_completion_function (text
, state
)
1696 static char **list
= (char **)NULL
;
1697 static int list_index
= 0;
1698 static int first_char
, first_char_loc
;
1700 /* If we don't have any state, make some. */
1705 list
= (char **)NULL
;
1710 if (first_char
== '@')
1713 list
= hostnames_matching ((char *)text
+first_char_loc
);
1717 if (list
&& list
[list_index
])
1721 t
= (char *)xmalloc (2 + strlen (list
[list_index
]));
1723 strcpy (t
+ first_char_loc
, list
[list_index
]);
1728 return ((char *)NULL
);
1732 * A completion function for service names from /etc/services (or wherever).
1735 bash_servicename_completion_function (text
, state
)
1739 #if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GETSERVENT)
1740 return ((char *)NULL
);
1742 static char *sname
= (char *)NULL
;
1743 static struct servent
*srvent
;
1744 static int snamelen
, firstc
;
1746 char **alist
, *aentry
;
1754 sname
= savestring (text
);
1755 snamelen
= strlen (sname
);
1759 while (srvent
= getservent ())
1762 if (snamelen
== 0 || (STREQN (sname
, srvent
->s_name
, snamelen
)))
1764 /* Not primary, check aliases */
1765 for (alist
= srvent
->s_aliases
; *alist
; alist
++)
1768 if (STREQN (sname
, aentry
, snamelen
))
1782 return ((char *)NULL
);
1785 value
= afound
? savestring (aentry
) : savestring (srvent
->s_name
);
1791 * A completion function for group names from /etc/group (or wherever).
1794 bash_groupname_completion_function (text
, state
)
1798 #if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H)
1799 return ((char *)NULL
);
1801 static char *gname
= (char *)NULL
;
1802 static struct group
*grent
;
1803 static int gnamelen
;
1809 gname
= savestring (text
);
1810 gnamelen
= strlen (gname
);
1815 while (grent
= getgrent ())
1817 if (gnamelen
== 0 || (STREQN (gname
, grent
->gr_name
, gnamelen
)))
1824 return ((char *)NULL
);
1827 value
= savestring (grent
->gr_name
);
1832 /* Functions to perform history and alias expansions on the current line. */
1834 #if defined (BANG_HISTORY)
1835 /* Perform history expansion on the current line. If no history expansion
1836 is done, pre_process_line() returns what it was passed, so we need to
1837 allocate a new line here. */
1839 history_expand_line_internal (line
)
1845 old_verify
= hist_verify
;
1847 new_line
= pre_process_line (line
, 0, 0);
1848 hist_verify
= old_verify
;
1850 return (new_line
== line
) ? savestring (line
) : new_line
;
1854 /* There was an error in expansion. Let the preprocessor print
1857 cleanup_expansion_error ()
1860 #if defined (BANG_HISTORY)
1863 old_verify
= hist_verify
;
1867 fprintf (rl_outstream
, "\r\n");
1868 to_free
= pre_process_line (rl_line_buffer
, 1, 0);
1869 #if defined (BANG_HISTORY)
1870 hist_verify
= old_verify
;
1872 if (to_free
!= rl_line_buffer
)
1874 putc ('\r', rl_outstream
);
1875 rl_forced_update_display ();
1878 /* If NEW_LINE differs from what is in the readline line buffer, add an
1879 undo record to get from the readline line buffer contents to the new
1880 line and make NEW_LINE the current readline line. */
1882 maybe_make_readline_line (new_line
)
1885 if (strcmp (new_line
, rl_line_buffer
) != 0)
1889 rl_add_undo (UNDO_BEGIN
, 0, 0, 0);
1890 rl_delete_text (0, rl_point
);
1891 rl_point
= rl_end
= rl_mark
= 0;
1892 rl_insert_text (new_line
);
1893 rl_add_undo (UNDO_END
, 0, 0, 0);
1897 /* Make NEW_LINE be the current readline line. This frees NEW_LINE. */
1899 set_up_new_line (new_line
)
1902 int old_point
, at_end
;
1904 old_point
= rl_point
;
1905 at_end
= rl_point
== rl_end
;
1907 /* If the line was history and alias expanded, then make that
1908 be one thing to undo. */
1909 maybe_make_readline_line (new_line
);
1912 /* Place rl_point where we think it should go. */
1915 else if (old_point
< rl_end
)
1917 rl_point
= old_point
;
1918 if (!whitespace (rl_line_buffer
[rl_point
]))
1919 rl_forward_word (1, 0);
1924 /* Expand aliases in the current readline line. */
1926 alias_expand_line (count
, ignore
)
1931 new_line
= alias_expand (rl_line_buffer
);
1935 set_up_new_line (new_line
);
1940 cleanup_expansion_error ();
1946 #if defined (BANG_HISTORY)
1947 /* History expand the line. */
1949 history_expand_line (count
, ignore
)
1954 new_line
= history_expand_line_internal (rl_line_buffer
);
1958 set_up_new_line (new_line
);
1963 cleanup_expansion_error ();
1968 /* Expand history substitutions in the current line and then insert a
1969 space (hopefully close to where we were before). */
1971 tcsh_magic_space (count
, ignore
)
1974 int dist_from_end
, old_point
;
1976 old_point
= rl_point
;
1977 dist_from_end
= rl_end
- rl_point
;
1978 if (history_expand_line (count
, ignore
) == 0)
1980 /* Try a simple heuristic from Stephen Gildea <gildea@intouchsys.com>.
1981 This works if all expansions were before rl_point or if no expansions
1983 rl_point
= (old_point
== 0) ? old_point
: rl_end
- dist_from_end
;
1990 #endif /* BANG_HISTORY */
1992 /* History and alias expand the line. */
1994 history_and_alias_expand_line (count
, ignore
)
2000 #if defined (BANG_HISTORY)
2001 new_line
= history_expand_line_internal (rl_line_buffer
);
2009 alias_line
= alias_expand (new_line
);
2011 new_line
= alias_line
;
2017 set_up_new_line (new_line
);
2022 cleanup_expansion_error ();
2027 /* History and alias expand the line, then perform the shell word
2028 expansions by calling expand_string. This can't use set_up_new_line()
2029 because we want the variable expansions as a separate undo'able
2030 set of operations. */
2032 shell_expand_line (count
, ignore
)
2036 WORD_LIST
*expanded_string
;
2039 #if defined (BANG_HISTORY)
2040 new_line
= history_expand_line_internal (rl_line_buffer
);
2048 alias_line
= alias_expand (new_line
);
2050 new_line
= alias_line
;
2056 int old_point
= rl_point
;
2057 int at_end
= rl_point
== rl_end
;
2059 /* If the line was history and alias expanded, then make that
2060 be one thing to undo. */
2061 maybe_make_readline_line (new_line
);
2064 /* If there is variable expansion to perform, do that as a separate
2065 operation to be undone. */
2066 new_line
= savestring (rl_line_buffer
);
2067 expanded_string
= expand_string (new_line
, 0);
2069 if (expanded_string
== 0)
2071 new_line
= (char *)xmalloc (1);
2076 new_line
= string_list (expanded_string
);
2077 dispose_words (expanded_string
);
2080 maybe_make_readline_line (new_line
);
2083 /* Place rl_point where we think it should go. */
2086 else if (old_point
< rl_end
)
2088 rl_point
= old_point
;
2089 if (!whitespace (rl_line_buffer
[rl_point
]))
2090 rl_forward_word (1, 0);
2096 cleanup_expansion_error ();
2101 /* If FIGNORE is set, then don't match files with the given suffixes when
2102 completing filenames. If only one of the possibilities has an acceptable
2103 suffix, delete the others, else just return and let the completer
2104 signal an error. It is called by the completer when real
2105 completions are done on filenames by the completer's internal
2106 function, not for completion lists (M-?) and not on "other"
2107 completion types, such as hostnames or commands. */
2109 static struct ignorevar fignore
=
2115 (sh_iv_item_func_t
*) 0,
2119 _ignore_completion_names (names
, name_func
)
2121 sh_ignore_func_t
*name_func
;
2128 /* If there is only one completion, see if it is acceptable. If it is
2129 not, free it up. In any case, short-circuit and return. This is a
2130 special case because names[0] is not the prefix of the list of names
2131 if there is only one completion; it is the completion itself. */
2132 if (names
[1] == (char *)0)
2135 if ((*name_func
) (names
[0]) == 0)
2138 names
[0] = (char *)NULL
;
2144 /* Allocate space for array to hold list of pointers to matching
2145 filenames. The pointers are copied back to NAMES when done. */
2146 for (nidx
= 1; names
[nidx
]; nidx
++)
2148 newnames
= strvec_create (nidx
+ 1);
2150 if (force_fignore
== 0)
2152 oldnames
= strvec_create (nidx
- 1);
2156 newnames
[0] = names
[0];
2157 for (idx
= nidx
= 1; names
[idx
]; idx
++)
2159 if ((*name_func
) (names
[idx
]))
2160 newnames
[nidx
++] = names
[idx
];
2161 else if (force_fignore
== 0)
2162 oldnames
[oidx
++] = names
[idx
];
2167 newnames
[nidx
] = (char *)NULL
;
2169 /* If none are acceptable then let the completer handle it. */
2175 names
[0] = (char *)NULL
;
2184 if (force_fignore
== 0)
2187 free (oldnames
[--oidx
]);
2191 /* If only one is acceptable, copy it to names[0] and return. */
2195 names
[0] = newnames
[1];
2196 names
[1] = (char *)NULL
;
2201 /* Copy the acceptable names back to NAMES, set the new array end,
2203 for (nidx
= 1; newnames
[nidx
]; nidx
++)
2204 names
[nidx
] = newnames
[nidx
];
2205 names
[nidx
] = (char *)NULL
;
2210 name_is_acceptable (name
)
2216 for (nlen
= strlen (name
), p
= fignore
.ignores
; p
->val
; p
++)
2218 if (nlen
> p
->len
&& p
->len
> 0 && STREQ (p
->val
, &name
[nlen
- p
->len
]))
2227 ignore_dot_names (name
)
2230 return (name
[0] != '.');
2235 filename_completion_ignore (names
)
2239 if (glob_dot_filenames
== 0)
2240 _ignore_completion_names (names
, ignore_dot_names
);
2243 setup_ignore_patterns (&fignore
);
2245 if (fignore
.num_ignores
== 0)
2248 _ignore_completion_names (names
, name_is_acceptable
);
2253 /* Return 1 if NAME is a directory. */
2255 test_for_directory (name
)
2261 fn
= bash_tilde_expand (name
, 0);
2262 if (stat (fn
, &finfo
) != 0)
2268 return (S_ISDIR (finfo
.st_mode
));
2271 /* Remove files from NAMES, leaving directories. */
2273 bash_ignore_filenames (names
)
2276 _ignore_completion_names (names
, test_for_directory
);
2288 bash_ignore_everything (names
)
2291 _ignore_completion_names (names
, return_zero
);
2295 /* Simulate the expansions that will be performed by
2296 rl_filename_completion_function. This must be called with the address of
2297 a pointer to malloc'd memory. */
2299 bash_directory_expansion (dirname
)
2304 d
= savestring (*dirname
);
2306 if (rl_directory_rewrite_hook
)
2307 (*rl_directory_rewrite_hook
) (&d
);
2309 if (rl_directory_completion_hook
&& (*rl_directory_completion_hook
) (&d
))
2314 else if (rl_completion_found_quote
)
2316 nd
= bash_dequote_filename (d
, rl_completion_quote_character
);
2323 /* Handle symbolic link references and other directory name
2324 expansions while hacking completion. */
2326 bash_directory_completion_hook (dirname
)
2329 char *local_dirname
, *new_dirname
, *t
;
2330 int return_value
, should_expand_dirname
;
2334 return_value
= should_expand_dirname
= 0;
2335 local_dirname
= *dirname
;
2338 should_expand_dirname
= xstrchr (local_dirname
, '$') || xstrchr (local_dirname
, '`');
2340 if (xstrchr (local_dirname
, '$'))
2341 should_expand_dirname
= 1;
2344 t
= xstrchr (local_dirname
, '`');
2345 if (t
&& unclosed_pair (local_dirname
, strlen (local_dirname
), "`") == 0)
2346 should_expand_dirname
= 1;
2350 #if defined (HAVE_LSTAT)
2351 if (should_expand_dirname
&& lstat (local_dirname
, &sb
) == 0)
2353 if (should_expand_dirname
&& stat (local_dirname
, &sb
) == 0)
2355 should_expand_dirname
= 0;
2357 if (should_expand_dirname
)
2359 new_dirname
= savestring (local_dirname
);
2360 wl
= expand_prompt_string (new_dirname
, 0); /* does the right thing */
2363 *dirname
= string_list (wl
);
2364 /* Tell the completer to replace the directory name only if we
2365 actually expanded something. */
2366 return_value
= STREQ (local_dirname
, *dirname
) == 0;
2367 free (local_dirname
);
2370 local_dirname
= *dirname
;
2375 free (local_dirname
);
2376 *dirname
= (char *)xmalloc (1);
2383 /* Dequote the filename even if we don't expand it. */
2384 new_dirname
= bash_dequote_filename (local_dirname
, rl_completion_quote_character
);
2385 free (local_dirname
);
2386 local_dirname
= *dirname
= new_dirname
;
2389 if (!no_symbolic_links
&& (local_dirname
[0] != '.' || local_dirname
[1]))
2391 char *temp1
, *temp2
;
2394 t
= get_working_directory ("symlink-hook");
2395 temp1
= make_absolute (local_dirname
, t
);
2397 temp2
= sh_canonpath (temp1
, PATH_CHECKDOTDOT
|PATH_CHECKEXISTS
);
2398 /* If we can't canonicalize, bail. */
2404 len1
= strlen (temp1
);
2405 if (temp1
[len1
- 1] == '/')
2407 len2
= strlen (temp2
);
2408 if (len2
> 2) /* don't append `/' to `/' or `//' */
2410 temp2
= (char *)xrealloc (temp2
, len2
+ 2);
2412 temp2
[len2
+ 1] = '\0';
2415 free (local_dirname
);
2419 return (return_value
);
2422 static char **history_completion_array
= (char **)NULL
;
2423 static int harry_size
;
2424 static int harry_len
;
2427 build_history_completion_array ()
2433 /* First, clear out the current dynamic history completion list. */
2436 strvec_dispose (history_completion_array
);
2437 history_completion_array
= (char **)NULL
;
2442 /* Next, grovel each line of history, making each shell-sized token
2443 a separate entry in the history_completion_array. */
2444 hlist
= history_list ();
2448 for (i
= 0; hlist
[i
]; i
++)
2450 /* Separate each token, and place into an array. */
2451 tokens
= history_tokenize (hlist
[i
]->line
);
2453 for (j
= 0; tokens
&& tokens
[j
]; j
++)
2455 if (harry_len
+ 2 > harry_size
)
2456 history_completion_array
= strvec_resize (history_completion_array
, harry_size
+= 10);
2458 history_completion_array
[harry_len
++] = tokens
[j
];
2459 history_completion_array
[harry_len
] = (char *)NULL
;
2464 /* Sort the complete list of tokens. */
2465 qsort (history_completion_array
, harry_len
, sizeof (char *), (QSFUNC
*)strvec_strcmp
);
2470 history_completion_generator (hint_text
, state
)
2471 const char *hint_text
;
2474 static int local_index
, len
;
2475 static const char *text
;
2477 /* If this is the first call to the generator, then initialize the
2478 list of strings to complete over. */
2482 build_history_completion_array ();
2484 len
= strlen (text
);
2487 while (history_completion_array
&& history_completion_array
[local_index
])
2489 if (strncmp (text
, history_completion_array
[local_index
++], len
) == 0)
2490 return (savestring (history_completion_array
[local_index
- 1]));
2492 return ((char *)NULL
);
2496 dynamic_complete_history (count
, key
)
2501 rl_compentry_func_t
*orig_func
;
2502 rl_completion_func_t
*orig_attempt_func
;
2504 orig_func
= rl_completion_entry_function
;
2505 orig_attempt_func
= rl_attempted_completion_function
;
2506 rl_completion_entry_function
= history_completion_generator
;
2507 rl_attempted_completion_function
= (rl_completion_func_t
*)NULL
;
2509 /* XXX - use rl_completion_mode here? */
2510 if (rl_last_func
== dynamic_complete_history
)
2511 r
= rl_complete_internal ('?');
2513 r
= rl_complete_internal (TAB
);
2515 rl_completion_entry_function
= orig_func
;
2516 rl_attempted_completion_function
= orig_attempt_func
;
2520 #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
2522 bash_complete_username (ignore
, ignore2
)
2523 int ignore
, ignore2
;
2525 return bash_complete_username_internal (rl_completion_mode (bash_complete_username
));
2529 bash_possible_username_completions (ignore
, ignore2
)
2530 int ignore
, ignore2
;
2532 return bash_complete_username_internal ('?');
2536 bash_complete_username_internal (what_to_do
)
2539 return bash_specific_completion (what_to_do
, rl_username_completion_function
);
2543 bash_complete_filename (ignore
, ignore2
)
2544 int ignore
, ignore2
;
2546 return bash_complete_filename_internal (rl_completion_mode (bash_complete_filename
));
2550 bash_possible_filename_completions (ignore
, ignore2
)
2551 int ignore
, ignore2
;
2553 return bash_complete_filename_internal ('?');
2557 bash_complete_filename_internal (what_to_do
)
2560 rl_compentry_func_t
*orig_func
;
2561 rl_completion_func_t
*orig_attempt_func
;
2562 rl_icppfunc_t
*orig_dir_func
;
2563 /*const*/ char *orig_rl_completer_word_break_characters
;
2566 orig_func
= rl_completion_entry_function
;
2567 orig_attempt_func
= rl_attempted_completion_function
;
2568 orig_dir_func
= rl_directory_completion_hook
;
2569 orig_rl_completer_word_break_characters
= rl_completer_word_break_characters
;
2570 rl_completion_entry_function
= rl_filename_completion_function
;
2571 rl_attempted_completion_function
= (rl_completion_func_t
*)NULL
;
2572 rl_directory_completion_hook
= (rl_icppfunc_t
*)NULL
;
2573 rl_completer_word_break_characters
= " \t\n\"\'";
2575 r
= rl_complete_internal (what_to_do
);
2577 rl_completion_entry_function
= orig_func
;
2578 rl_attempted_completion_function
= orig_attempt_func
;
2579 rl_directory_completion_hook
= orig_dir_func
;
2580 rl_completer_word_break_characters
= orig_rl_completer_word_break_characters
;
2586 bash_complete_hostname (ignore
, ignore2
)
2587 int ignore
, ignore2
;
2589 return bash_complete_hostname_internal (rl_completion_mode (bash_complete_hostname
));
2593 bash_possible_hostname_completions (ignore
, ignore2
)
2594 int ignore
, ignore2
;
2596 return bash_complete_hostname_internal ('?');
2600 bash_complete_variable (ignore
, ignore2
)
2601 int ignore
, ignore2
;
2603 return bash_complete_variable_internal (rl_completion_mode (bash_complete_variable
));
2607 bash_possible_variable_completions (ignore
, ignore2
)
2608 int ignore
, ignore2
;
2610 return bash_complete_variable_internal ('?');
2614 bash_complete_command (ignore
, ignore2
)
2615 int ignore
, ignore2
;
2617 return bash_complete_command_internal (rl_completion_mode (bash_complete_command
));
2621 bash_possible_command_completions (ignore
, ignore2
)
2622 int ignore
, ignore2
;
2624 return bash_complete_command_internal ('?');
2628 bash_complete_hostname_internal (what_to_do
)
2631 return bash_specific_completion (what_to_do
, hostname_completion_function
);
2635 bash_complete_variable_internal (what_to_do
)
2638 return bash_specific_completion (what_to_do
, variable_completion_function
);
2642 bash_complete_command_internal (what_to_do
)
2645 return bash_specific_completion (what_to_do
, command_word_completion_function
);
2648 static char *globtext
;
2649 static char *globorig
;
2652 glob_complete_word (text
, state
)
2656 static char **matches
= (char **)NULL
;
2663 rl_filename_completion_desired
= 1;
2665 if (globorig
!= globtext
)
2669 ttext
= bash_tilde_expand (text
, 0);
2671 if (rl_explicit_arg
)
2673 globorig
= savestring (ttext
);
2674 glen
= strlen (ttext
);
2675 globtext
= (char *)xmalloc (glen
+ 2);
2676 strcpy (globtext
, ttext
);
2677 globtext
[glen
] = '*';
2678 globtext
[glen
+1] = '\0';
2681 globtext
= globorig
= savestring (ttext
);
2686 matches
= shell_glob_filename (globtext
);
2687 if (GLOB_FAILED (matches
))
2688 matches
= (char **)NULL
;
2692 ret
= matches
? matches
[ind
] : (char *)NULL
;
2698 bash_glob_completion_internal (what_to_do
)
2701 return bash_specific_completion (what_to_do
, glob_complete_word
);
2704 /* A special quoting function so we don't end up quoting globbing characters
2705 in the word if there are no matches or multiple matches. */
2707 bash_glob_quote_filename (s
, rtype
, qcp
)
2712 if (globorig
&& qcp
&& *qcp
== '\0' && STREQ (s
, globorig
))
2713 return (savestring (s
));
2715 return (bash_quote_filename (s
, rtype
, qcp
));
2719 bash_glob_complete_word (count
, key
)
2723 rl_quote_func_t
*orig_quoting_function
;
2725 if (rl_editing_mode
== EMACS_EDITING_MODE
)
2726 rl_explicit_arg
= 1; /* force `*' append */
2727 orig_quoting_function
= rl_filename_quoting_function
;
2728 rl_filename_quoting_function
= bash_glob_quote_filename
;
2730 r
= bash_glob_completion_internal (rl_completion_mode (bash_glob_complete_word
));
2732 rl_filename_quoting_function
= orig_quoting_function
;
2737 bash_glob_expand_word (count
, key
)
2740 return bash_glob_completion_internal ('*');
2744 bash_glob_list_expansions (count
, key
)
2747 return bash_glob_completion_internal ('?');
2751 bash_specific_completion (what_to_do
, generator
)
2753 rl_compentry_func_t
*generator
;
2755 rl_compentry_func_t
*orig_func
;
2756 rl_completion_func_t
*orig_attempt_func
;
2759 orig_func
= rl_completion_entry_function
;
2760 orig_attempt_func
= rl_attempted_completion_function
;
2761 rl_completion_entry_function
= generator
;
2762 rl_attempted_completion_function
= NULL
;
2764 r
= rl_complete_internal (what_to_do
);
2766 rl_completion_entry_function
= orig_func
;
2767 rl_attempted_completion_function
= orig_attempt_func
;
2772 #endif /* SPECIFIC_COMPLETION_FUNCTIONS */
2774 #if defined (VI_MODE)
2775 /* Completion, from vi mode's point of view. This is a modified version of
2776 rl_vi_complete which uses the bash globbing code to implement what POSIX
2777 specifies, which is to append a `*' and attempt filename generation (which
2778 has the side effect of expanding any globbing characters in the word). */
2780 bash_vi_complete (count
, key
)
2783 #if defined (SPECIFIC_COMPLETION_FUNCTIONS)
2787 if ((rl_point
< rl_end
) && (!whitespace (rl_line_buffer
[rl_point
])))
2789 if (!whitespace (rl_line_buffer
[rl_point
+ 1]))
2790 rl_vi_end_word (1, 'E');
2794 /* Find boundaries of current word, according to vi definition of a
2800 rl_vi_bWord (1, 'B');
2805 t
= substring (rl_line_buffer
, p
, rl_point
);
2808 if (t
&& glob_pattern_p (t
) == 0)
2809 rl_explicit_arg
= 1; /* XXX - force glob_complete_word to append `*' */
2812 if (key
== '*') /* Expansion and replacement. */
2813 r
= bash_glob_expand_word (count
, key
);
2814 else if (key
== '=') /* List possible completions. */
2815 r
= bash_glob_list_expansions (count
, key
);
2816 else if (key
== '\\') /* Standard completion */
2817 r
= bash_glob_complete_word (count
, key
);
2819 r
= rl_complete (0, key
);
2821 if (key
== '*' || key
== '\\')
2822 rl_vi_start_inserting (key
, 1, 1);
2826 return rl_vi_complete (count
, key
);
2827 #endif /* !SPECIFIC_COMPLETION_FUNCTIONS */
2829 #endif /* VI_MODE */
2831 /* Filename quoting for completion. */
2832 /* A function to strip unquoted quote characters (single quotes, double
2833 quotes, and backslashes). It allows single quotes to appear
2834 within double quotes, and vice versa. It should be smarter. */
2836 bash_dequote_filename (text
, quote_char
)
2844 ret
= (char *)xmalloc (l
+ 1);
2845 for (quoted
= quote_char
, p
= text
, r
= ret
; p
&& *p
; p
++)
2847 /* Allow backslash-quoted characters to pass through unscathed. */
2856 if (quoted
&& *p
== quoted
)
2862 if (quoted
== 0 && (*p
== '\'' || *p
== '"'))
2873 /* Quote characters that the readline completion code would treat as
2874 word break characters with backslashes. Pass backslash-quoted
2875 characters through without examination. */
2877 quote_word_break_chars (text
)
2884 ret
= (char *)xmalloc ((2 * l
) + 1);
2885 for (s
= text
, r
= ret
; *s
; s
++)
2887 /* Pass backslash-quoted characters through, including the backslash. */
2896 /* OK, we have an unquoted character. Check its presence in
2897 rl_completer_word_break_characters. */
2898 if (xstrchr (rl_completer_word_break_characters
, *s
))
2906 /* Quote a filename using double quotes, single quotes, or backslashes
2907 depending on the value of completion_quoting_style. If we're
2908 completing using backslashes, we need to quote some additional
2909 characters (those that readline treats as word breaks), so we call
2910 quote_word_break_chars on the result. This returns newly-allocated
2913 bash_quote_filename (s
, rtype
, qcp
)
2918 char *rtext
, *mtext
, *ret
;
2921 rtext
= (char *)NULL
;
2923 /* If RTYPE == MULT_MATCH, it means that there is
2924 more than one match. In this case, we do not add
2925 the closing quote or attempt to perform tilde
2926 expansion. If RTYPE == SINGLE_MATCH, we try
2927 to perform tilde expansion, because single and double
2928 quotes inhibit tilde expansion by the shell. */
2930 cs
= completion_quoting_style
;
2931 /* Might need to modify the default completion style based on *qcp,
2932 since it's set to any user-provided opening quote. We also change
2933 to single-quoting if there is no user-provided opening quote and
2934 the word being completed contains newlines, since those are not
2935 quoted correctly using backslashes (a backslash-newline pair is
2936 special to the shell parser). */
2937 if (*qcp
== '\0' && cs
== COMPLETE_BSQUOTE
&& xstrchr (s
, '\n'))
2938 cs
= COMPLETE_SQUOTE
;
2939 else if (*qcp
== '"')
2940 cs
= COMPLETE_DQUOTE
;
2941 else if (*qcp
== '\'')
2942 cs
= COMPLETE_SQUOTE
;
2943 #if defined (BANG_HISTORY)
2944 else if (*qcp
== '\0' && history_expansion
&& cs
== COMPLETE_DQUOTE
&&
2945 history_expansion_inhibited
== 0 && xstrchr (s
, '!'))
2946 cs
= COMPLETE_BSQUOTE
;
2948 if (*qcp
== '"' && history_expansion
&& cs
== COMPLETE_DQUOTE
&&
2949 history_expansion_inhibited
== 0 && xstrchr (s
, '!'))
2951 cs
= COMPLETE_BSQUOTE
;
2956 /* Don't tilde-expand backslash-quoted filenames, since only single and
2957 double quotes inhibit tilde expansion. */
2959 if (mtext
[0] == '~' && rtype
== SINGLE_MATCH
&& cs
!= COMPLETE_BSQUOTE
)
2960 mtext
= bash_tilde_expand (s
, 0);
2964 case COMPLETE_DQUOTE
:
2965 rtext
= sh_double_quote (mtext
);
2967 case COMPLETE_SQUOTE
:
2968 rtext
= sh_single_quote (mtext
);
2970 case COMPLETE_BSQUOTE
:
2971 rtext
= sh_backslash_quote (mtext
);
2978 /* We may need to quote additional characters: those that readline treats
2979 as word breaks that are not quoted by backslash_quote. */
2980 if (rtext
&& cs
== COMPLETE_BSQUOTE
)
2982 mtext
= quote_word_break_chars (rtext
);
2987 /* Leave the opening quote intact. The readline completion code takes
2988 care of avoiding doubled opening quotes. */
2989 rlen
= strlen (rtext
);
2990 ret
= (char *)xmalloc (rlen
+ 1);
2991 strcpy (ret
, rtext
);
2993 /* If there are multiple matches, cut off the closing quote. */
2994 if (rtype
== MULT_MATCH
&& cs
!= COMPLETE_BSQUOTE
)
2995 ret
[rlen
- 1] = '\0';
3000 /* Support for binding readline key sequences to Unix commands. */
3001 static Keymap cmd_xmap
;
3004 bash_execute_unix_command (count
, key
)
3005 int count
; /* ignored */
3008 Keymap ckmap
; /* current keymap */
3009 Keymap xkmap
; /* unix command executing keymap */
3012 sh_parser_state_t ps
;
3014 /* First, we need to find the right command to execute. This is tricky,
3015 because we might have already indirected into another keymap. */
3016 ckmap
= rl_get_keymap ();
3017 if (ckmap
!= rl_executing_keymap
)
3019 /* bogus. we have to search. only handle one level of indirection. */
3020 for (i
= 0; i
< KEYMAP_SIZE
; i
++)
3022 if (ckmap
[i
].type
== ISKMAP
&& (Keymap
)ckmap
[i
].function
== rl_executing_keymap
)
3025 if (i
< KEYMAP_SIZE
)
3026 xkmap
= (Keymap
)cmd_xmap
[i
].function
;
3030 internal_error (_("bash_execute_unix_command: cannot find keymap for command"));
3031 rl_forced_update_display ();
3038 cmd
= (char *)xkmap
[key
].function
;
3046 rl_crlf (); /* move to a new line */
3048 save_parser_state (&ps
);
3050 cmd
= savestring (cmd
);
3051 parse_and_execute (cmd
, "bash_execute_unix_command", SEVAL_NOHIST
);
3053 restore_parser_state (&ps
);
3055 /* and restore the readline buffer and display after command execution. */
3056 rl_forced_update_display ();
3061 init_unix_command_map ()
3063 cmd_xmap
= rl_make_bare_keymap ();
3067 isolate_sequence (string
, ind
, need_dquote
, startp
)
3069 int ind
, need_dquote
, *startp
;
3072 int c
, passc
, delim
;
3074 for (i
= ind
; string
[i
] && whitespace (string
[i
]); i
++)
3076 /* NEED_DQUOTE means that the first non-white character *must* be `"'. */
3077 if (need_dquote
&& string
[i
] != '"')
3079 builtin_error (_("%s: first non-whitespace character is not `\"'"), string
);
3083 /* We can have delimited strings even if NEED_DQUOTE == 0, like the command
3084 string to bind the key sequence to. */
3085 delim
= (string
[i
] == '"' || string
[i
] == '\'') ? string
[i
] : 0;
3088 *startp
= delim
? ++i
: i
;
3090 for (passc
= 0; c
= string
[i
]; i
++)
3106 if (delim
&& string
[i
] != delim
)
3108 builtin_error (_("no closing `%c' in %s"), delim
, string
);
3116 bind_keyseq_to_unix_command (line
)
3124 init_unix_command_map ();
3126 kmap
= rl_get_keymap ();
3128 /* We duplicate some of the work done by rl_parse_and_bind here, but
3129 this code only has to handle `"keyseq": ["]command["]' and can
3130 generate an error for anything else. */
3131 i
= isolate_sequence (line
, 0, 1, &kstart
);
3135 /* Create the key sequence string to pass to rl_generic_bind */
3136 kseq
= substring (line
, kstart
, i
);
3138 for ( ; line
[i
] && line
[i
] != ':'; i
++)
3142 builtin_error (_("%s: missing colon separator"), line
);
3146 i
= isolate_sequence (line
, i
+ 1, 0, &kstart
);
3150 /* Create the value string containing the command to execute. */
3151 value
= substring (line
, kstart
, i
);
3153 /* Save the command to execute and the key sequence in the CMD_XMAP */
3154 rl_generic_bind (ISMACR
, kseq
, value
, cmd_xmap
);
3156 /* and bind the key sequence in the current keymap to a function that
3157 understands how to execute from CMD_XMAP */
3158 rl_bind_keyseq_in_map (kseq
, bash_execute_unix_command
, kmap
);
3163 /* Used by the programmable completion code. Complete TEXT as a filename,
3164 but return only directories as matches. Dequotes the filename before
3165 attempting to find matches. */
3167 bash_directory_completion_matches (text
)
3174 qc
= rl_dispatching
? rl_completion_quote_character
: 0;
3175 dfn
= bash_dequote_filename ((char *)text
, qc
);
3176 m1
= rl_completion_matches (dfn
, rl_filename_completion_function
);
3179 if (m1
== 0 || m1
[0] == 0)
3181 /* We don't bother recomputing the lcd of the matches, because it will just
3182 get thrown away by the programmable completion code and recomputed
3184 (void)bash_ignore_filenames (m1
);
3189 bash_dequote_text (text
)
3195 qc
= (text
[0] == '"' || text
[0] == '\'') ? text
[0] : 0;
3196 dtxt
= bash_dequote_filename ((char *)text
, qc
);
3199 #endif /* READLINE */