On Thu, Nov 15, 2012 at 8:41 PM, Felipe Contreras
<felipe.contre...@gmail.com> wrote:
> On Thu, Nov 15, 2012 at 12:51 PM, Marc Khouzam <marc.khou...@gmail.com> wrote:
>> The current tcsh-completion support for Git, as can be found on the
>> Internet, takes the approach of defining the possible completions
>> explicitly.  This has the obvious draw-back to require constant
>> updating as the Git code base evolves.
>> The approach taken by this commit is to to re-use the advanced bash
>> completion script and use its result for tcsh completion.  This is
>> achieved by executing (versus sourcing) the bash script and
>> outputting the completion result for tcsh consumption.
>> Three solutions were looked at to implement this approach with (A)
>> being retained:
>>   A) Modifications:
>>           git-completion.bash and new git-completion.tcsh
> As I said, I don't think this is needed. It can be done in a single
> stand-alone script without modifications to git-completion.bash.
> This works:

Thank you for taking the time to try things out.

What you suggest below is an improvement on solution (C).
I had chosen (A) instead because (C) creates a third script
which gets generated each time a new shell is started.
It should be safe, but it felt a little wrong.
But I have to admit I was on the fence between the two

If you guys don't think it is bad to generate a third script
(that the user may notice in his ${HOME}),
I'll post a new patch (and try once more to get gmail not to
replace the tabs with spaces), using your improved
solution (C).

> set called = ($_)

I fought with this a lot before posting to the list.
It seems that $_ is not set when a double sourcing
happens.  Testing the solution as an actual user
showed me that when I start a new shell it
sources ~/.tcshrc, which then sources ~/.git-completion.tcsh
and then $_ is empty for some reason.

I couldn't find another way to figure out where the script
is located, which is why I had to force the user to use
${HOME} for everything.

> set script = "${called[2]}.tmp"
> cat <<\EOF > $script
> source "$HOME/.git-completion.sh"

This is nice.  Shame on me not to have thought about it.
In my version I actually 'cat' the entire bash script into $script
instead of simply sourcing it.

> # Set COMP_WORDS in a way that can be handled by the bash script.
> # Set COMP_CWORD to the cursor location as bash would.
> if [ -n "${2-}" ]; then
>         COMP_CWORD=$2
> else

Since this code will be part of a tcsh-only script, I don't think
we need to prepare for a possible $2.  tcsh won't provide it.
So, I'll remove that logic, which will simplify things slightly.

>         # Assume the cursor is at the end of parameter #1.
>         # We must check for a space as the last character which will
>         # tell us that the previous word is complete and the cursor
>         # is on the next word.
>         if [ "${1: -1}" == " " ]; then
>                 # The last character is a space, so our location is at the end
>                 # of the command-line array
>                 COMP_CWORD=${#COMP_WORDS[@]}
>         else
>                 # The last character is not a space, so our location is on the
>                 # last word of the command-line array, so we must decrement 
> the
>                 # count by 1
>                 COMP_CWORD=$((${#COMP_WORDS[@]}-1))
>         fi
> fi
> # Call _git() or _gitk() of the bash script, based on the first
> # element of the command-line
> _${COMP_WORDS[0]}
> IFS=$'\n'
> echo "${COMPREPLY[*]}"
> \EOF
> complete git  'p/*/`bash ${script} "${COMMAND_LINE}" | sort | uniq`/'
> complete gitk 'p/*/`bash ${script} "${COMMAND_LINE}" | sort | uniq`/'

I am worried about 'sort' and 'uniq' being aliased by the user, so I was
thinking of using '\sort | \uniq'

I'll work on the new version of the solution.

Thanks again

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to