There is something confuse me when I implement a bash auto-completion function which I'll put it in /etc/bash_completion.d/
In order to achieve some feature, I want to remove the word break characters colon (:
) from variable $COMP_WORDBREAKS
and add a slash (/
) at begin of $COMP_WORDBREAKS
.
COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
local cur=${COMP_WORDS[COMP_CWORD]}
compopt -o nospace
# my implement here
COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool
However, I can't reset COMP_WORDBREAKS
directly because the value is shared with other completion scripts. By the time the completion function gets called, variable COMP_WORDS
array has already been populated, so locally changes COMP_WORDBREAKS
have no effect.
Is there any solution for changing COMP_WORDBREAKS
in one completion script and no effect to other script?
$ echo $BASH_VERSION
4.2.10(1)-release
Modifying
$COMP_WORDBREAKS
in your completion script is not the recommended way (as it is a global variable and it could affect the behavior of other completion scripts - for example ssh).However, bash completion offers some helper methods which you can use to achieve your goal.
The recommended way to handle non-word-breaking characters in completion words is by using the two helper methods:
_get_comp_words_by_ref
with the-n EXCLUDE
option__ltrim_colon_completions
(a workaround for http://tiswww.case.edu/php/chet/bash/FAQ - E13)
So, here is a basic example of how to a handle a colon (:) in completion words:
As a final tip, the helper methods are located in
/etc/bash_completion
. Take a look inside to read a detailed description of each method and to discover more helper methods.