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-2011 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 { "nospace", COPT_NOSPACE },
142 { "plusdirs", COPT_PLUSDIRS },
152 for (i = 0; compacts[i].actname; i++)
153 if (STREQ (name, compacts[i].actname))
164 for (i = 0; compopts[i].optname; i++)
165 if (STREQ (name, compopts[i].optname))
170 /* Build the actions and compspec options from the options specified in LIST.
171 ACTP is a pointer to an unsigned long in which to place the bitmap of
172 actions. OPTP is a pointer to an unsigned long in which to place the
173 btmap of compspec options (arguments to `-o'). PP, if non-null, gets 1
174 if -p is supplied; RP, if non-null, gets 1 if -r is supplied.
175 If either is null, the corresponding option generates an error.
176 This also sets variables corresponding to options that take arguments as
177 a side effect; the caller should ensure that those variables are set to
178 NULL before calling build_actions. Return value:
179 EX_USAGE = bad option
180 EXECUTION_SUCCESS = some options supplied
181 EXECUTION_FAILURE = no options supplied
185 build_actions (list, flagp, actp, optp)
187 struct _optflags *flagp;
188 unsigned long *actp, *optp;
190 int opt, ind, opt_given;
191 unsigned long acts, copts;
193 acts = copts = (unsigned long)0L;
196 reset_internal_getopt ();
197 while ((opt = internal_getopt (list, "abcdefgjko:prsuvA:G:W:P:S:X:F:C:DE")) != -1)
210 sh_invalidopt ("-r");
223 sh_invalidopt ("-p");
238 acts |= CA_DIRECTORY;
265 ind = find_compopt (list_optarg);
268 sh_invalidoptname (list_optarg);
271 copts |= compopts[ind].optflag;
274 ind = find_compact (list_optarg);
277 builtin_error (_("%s: invalid action name"), list_optarg);
280 acts |= compacts[ind].actflag;
293 sh_invalidopt ("-D");
305 sh_invalidopt ("-E");
336 return (opt_given ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
339 /* Add, remove, and display completion specifiers. */
341 complete_builtin (list)
345 unsigned long acts, copts;
347 struct _optflags oflags;
352 print_all_completions ();
353 return (EXECUTION_SUCCESS);
356 opt_given = oflags.pflag = oflags.rflag = oflags.Dflag = oflags.Eflag = 0;
358 acts = copts = (unsigned long)0L;
359 Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
360 cs = (COMPSPEC *)NULL;
362 /* Build the actions from the arguments. Also sets the [A-Z]arg variables
363 as a side effect if they are supplied as options. */
364 rval = build_actions (list, &oflags, &acts, &copts);
365 if (rval == EX_USAGE)
367 opt_given = rval != EXECUTION_FAILURE;
371 wl = oflags.Dflag ? make_word_list (make_bare_word (DEFAULTCMD), (WORD_LIST *)NULL)
372 : (oflags.Eflag ? make_word_list (make_bare_word (EMPTYCMD), (WORD_LIST *)NULL) : 0);
374 /* -p overrides everything else */
375 if (oflags.pflag || (list == 0 && opt_given == 0))
379 rval = print_cmd_completions (wl);
385 print_all_completions ();
386 return (EXECUTION_SUCCESS);
388 return (print_cmd_completions (list));
391 /* next, -r overrides everything else. */
396 rval = remove_cmd_completions (wl);
403 return (EXECUTION_SUCCESS);
405 return (remove_cmd_completions (list));
408 if (wl == 0 && list == 0 && opt_given)
414 /* If we get here, we need to build a compspec and add it for each
415 remaining argument. */
416 cs = compspec_create ();
420 cs->globpat = STRDUP (Garg);
421 cs->words = STRDUP (Warg);
422 cs->prefix = STRDUP (Parg);
423 cs->suffix = STRDUP (Sarg);
424 cs->funcname = STRDUP (Farg);
425 cs->command = STRDUP (Carg);
426 cs->filterpat = STRDUP (Xarg);
428 for (rval = EXECUTION_SUCCESS, l = wl ? wl : list ; l; l = l->next)
430 /* Add CS as the compspec for the specified commands. */
431 if (progcomp_insert (l->word->word, cs) == 0)
432 rval = EXECUTION_FAILURE;
440 remove_cmd_completions (list)
446 for (ret = EXECUTION_SUCCESS, l = list; l; l = l->next)
448 if (progcomp_remove (l->word->word) == 0)
450 builtin_error (_("%s: no completion specification"), l->word->word);
451 ret = EXECUTION_FAILURE;
457 #define SQPRINTARG(a, f) \
461 x = sh_single_quote (a); \
462 printf ("%s %s ", f, x); \
467 #define PRINTARG(a, f) \
470 printf ("%s %s ", f, a); \
473 #define PRINTOPT(a, f) \
479 #define PRINTACT(a, f) \
482 printf ("-A %s ", f); \
485 #define PRINTCOMPOPT(a, f) \
488 printf ("-o %s ", f); \
491 #define XPRINTCOMPOPT(a, f) \
494 printf ("-o %s ", f); \
496 printf ("+o %s ", f); \
500 print_one_completion (cmd, cs)
504 unsigned long acts, copts;
507 printf ("complete ");
511 /* First, print the -o options. */
512 PRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
513 PRINTCOMPOPT (COPT_DEFAULT, "default");
514 PRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
515 PRINTCOMPOPT (COPT_FILENAMES, "filenames");
516 PRINTCOMPOPT (COPT_NOSPACE, "nospace");
517 PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
521 /* simple flags next */
522 PRINTOPT (CA_ALIAS, "-a");
523 PRINTOPT (CA_BUILTIN, "-b");
524 PRINTOPT (CA_COMMAND, "-c");
525 PRINTOPT (CA_DIRECTORY, "-d");
526 PRINTOPT (CA_EXPORT, "-e");
527 PRINTOPT (CA_FILE, "-f");
528 PRINTOPT (CA_GROUP, "-g");
529 PRINTOPT (CA_JOB, "-j");
530 PRINTOPT (CA_KEYWORD, "-k");
531 PRINTOPT (CA_SERVICE, "-s");
532 PRINTOPT (CA_USER, "-u");
533 PRINTOPT (CA_VARIABLE, "-v");
535 /* now the rest of the actions */
536 PRINTACT (CA_ARRAYVAR, "arrayvar");
537 PRINTACT (CA_BINDING, "binding");
538 PRINTACT (CA_DISABLED, "disabled");
539 PRINTACT (CA_ENABLED, "enabled");
540 PRINTACT (CA_FUNCTION, "function");
541 PRINTACT (CA_HELPTOPIC, "helptopic");
542 PRINTACT (CA_HOSTNAME, "hostname");
543 PRINTACT (CA_RUNNING, "running");
544 PRINTACT (CA_SETOPT, "setopt");
545 PRINTACT (CA_SHOPT, "shopt");
546 PRINTACT (CA_SIGNAL, "signal");
547 PRINTACT (CA_STOPPED, "stopped");
549 /* now the rest of the arguments */
551 /* arguments that require quoting */
552 SQPRINTARG (cs->globpat, "-G");
553 SQPRINTARG (cs->words, "-W");
554 SQPRINTARG (cs->prefix, "-P");
555 SQPRINTARG (cs->suffix, "-S");
556 SQPRINTARG (cs->filterpat, "-X");
558 SQPRINTARG (cs->command, "-C");
560 /* simple arguments that don't require quoting */
561 PRINTARG (cs->funcname, "-F");
563 if (STREQ (cmd, EMPTYCMD))
565 else if (STREQ (cmd, DEFAULTCMD))
568 printf ("%s\n", cmd);
574 print_compopts (cmd, cs, full)
586 XPRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
587 XPRINTCOMPOPT (COPT_DEFAULT, "default");
588 XPRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
589 XPRINTCOMPOPT (COPT_FILENAMES, "filenames");
590 XPRINTCOMPOPT (COPT_NOSPACE, "nospace");
591 XPRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
595 PRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
596 PRINTCOMPOPT (COPT_DEFAULT, "default");
597 PRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
598 PRINTCOMPOPT (COPT_FILENAMES, "filenames");
599 PRINTCOMPOPT (COPT_NOSPACE, "nospace");
600 PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
603 if (STREQ (cmd, EMPTYCMD))
605 else if (STREQ (cmd, DEFAULTCMD))
608 printf ("%s\n", cmd);
612 print_compitem (item)
613 BUCKET_CONTENTS *item;
619 cs = (COMPSPEC *)item->data;
621 return (print_one_completion (cmd, cs));
625 print_all_completions ()
627 progcomp_walk (print_compitem);
631 print_cmd_completions (list)
638 for (ret = EXECUTION_SUCCESS, l = list; l; l = l->next)
640 cs = progcomp_search (l->word->word);
642 print_one_completion (l->word->word, cs);
645 builtin_error (_("%s: no completion specification"), l->word->word);
646 ret = EXECUTION_FAILURE;
650 return (sh_chkwrite (ret));
654 $DEPENDS_ON PROGRAMMABLE_COMPLETION
655 $FUNCTION compgen_builtin
656 $SHORT_DOC compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
657 Display possible completions depending on the options.
659 Intended to be used from within a shell function generating possible
660 completions. If the optional WORD argument is supplied, matches against
664 Returns success unless an invalid option is supplied or an error occurs.
668 compgen_builtin (list)
672 unsigned long acts, copts;
675 char *word, **matches;
678 return (EXECUTION_SUCCESS);
680 acts = copts = (unsigned long)0L;
681 Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
682 cs = (COMPSPEC *)NULL;
684 /* Build the actions from the arguments. Also sets the [A-Z]arg variables
685 as a side effect if they are supplied as options. */
686 rval = build_actions (list, (struct _optflags *)NULL, &acts, &copts);
687 if (rval == EX_USAGE)
689 if (rval == EXECUTION_FAILURE)
690 return (EXECUTION_SUCCESS);
694 word = (list && list->word) ? list->word->word : "";
697 builtin_error (_("warning: -F option may not work as you expect"));
699 builtin_error (_("warning: -C option may not work as you expect"));
701 /* If we get here, we need to build a compspec and evaluate it. */
702 cs = compspec_create ();
707 cs->globpat = STRDUP (Garg);
708 cs->words = STRDUP (Warg);
709 cs->prefix = STRDUP (Parg);
710 cs->suffix = STRDUP (Sarg);
711 cs->funcname = STRDUP (Farg);
712 cs->command = STRDUP (Carg);
713 cs->filterpat = STRDUP (Xarg);
715 rval = EXECUTION_FAILURE;
716 sl = gen_compspec_completions (cs, "compgen", word, 0, 0, 0);
718 /* If the compspec wants the bash default completions, temporarily
719 turn off programmable completion and call the bash completion code. */
720 if ((sl == 0 || sl->list_len == 0) && (copts & COPT_BASHDEFAULT))
722 matches = bash_default_completion (word, 0, 0, 0, 0);
723 sl = completions_to_stringlist (matches);
724 strvec_dispose (matches);
727 /* This isn't perfect, but it's the best we can do, given what readline
728 exports from its set of completion utility functions. */
729 if ((sl == 0 || sl->list_len == 0) && (copts & COPT_DEFAULT))
731 matches = rl_completion_matches (word, rl_filename_completion_function);
732 strlist_dispose (sl);
733 sl = completions_to_stringlist (matches);
734 strvec_dispose (matches);
739 if (sl->list && sl->list_len)
741 rval = EXECUTION_SUCCESS;
742 strlist_print (sl, (char *)NULL);
744 strlist_dispose (sl);
747 compspec_dispose (cs);
752 $DEPENDS_ON PROGRAMMABLE_COMPLETION
753 $FUNCTION compopt_builtin
754 $SHORT_DOC compopt [-o|+o option] [-DE] [name ...]
755 Modify or display completion options.
757 Modify the completion options for each NAME, or, if no NAMEs are supplied,
758 the completion currently being executed. If no OPTIONs are given, print
759 the completion options for each NAME or the current completion specification.
762 -o option Set completion option OPTION for each NAME
763 -D Change options for the "default" command completion
764 -E Change options for the "empty" command completion
766 Using `+o' instead of `-o' turns off the specified option.
770 Each NAME refers to a command for which a completion specification must
771 have previously been defined using the `complete' builtin. If no NAMEs
772 are supplied, compopt must be called by a function currently generating
773 completions, and the options for that currently-executing completion
774 generator are modified.
777 Returns success unless an invalid option is supplied or NAME does not
778 have a completion specification defined.
782 compopt_builtin (list)
785 int opts_on, opts_off, *opts, opt, oind, ret, Dflag, Eflag;
789 opts_on = opts_off = Eflag = Dflag = 0;
790 ret = EXECUTION_SUCCESS;
792 reset_internal_getopt ();
793 while ((opt = internal_getopt (list, "+o:DE")) != EOF)
795 opts = (list_opttype == '-') ? &opts_on : &opts_off;
800 oind = find_compopt (list_optarg);
803 sh_invalidoptname (list_optarg);
806 *opts |= compopts[oind].optflag;
821 wl = Dflag ? make_word_list (make_bare_word (DEFAULTCMD), (WORD_LIST *)NULL)
822 : (Eflag ? make_word_list (make_bare_word (EMPTYCMD), (WORD_LIST *)NULL) : 0);
824 if (list == 0 && wl == 0)
826 if (RL_ISSTATE (RL_STATE_COMPLETING) == 0 || pcomp_curcs == 0)
828 builtin_error (_("not currently executing completion function"));
829 return (EXECUTION_FAILURE);
833 if (opts_on == 0 && opts_off == 0)
835 print_compopts (pcomp_curcmd, cs, 1);
836 return (sh_chkwrite (ret));
839 /* Set the compspec options */
840 pcomp_set_compspec_options (cs, opts_on, 1);
841 pcomp_set_compspec_options (cs, opts_off, 0);
843 /* And change the readline variables the options control */
844 pcomp_set_readline_variables (opts_on, 1);
845 pcomp_set_readline_variables (opts_off, 0);
850 for (l = wl ? wl : list; l; l = l->next)
852 cs = progcomp_search (l->word->word);
855 builtin_error (_("%s: no completion specification"), l->word->word);
856 ret = EXECUTION_FAILURE;
859 if (opts_on == 0 && opts_off == 0)
861 print_compopts (l->word->word, cs, 1);
862 continue; /* XXX -- fill in later */
865 /* Set the compspec options */
866 pcomp_set_compspec_options (cs, opts_on, 1);
867 pcomp_set_compspec_options (cs, opts_off, 0);