Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

custom directory completion appends whitespace

I have the following directory structure:

/home/tichy/xxx/yyy/aaa
/home/tichy/xxx/yyy/aab
/home/tichy/xxx/yyy/aac

I would like to enter cdw y<TAB> and get cdw yyy/<CURSOR> as a result, so I could add cdw yyy/a<TAB> and get cdw yyy/aa<CURSOR>

The solution I came up with gives me the following:
cdw y<TAB> => cdw yyy<SPACE><CURSOR>

Following code I have so far:

_cdw () {
    local cur prev dirs
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    # no difference, a bit more logical:
    dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe 's/{^/home/tichy/xxx/}{}')
    COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    return 0
}
complete -F _cdw cdw
cdw () {
    cd /home/tichy/xxx/$@
}

Any ideas what's wrong? It seems to me that the completion process seems to be finished and isn't expecting any more input.

like image 974
tichy Avatar asked Dec 14 '11 10:12

tichy


1 Answers

The simplest solution I've found so far is to generate completions that look like this:

COMPREPLY=( $( compgen -W "file1 file2 file3 dir1/ dir2/ dir3/" ) )

and add this line just before returning

[[ $COMPREPLY == */ ]] && compopt -o nospace

This sets the nospace option whenever the completion may fill in until the slash so that the user ends up with:

cmd dir1/<cursorhere>

instead of:

cmd dir1/ <cursorhere>

and it doesn't set the nospace option whenever the completion may fill in until a full filename so that the user ends up with:

cmd file1 <cursorhere>

instead of:

cmd file1<cursorhere>
like image 101
codeshot Avatar answered Sep 27 '22 22:09

codeshot