bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: A programmable completoin bug?


From: Clark J. Wang
Subject: Re: A programmable completoin bug?
Date: Mon, 5 Dec 2011 10:39:17 +0800

On Sat, Dec 3, 2011 at 09:32, Chet Ramey <chet.ramey@case.edu> wrote:

> On 11/30/11 2:08 AM, Clark J. Wang wrote:
> > (Tested with bash 4.2.10 and 4.1.9)
> >
> > [bash-4.2.10] # cat foo.compspec
> > compspec_foo()
> > {
> >     local cmd=$1 cur=$2 pre=$3
> >
> >     if [[ $cur = :* ]]; then
> >         COMPREPLY=( changed changed/IGNORE_ME )
> >     fi
> > }
> >
> > complete -F compspec_foo foo
> > [bash-4.2.10] # source foo.compspec
> > [bash-4.2.10] # foo :short<TAB>
> > [bash-4.2.10] # foo changed  <-- Fine, this is what I want
> > [bash-4.2.10] # foo :this-is-a-long-word<TAB>
> > [bash-4.2.10] # foo :this-i  <-- Bug here?
> >
>
> First of all, you must have removed `:' from $COMP_WORDBREAKS, because
> you won't get any matches unless you have.
>

Sorry I forgot to mention that. `:' is removed from $COMP_WORDBREAKS in my
global rc files. To be more exact:

[bash-4.2.10] # printf '%q\n' "$COMP_WORDBREAKS"
$' \t\n"\'><=;|&('
[bash-4.2.10] #


> I can't reproduce this behavior using bash-4.2.20 (after modifying
> COMP_WORDBREAKS); I get `changed' as the completion in both cases.
>

I just compiled the latest 4.2.20 and I could still reproduce it. And I
also tested in Cygwin (bash 4.1.10) and Debian 6.0 (bash 4.1.5), they all
have the same problem.


> Have you done `set -x' to get an idea of what's happening when the
> completion function runs?
>

Seems like `set -x' gives no more info:
================================

[bash-4.2.20 ~/tmp] # printf '%q\n' "$COMP_WORDBREAKS"
$' \t\n"\'><=;|&('
[bash-4.2.20 ~/tmp] # cat foo.compspec
+ cat foo.compspec
compspec_foo()
{
    local cmd=$1 cur=$2 pre=$3

    if [[ $cur = :* ]]; then
        COMPREPLY=( changed changed/IGNORE_ME )
    fi
}

complete -F compspec_foo foo
[bash-4.2.20 ~/tmp] # source foo.compspec
[bash-4.2.20 ~/tmp] # set -x
[bash-4.2.20 ~/tmp] # foo :this-is-a-long-word<Press TAB and then ENTER>
[bash-4.2.20 ~/tmp] # foo :this-is-a-long-word+ local cmd=foo
cur=:this-is-a-long-word pre=foo
+ [[ :this-is-a-long-word = :* ]]
+ COMPREPLY=(changed changed/IGNORE_ME)
+ foo :this-i
bash: foo: command not found
[bash-4.2.20 ~/tmp] #


>
> Chet
>
>
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
>                 ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, ITS, CWRU    chet@case.edu
> http://cnswww.cns.cwru.edu/~chet/
>



-- 
-Clark


reply via email to

[Prev in Thread] Current Thread [Next in Thread]