summaryrefslogtreecommitdiff
path: root/README
diff options
context:
space:
mode:
authorGabriel F. T. Gomes <gabriel@inconstante.eti.br>2017-09-25 23:46:54 -0300
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>2017-09-25 23:46:54 -0300
commit6d88f1055806932d9291f96847d2b691cccda2cd (patch)
tree0ff79eedaa8a239331256048981deedbd0721965 /README
parent059a87a5936cfebfd2d71ab8057002cafb2ea051 (diff)
downloadbash-completion-6d88f1055806932d9291f96847d2b691cccda2cd.tar.gz
New upstream version 2.7upstream/2.7
Diffstat (limited to 'README')
-rw-r--r--README411
1 files changed, 0 insertions, 411 deletions
diff --git a/README b/README
deleted file mode 100644
index 1558f62f..00000000
--- a/README
+++ /dev/null
@@ -1,411 +0,0 @@
-INSTALLATION
-------------
-
-The easiest way to install this software is to use a package; it is available
-in many operating system distributions. The package's name is usually
-bash-completion. Depending on the package, you may still need to source it
-from either /etc/bashrc or ~/.bashrc (or any other file sourcing those). You
-can do this by simply using:
-
-# Use bash-completion, if available
-[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \
- . /usr/share/bash-completion/bash_completion
-
-(if you happen to have *only* bash >= 4.1 installed, see further if not)
-
-If you don't have the package readily available for your distribution, or
-you simply don't want to use one, you can install bash completion using the
-standard commands for GNU autotools packages:
-
-./configure
-make
-make check # optional, requires dejagnu and tcllib
-make install # as root
-
-These commands installs the completions and helpers, as well as a
-profile.d script that loads bash_completion where appropriate. If
-your system does not use the profile.d directory (usually below /etc)
-mechanism, i.e. does not automatically source shell scripts in it, you
-can source the $sysconfdir/profile.d/bash_completion.sh script in
-/etc/bashrc or ~/.bashrc.
-
-The profile.d script provides a configuration file hook that can be
-used to prevent loading bash_completion on per user basis when it's
-installed system wide. To do this, turn off programmable completion
-with "shopt -u progcomp" in $XDG_CONFIG_HOME/bash_completion
-(~/.config/bash_completion if $XDG_CONFIG_HOME is not set), and turn
-it back on for example in ~/.bashrc if you want to use programmable
-completion for other purposes.
-
-If you're using MacOS X, /etc/bashrc is apparently not sourced at all.
-In that case, you can put the bash_completion file in /sw/etc and add
-the following code to ~/.bash_profile:
-
-if [ -f /sw/etc/bash_completion ]; then
- . /sw/etc/bash_completion
-fi
-
-
-TROUBLESHOOTING
----------------
-
-If you find that a given function is producing errors under certain
-circumstances when you attempt completion, try running 'set -v' or
-'set -x' prior to attempting the completion again. This will produce
-useful debugging output that will aid us in fixing the problem if you
-are unable to do so yourself. Turn off the trace output by running
-either 'set +v' or 'set +x'.
-
-
-KNOWN PROBLEMS
---------------
-
-I.
-
-There seems to be some issue with using the bash built-in cd within
-Makefiles. When invoked as /bin/sh within Makefiles, bash seems to
-have a problem changing directory via the cd command. A work-around
-for this is to define SHELL=/bin/bash within your Makefile. This is
-believed to be a bug in bash.
-
-II.
-
-Many of the completion functions assume GNU versions of the various
-text utilities that they call (e.g. grep, sed and awk). Your mileage
-may vary.
-
-III.
-
-If you are seeing 'unbound variable' warnings from bash when hitting
-<Tab>, this is because you have either 'set -u' or 'set -o nounset'
-somewhere in your start-up files. This causes bash to flag the use of
-any uninitialised shell variables as an error.
-
-Whilst we try to avoid references to uninitialised variables in the
-code, there seem to be at least some cases where bash issues this
-warning even though the variable in question has been initialised.
-
-One place this appears to occur is within the _muttconffiles() helper
-function used by mutt completion, where the function calls itself
-recursively. This seems to confuse bash and it issues spurious
-warnings if 'nounset' is set.
-
-
-FAQ
----
-
-Q. The bash completion code inhibits some commands from completing on
- files with extensions that are legitimate in my environment. Do I
- have to disable completion for that command in order to complete on
- the files that I need to?
-
-A. No. Use M-/ to (in the words of the man page) attempt file name
- completion on the text to the left of the cursor. This will
- circumvent any file type restrictions put in place by the bash
- completion code.
-
-Q. How can I insert my own local completions without having to
- reinsert them every time you issue a new release?
-
-A. Put them in ~/.bash_completion, which is parsed at the end of the
- main completion script. See also the next question.
-
-Q. I author/maintain package X and would like to maintain my own
- completion code for this package. Where should I put it to be sure
- that interactive bash shells will find it and source it?
-
- Install it in one of the directories pointed to by
- bash-completion's pkgconfig file variables. There are two
- alternatives: the recommended one is 'completionsdir' (get it with
- "pkg-config --variable=completionsdir bash-completion") from which
- completions are loaded on demand based on invoked commands' names,
- so be sure to name your completion file accordingly, and to include
- for example symbolic links in case the file provides completions
- for more than one command. The other one which is present for
- backwards compatibility reasons is 'compatdir' (get it with
- "pkg-config --variable=compatdir bash-completion") from which files
- are loaded when bash_completion is loaded.
-
-Q. I use CVS in combination with passwordless ssh access to my remote
- repository. How can I have the cvs command complete on remotely
- checked-out files where relevant?
-
-A. Define $COMP_CVS_REMOTE. Setting this to anything will result in
- the behaviour you would like.
-
-Q. When I'm running a ./configure script and completion returns a list
- of long options to me, some of these take a parameter,
- e.g. --this-option=DESCRIPTION.
-
- Running ./configure --help lists these descriptions, but everything
- after the '=' is stripped when returning completions, so I don't
- know what kind of data is expected as a given option's parameter.
-
- Is there a way of getting ./configure completion to return the
- entire option string, so that I can see what kind of data is
- required and then simply delete the descriptive text and add my own
- data?
-
-A. Define $COMP_CONFIGURE_HINTS. Setting this to anything will result
- in the behaviour you would like.
-
-Q. When doing tar completion on a file within a tar file like this:
-
- tar tzvf foo.tar.gz <Tab>
-
- the pathnames contained in the tar file are not displayed
- correctly. The slashes are removed and everything looks like it's
- in a single directory. Why is this?
-
-A. It's a choice we had to make. bash's programmable completion is
- limited in how it handles the list of possible completions it
- returns.
-
- Because the paths returned from within the tar file are likely not
- existing paths on the file system, '-o dirnames' must be passed to
- the complete built-in to make it treat them as such. However, then
- bash will append a space when completing on directories during
- pathname completion to the tar files themselves.
-
- It's more important to have proper completion of paths to tar files
- than it is to have completion for their contents, so this sacrifice
- was made and '-o filenames' is used with complete instead.
-
- If you would rather have correct path completion for tar file
- contents, define $COMP_TAR_INTERNAL_PATHS *before* sourcing
- bash_completion.
-
-Q. When completing on a symlink to a directory, bash does not append
- the trailing / and I have to hit <Tab> again. I don't like this.
-
-A. This has nothing to do with bash_completion. It's the default for
- completing symlinks to directories since bash 2.05a, and was added
- because sometimes you want to operate on the symlink itself, rather
- than what it points to.
-
- You can get the pre-2.05a behaviour back by putting
- 'set mark-symlinked-directories on' in your /etc/inputrc or ~/.inputrc
- file.
-
-Q. Completion goes awry when I try to complete on something that contains
- a colon.
-
-A. This is actually a 'feature' of bash. bash recognises a colon as
- starting a new completion token, which is often what you want when
- completing something like a PATH variable:
-
- $ export PATH=/bin:/sbin:/usr<Tab>
-
- Without the special treatment of the colon, the above wouldn't work
- without programmable completion, so it has long been a feature of
- the shell.
-
- Unfortunately, you don't want the colon to be treated as a special
- case when doing something like:
-
- $ man File::B<Tab>
-
- Here, the colons make bash think that it's completing the a new
- token that begins with 'B'.
-
- Unfortunately, there's no way to turn this off. The only thing you
- can do is escape the colons with a backslash.
-
-Q. Why is rpm completion so slow with -q?
-
-A. Probably because the database is being queried every time and this uses a
- lot of memory.
-
- You can make this faster by pregenerating the list of installed packages on
- the system. Make sure you have a readable file called /var/log/rpmpkgs.
- It's generated by /etc/cron.daily/rpm on modern Red Hat and Mandrake
- Linux systems.
-
- If you don't have such a cron job, make one:
-
- #!/bin/sh
-
- rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' 2>&1 \
- | sort > /var/log/rpmpkgs
-
- rpm completion will use this flat text file instead of the RPM database,
- unless it detects that the database has changed since the file was created,
- in which case it will still use the database to ensure accuracy.
-
-Q. Can tab completion be made even easier?
-
-A. The readline(3) library offers a few settings that can make tab
- completion easier (or at least different) to use.
-
- For example, try putting the following in either /etc/inputrc or
- ~/.inputrc:
-
- set show-all-if-ambiguous on
-
- This will allow single tab completion as opposed to requiring a
- double tab. This makes things much more pleasant, in our opinion.
-
- set visible-stats on
-
- This will suffix each returned file completion with a character
- denoting its type, in a similar way to ls(1) with -F or --classify.
-
- set page-completions off
-
- This turns off the use of the internal pager when returning long
- completion lists.
-
-Q. Is bash the be-all-and-end-all of completion as far as shells go?
-
-A. Absolutely not. zsh has an extremely sophisticated completion system
- that offers many features absent from the bash implementation. Its
- users often cannot resist pointing this out. More information can
- be found at:
-
- http://www.zsh.org/
-
-
-CONTRIBUTING
-------------
-
-Contributions to the bash completion project are more than
-welcome. Fixes, clean-ups and improvements of existing code are much
-appreciated, as are completion functions for new commands.
-
-If you wish to contribute code, please bare the following coding
-guidelines in mind:
-
-- Do not use Perl, Ruby, Python etc. to do text processing unless the
- command for which you are writing the completion code implies the
- presence of one of those languages.
-
- For example, if you were writing completion code for perldoc(1), the
- use of Perl to achieve your goal would be acceptable. irb(1)
- completion would similarly make the use of Ruby acceptable.
-
- Even so, please consider alternatives to these large and slow to
- start interpreters. Use lightweight programs such as grep(1), awk(1)
- and sed(1).
-
-- Use the full power of bash >= 4.1. We no longer support earlier bash
- versions, so you may as well use all the features of that version of
- bash to optimise your code. However, be careful when using features
- added since bash 4.1, since not everyone will be able to use them.
-
- For example, extended globs often enable you to avoid the use of
- external programs, which are expensive to fork and execute, so do
- make full use of those:
-
- ?(pattern-list) - match zero or one occurrences of patterns
- *(pattern-list) - match zero or more occurrences of patterns
- +(pattern-list) - match one or more occurrences of patterns
- @(pattern-list) - match exactly one of the given patterns
- !(pattern-list) - match anything except one of the given patterns
-
-- Following on from the last point, be sparing with the use of
- external processes whenever you can. Completion functions need to be
- fast, so sacrificing some code legibility for speed is acceptable.
-
- For example, judicious use of sed(1) can save you from having to
- call grep(1) and pipe the output to cut(1), which saves a fork(2)
- and exec(3).
-
- Sometimes you don't even need sed(1) or other external programs at
- all, though. Use of constructs such as ${parameter#word},
- ${parameter%word} and ${parameter/pattern/string} can provide you a
- lot of power without having to leave the shell.
-
- For example, if $foo contains the path to an executable, ${foo##*/}
- will give you the basename of the program, without having to call
- basename(1). Similarly, ${foo%/*} will give you the dirname, without
- having to call dirname(1).
-
- As another example,
-
- bar=$( echo $foo | sed -e 's/bar/baz/g' )
-
- can be replaced by:
-
- bar=${foo//bar/baz}
-
- These forms of parameter substitutions can also be used on arrays,
- which makes them very powerful (if a little slow).
-
-- Prefer "compgen -W '...' -- $cur" over embedding $cur in external
- command arguments (often e.g. sed, grep etc) unless there's a good
- reason to embed it. Embedding user input in command lines can
- result in syntax errors and other undesired behavior, or messy
- quoting requirements when the input contains unusual characters.
- Good reasons for embedding include functionality (if the thing
- does not sanely work otherwise) or performance (if it makes a big
- difference in speed), but all embedding cases should be documented
- with rationale in comments in the code.
-
-- When completing available options, offer only the most descriptive
- ones as completion results if there are multiple options that do the
- same thing. Usually this means that long options should be preferred
- over the corresponding short ones. This way the user is more likely
- to find what she's looking for and there's not too much noise to
- choose from, and there are less situations where user choice would be
- needed in the first place. Note that this concerns only display of
- available completions; argument processing/completion for options that
- take an argument should be made to work with all known variants for
- the functionality at hand. For example if -s, -S, and --something do
- the same thing and require an argument, offer only --something as a
- completion when completing option names starting with a dash, but do
- implement required argument processing for all -s, -S, and --something.
- Note that GNU versions of various standard commands tend to have long
- options while other userland implementations of the same commands may
- not have them, and it would be good to have the completions work for
- as many userlands as possible so things aren't always that simple.
-
-- Do not write to the file-system under any circumstances. This can
- create race conditions, is inefficient, violates the principle of
- least surprise and lacks robustness.
-
-- Send small, incremental diffs that do one thing. Don't cram unrelated
- changes into a single diff.
-
-- Generate patches preferably against the git repository, with "git
- format-patch origin/master" (assuming the diff was against the
- origin/master branch), and send them preferably with "git
- send-email". If you don't have git available or can't access the
- repository for some reason, generate patches as unified diffs
- ('diff -u').
-
-- If your code was written for a particular platform, try to make it
- portable to other platforms, so that everyone may enjoy it. If your
- code works only with the version of a binary on a particular
- platform, ensure that it will not be loaded on other platforms that
- have a command with the same name.
-
- In particular, do not use GNU extensions to commands like sed and
- awk if you can write your code another way. If you really, REALLY must
- use them, do so if there's no other sane way to do what you're doing.
- The "Shell and Utilities" volume of the POSIX specification is a good
- starting reference for portable use of various utilities, see
- http://www.opengroup.org/onlinepubs/9699919799/
-
-- Read the existing source code for examples of how to solve
- particular problems. Read the bash man page for details of all the
- programming tools available to you within the shell.
-
-- Please test your code thoroughly before sending it to us. We don't
- have access to all the commands for which we are sent completion
- functions, so we are unable to test them all personally. If your code
- is accepted into the distribution, a lot of people will try it out,
- so try to do a thorough job of eradicating all the bugs before you
- send it to us.
-
-- File bugs, enhancement requests (preferably with patches attached) at
- the project tracker at https://alioth.debian.org/projects/bash-completion/
- Sending them to the developers list usually works too, but bits are more
- likely to fall through the cracks that way compared to the tracker.
-
-- Use printf(1) instead of echo(1) for portability reasons, and be sure to
- invoke commands that are often found aliased (such as ls or grep etc)
- using the "command" (or "builtin") command as appropriate.
-
---
-bash-completion developers
-bash-completion-devel@lists.alioth.debian.org