1 This file is complete.def, from which is created complete.c.
2 It implements the builtins "complete", "compgen", and "compopt" in Bash.
4 Copyright (C) 1999-2015 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 Bash is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 Bash is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
24 $DEPENDS_ON PROGRAMMABLE_COMPLETION
25 $FUNCTION complete_builtin
26 $SHORT_DOC complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
27 Specify how arguments are to be completed by Readline.
29 For each NAME, specify how arguments are to be completed. If no options
30 are supplied, existing completion specifications are printed in a way that
31 allows them to be reused as input.
34 -p print existing completion specifications in a reusable format
35 -r remove a completion specification for each NAME, or, if no
36 NAMEs are supplied, all completion specifications
37 -D apply the completions and actions as the default for commands
38 without any specific completion defined
39 -E apply the completions and actions to "empty" commands --
40 completion attempted on a blank line
42 When completion is attempted, the actions are applied in the order the
43 uppercase-letter options are listed above. The -D option takes
47 Returns success unless an invalid option is supplied or an error occurs.
54 #include "../bashtypes.h"
56 #if defined (HAVE_UNISTD_H)
60 #include "../bashansi.h"
61 #include "../bashintl.h"
64 #include "../builtins.h"
65 #include "../pcomplete.h"
66 #include "../bashline.h"
69 #include "bashgetopt.h"
71 #include <readline/readline.h>
73 #define STRDUP(x) ((x) ? savestring (x) : (char *)NULL)
75 /* Structure containing all the non-action (binary) options; filled in by
84 static int find_compact __P((char *));
85 static int find_compopt __P((char *));
87 static int build_actions __P((WORD_LIST *, struct _optflags *, unsigned long *, unsigned long *));
89 static int remove_cmd_completions __P((WORD_LIST *));
91 static int print_one_completion __P((char *, COMPSPEC *));
92 static int print_compitem __P((BUCKET_CONTENTS *));
93 static void print_compopts __P((const char *, COMPSPEC *, int));
94 static void print_all_completions __P((void));
95 static int print_cmd_completions __P((WORD_LIST *));
97 static char *Garg, *Warg, *Parg, *Sarg, *Xarg, *Farg, *Carg;
99 static const struct _compacts {
100 const char * const actname;
104 { "alias", CA_ALIAS, 'a' },
105 { "arrayvar", CA_ARRAYVAR, 0 },
106 { "binding", CA_BINDING, 0 },
107 { "builtin", CA_BUILTIN, 'b' },
108 { "command", CA_COMMAND, 'c' },
109 { "directory", CA_DIRECTORY, 'd' },
110 { "disabled", CA_DISABLED, 0 },
111 { "enabled", CA_ENABLED, 0 },
112 { "export", CA_EXPORT, 'e' },
113 { "file", CA_FILE, 'f' },
114 { "function", CA_FUNCTION, 0 },
115 { "helptopic", CA_HELPTOPIC, 0 },
116 { "hostname", CA_HOSTNAME, 0 },
117 { "group", CA_GROUP, 'g' },
118 { "job", CA_JOB, 'j' },
119 { "keyword", CA_KEYWORD, 'k' },
120 { "running", CA_RUNNING, 0 },
121 { "service", CA_SERVICE, 's' },
122 { "setopt", CA_SETOPT, 0 },
123 { "shopt", CA_SHOPT, 0 },
124 { "signal", CA_SIGNAL, 0 },
125 { "stopped", CA_STOPPED, 0 },
126 { "user", CA_USER, 'u' },
127 { "variable", CA_VARIABLE, 'v' },
128 { (char *)NULL, 0, 0 },
131 /* This should be a STRING_INT_ALIST */
132 static const struct _compopt {
133 const char * const optname;
136 { "bashdefault", COPT_BASHDEFAULT },
137 { "default", COPT_DEFAULT },
138 { "dirnames", COPT_DIRNAMES },
139 { "filenames",COPT_FILENAMES},
140 { "noquote", COPT_NOQUOTE },
141 { "nosort", COPT_NOSORT },
142 { "nospace", COPT_NOSPACE },
143 { "plusdirs", COPT_PLUSDIRS },
153 for (i = 0; compacts[i].actname; i++)
154 if (STREQ (name, compacts[i].actname))
165 for (i = 0; compopts[i].optname; i++)
166 if (STREQ (name, compopts[i].optname))
171 /* Build the actions and compspec options from the options specified in LIST.
172 ACTP is a pointer to an unsigned long in which to place the bitmap of
173 actions. OPTP is a pointer to an unsigned long in which to place the
174 bitmap of compspec options (arguments to `-o'). PP, if non-null, gets 1
175 if -p is supplied; RP, if non-null, gets 1 if -r is supplied.
176 If either is null, the corresponding option generates an error.
177 This also sets variables corresponding to options that take arguments as
178 a side effect; the caller should ensure that those variables are set to
179 NULL before calling build_actions. Return value:
180 EX_USAGE = bad option
181 EXECUTION_SUCCESS = some options supplied
182 EXECUTION_FAILURE = no options supplied
186 build_actions (list, flagp, actp, optp)
188 struct _optflags *flagp;
189 unsigned long *actp, *optp;
191 int opt, ind, opt_given;
192 unsigned long acts, copts;
194 acts = copts = (unsigned long)0L;
197 reset_internal_getopt ();
198 while ((opt = internal_getopt (list, "abcdefgjko:prsuvA:G:W:P:S:X:F:C:DE")) != -1)
211 sh_invalidopt ("-r");
224 sh_invalidopt ("-p");
239 acts |= CA_DIRECTORY;
266 ind = find_compopt (list_optarg);
269 sh_invalidoptname (list_optarg);
272 copts |= compopts[ind].optflag;
275 ind = find_compact (list_optarg);
278 builtin_error (_("%s: invalid action name"), list_optarg);
281 acts |= compacts[ind].actflag;
294 sh_invalidopt ("-D");
306 sh_invalidopt ("-E");
338 return (opt_given ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
341 /* Add, remove, and display completion specifiers. */
343 complete_builtin (list)
347 unsigned long acts, copts;
349 struct _optflags oflags;
354 print_all_completions ();
355 return (EXECUTION_SUCCESS);
358 opt_given = oflags.pflag = oflags.rflag = oflags.Dflag = oflags.Eflag = 0;
360 acts = copts = (unsigned long)0L;
361 Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
362 cs = (COMPSPEC *)NULL;
364 /* Build the actions from the arguments. Also sets the [A-Z]arg variables
365 as a side effect if they are supplied as options. */
366 rval = build_actions (list, &oflags, &acts, &copts);
367 if (rval == EX_USAGE)
369 opt_given = rval != EXECUTION_FAILURE;
373 wl = oflags.Dflag ? make_word_list (make_bare_word (DEFAULTCMD), (WORD_LIST *)NULL)
374 : (oflags.Eflag ? make_word_list (make_bare_word (EMPTYCMD), (WORD_LIST *)NULL) : 0);
376 /* -p overrides everything else */
377 if (oflags.pflag || (list == 0 && opt_given == 0))
381 rval = print_cmd_completions (wl);
387 print_all_completions ();
388 return (EXECUTION_SUCCESS);
390 return (print_cmd_completions (list));
393 /* next, -r overrides everything else. */
398 rval = remove_cmd_completions (wl);
405 return (EXECUTION_SUCCESS);
407 return (remove_cmd_completions (list));
410 if (wl == 0 && list == 0 && opt_given)
416 /* If we get here, we need to build a compspec and add it for each
417 remaining argument. */
418 cs = compspec_create ();
422 cs->globpat = STRDUP (Garg);
423 cs->words = STRDUP (Warg);
424 cs->prefix = STRDUP (Parg);
425 cs->suffix = STRDUP (Sarg);
426 cs->funcname = STRDUP (Farg);
427 cs->command = STRDUP (Carg);
428 cs->filterpat = STRDUP (Xarg);
430 for (rval = EXECUTION_SUCCESS, l = wl ? wl : list ; l; l = l->next)
432 /* Add CS as the compspec for the specified commands. */
433 if (progcomp_insert (l->word->word, cs) == 0)
434 rval = EXECUTION_FAILURE;
442 remove_cmd_completions (list)
448 for (ret = EXECUTION_SUCCESS, l = list; l; l = l->next)
450 if (progcomp_remove (l->word->word) == 0)
452 builtin_error (_("%s: no completion specification"), l->word->word);
453 ret = EXECUTION_FAILURE;
459 #define SQPRINTARG(a, f) \
463 x = sh_single_quote (a); \
464 printf ("%s %s ", f, x); \
469 #define PRINTARG(a, f) \
472 printf ("%s %s ", f, a); \
475 #define PRINTOPT(a, f) \
481 #define PRINTACT(a, f) \
484 printf ("-A %s ", f); \
487 #define PRINTCOMPOPT(a, f) \
490 printf ("-o %s ", f); \
493 #define XPRINTCOMPOPT(a, f) \
496 printf ("-o %s ", f); \
498 printf ("+o %s ", f); \
502 print_one_completion (cmd, cs)
506 unsigned long acts, copts;
509 printf ("complete ");
513 /* First, print the -o options. */
514 PRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
515 PRINTCOMPOPT (COPT_DEFAULT, "default");
516 PRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
517 PRINTCOMPOPT (COPT_FILENAMES, "filenames");
518 PRINTCOMPOPT (COPT_NOSPACE, "nospace");
519 PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
523 /* simple flags next */
524 PRINTOPT (CA_ALIAS, "-a");
525 PRINTOPT (CA_BUILTIN, "-b");
526 PRINTOPT (CA_COMMAND, "-c");
527 PRINTOPT (CA_DIRECTORY, "-d");
528 PRINTOPT (CA_EXPORT, "-e");
529 PRINTOPT (CA_FILE, "-f");
530 PRINTOPT (CA_GROUP, "-g");
531 PRINTOPT (CA_JOB, "-j");
532 PRINTOPT (CA_KEYWORD, "-k");
533 PRINTOPT (CA_SERVICE, "-s");
534 PRINTOPT (CA_USER, "-u");
535 PRINTOPT (CA_VARIABLE, "-v");
537 /* now the rest of the actions */
538 PRINTACT (CA_ARRAYVAR, "arrayvar");
539 PRINTACT (CA_BINDING, "binding");
540 PRINTACT (CA_DISABLED, "disabled");
541 PRINTACT (CA_ENABLED, "enabled");
542 PRINTACT (CA_FUNCTION, "function");
543 PRINTACT (CA_HELPTOPIC, "helptopic");
544 PRINTACT (CA_HOSTNAME, "hostname");
545 PRINTACT (CA_RUNNING, "running");
546 PRINTACT (CA_SETOPT, "setopt");
547 PRINTACT (CA_SHOPT, "shopt");
548 PRINTACT (CA_SIGNAL, "signal");
549 PRINTACT (CA_STOPPED, "stopped");
551 /* now the rest of the arguments */
553 /* arguments that require quoting */
554 SQPRINTARG (cs->globpat, "-G");
555 SQPRINTARG (cs->words, "-W");
556 SQPRINTARG (cs->prefix, "-P");
557 SQPRINTARG (cs->suffix, "-S");
558 SQPRINTARG (cs->filterpat, "-X");
560 SQPRINTARG (cs->command, "-C");
562 /* simple arguments that don't require quoting */
563 PRINTARG (cs->funcname, "-F");
565 if (STREQ (cmd, EMPTYCMD))
567 else if (STREQ (cmd, DEFAULTCMD))
570 printf ("%s\n", cmd);
576 print_compopts (cmd, cs, full)
588 XPRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
589 XPRINTCOMPOPT (COPT_DEFAULT, "default");
590 XPRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
591 XPRINTCOMPOPT (COPT_FILENAMES, "filenames");
592 XPRINTCOMPOPT (COPT_NOSPACE, "nospace");
593 XPRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
597 PRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
598 PRINTCOMPOPT (COPT_DEFAULT, "default");
599 PRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
600 PRINTCOMPOPT (COPT_FILENAMES, "filenames");
601 PRINTCOMPOPT (COPT_NOSPACE, "nospace");
602 PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
605 if (STREQ (cmd, EMPTYCMD))
607 else if (STREQ (cmd, DEFAULTCMD))
610 printf ("%s\n", cmd);
614 print_compitem (item)
615 BUCKET_CONTENTS *item;
621 cs = (COMPSPEC *)item->data;
623 return (print_one_completion (cmd, cs));
627 print_all_completions ()
629 progcomp_walk (print_compitem);
633 print_cmd_completions (list)
640 for (ret = EXECUTION_SUCCESS, l = list; l; l = l->next)
642 cs = progcomp_search (l->word->word);
644 print_one_completion (l->word->word, cs);
647 builtin_error (_("%s: no completion specification"), l->word->word);
648 ret = EXECUTION_FAILURE;
652 return (sh_chkwrite (ret));
656 $DEPENDS_ON PROGRAMMABLE_COMPLETION
657 $FUNCTION compgen_builtin
658 $SHORT_DOC compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
659 Display possible completions depending on the options.
661 Intended to be used from within a shell function generating possible
662 completions. If the optional WORD argument is supplied, matches against
666 Returns success unless an invalid option is supplied or an error occurs.
670 compgen_builtin (list)
674 unsigned long acts, copts;
677 char *word, **matches;
680 return (EXECUTION_SUCCESS);
682 acts = copts = (unsigned long)0L;
683 Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
684 cs = (COMPSPEC *)NULL;
686 /* Build the actions from the arguments. Also sets the [A-Z]arg variables
687 as a side effect if they are supplied as options. */
688 rval = build_actions (list, (struct _optflags *)NULL, &acts, &copts);
689 if (rval == EX_USAGE)
691 if (rval == EXECUTION_FAILURE)
692 return (EXECUTION_SUCCESS);
696 word = (list && list->word) ? list->word->word : "";
699 builtin_error (_("warning: -F option may not work as you expect"));
701 builtin_error (_("warning: -C option may not work as you expect"));
703 /* If we get here, we need to build a compspec and evaluate it. */
704 cs = compspec_create ();
709 cs->globpat = STRDUP (Garg);
710 cs->words = STRDUP (Warg);
711 cs->prefix = STRDUP (Parg);
712 cs->suffix = STRDUP (Sarg);
713 cs->funcname = STRDUP (Farg);
714 cs->command = STRDUP (Carg);
715 cs->filterpat = STRDUP (Xarg);
717 rval = EXECUTION_FAILURE;
718 sl = gen_compspec_completions (cs, "compgen", word, 0, 0, 0);
720 /* If the compspec wants the bash default completions, temporarily
721 turn off programmable completion and call the bash completion code. */
722 if ((sl == 0 || sl->list_len == 0) && (copts & COPT_BASHDEFAULT))
724 matches = bash_default_completion (word, 0, 0, 0, 0);
725 sl = completions_to_stringlist (matches);
726 strvec_dispose (matches);
729 /* This isn't perfect, but it's the best we can do, given what readline
730 exports from its set of completion utility functions. */
731 if ((sl == 0 || sl->list_len == 0) && (copts & COPT_DEFAULT))
733 matches = rl_completion_matches (word, rl_filename_completion_function);
734 strlist_dispose (sl);
735 sl = completions_to_stringlist (matches);
736 strvec_dispose (matches);
741 if (sl->list && sl->list_len)
743 rval = EXECUTION_SUCCESS;
744 strlist_print (sl, (char *)NULL);
746 strlist_dispose (sl);
749 compspec_dispose (cs);
754 $DEPENDS_ON PROGRAMMABLE_COMPLETION
755 $FUNCTION compopt_builtin
756 $SHORT_DOC compopt [-o|+o option] [-DE] [name ...]
757 Modify or display completion options.
759 Modify the completion options for each NAME, or, if no NAMEs are supplied,
760 the completion currently being executed. If no OPTIONs are given, print
761 the completion options for each NAME or the current completion specification.
764 -o option Set completion option OPTION for each NAME
765 -D Change options for the "default" command completion
766 -E Change options for the "empty" command completion
768 Using `+o' instead of `-o' turns off the specified option.
772 Each NAME refers to a command for which a completion specification must
773 have previously been defined using the `complete' builtin. If no NAMEs
774 are supplied, compopt must be called by a function currently generating
775 completions, and the options for that currently-executing completion
776 generator are modified.
779 Returns success unless an invalid option is supplied or NAME does not
780 have a completion specification defined.
784 compopt_builtin (list)
787 int opts_on, opts_off, *opts, opt, oind, ret, Dflag, Eflag;
791 opts_on = opts_off = Eflag = Dflag = 0;
792 ret = EXECUTION_SUCCESS;
794 reset_internal_getopt ();
795 while ((opt = internal_getopt (list, "+o:DE")) != -1)
797 opts = (list_opttype == '-') ? &opts_on : &opts_off;
802 oind = find_compopt (list_optarg);
805 sh_invalidoptname (list_optarg);
808 *opts |= compopts[oind].optflag;
824 wl = Dflag ? make_word_list (make_bare_word (DEFAULTCMD), (WORD_LIST *)NULL)
825 : (Eflag ? make_word_list (make_bare_word (EMPTYCMD), (WORD_LIST *)NULL) : 0);
827 if (list == 0 && wl == 0)
829 if (RL_ISSTATE (RL_STATE_COMPLETING) == 0 || pcomp_curcs == 0)
831 builtin_error (_("not currently executing completion function"));
832 return (EXECUTION_FAILURE);
836 if (opts_on == 0 && opts_off == 0)
838 print_compopts (pcomp_curcmd, cs, 1);
839 return (sh_chkwrite (ret));
842 /* Set the compspec options */
843 pcomp_set_compspec_options (cs, opts_on, 1);
844 pcomp_set_compspec_options (cs, opts_off, 0);
846 /* And change the readline variables the options control */
847 pcomp_set_readline_variables (opts_on, 1);
848 pcomp_set_readline_variables (opts_off, 0);
853 for (l = wl ? wl : list; l; l = l->next)
855 cs = progcomp_search (l->word->word);
858 builtin_error (_("%s: no completion specification"), l->word->word);
859 ret = EXECUTION_FAILURE;
862 if (opts_on == 0 && opts_off == 0)
864 print_compopts (l->word->word, cs, 1);
865 continue; /* XXX -- fill in later */
868 /* Set the compspec options */
869 pcomp_set_compspec_options (cs, opts_on, 1);
870 pcomp_set_compspec_options (cs, opts_off, 0);