git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Marc Khouzam <marc.khouzam@gmail.com>
To: Felipe Contreras <felipe.contreras@gmail.com>
Cc: git@vger.kernel.org, "SZEDER Gábor" <szeder@ira.uka.de>
Subject: Re: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash
Date: Tue, 13 Nov 2012 22:36:24 -0500	[thread overview]
Message-ID: <CAFj1UpEB5TqQKmEDoPY-nH5d+Ki_0R70Jd=WXtkxEj-emHEfaA@mail.gmail.com> (raw)
In-Reply-To: <CAMP44s3imos4DksroRkZ3K6una5H916gvtqttJQna8yGG8XhsQ@mail.gmail.com>

Thanks for the review.  I wasn't aware that you were doing
a similar effort for zsh.

On Tue, Nov 13, 2012 at 1:31 PM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> On Mon, Nov 12, 2012 at 9:07 PM, Marc Khouzam <marc.khouzam@gmail.com> wrote:
>
>> this patch allows tcsh-users to get the benefits of the awesome
>> git-completion.bash script.  It could also help other shells do the same.
>
> Maybe you can try to take a look at the same for zsh:
> http://article.gmane.org/gmane.comp.version-control.git/208173

Cool.  The major difference is that (as Gábor mentioned) zsh understands bash
syntax but tcsh does not.  tcsh doesn't even allow to define
functions.  So we have
to take a different approach to get the bash completion script to be
used by tcsh.

>> ---
>>  contrib/completion/git-completion.bash |   53 +++++++++++++++++++++++++++++++-
>>  contrib/completion/git-completion.tcsh |   34 ++++++++++++++++++++
>>  2 files changed, 86 insertions(+), 1 deletions(-)
>>  create mode 100755 contrib/completion/git-completion.tcsh
>>
>> diff --git a/contrib/completion/git-completion.bash
>> b/contrib/completion/git-completion.bash
>> index be800e0..6d4b57a 100644
>> --- a/contrib/completion/git-completion.bash
>> +++ b/contrib/completion/git-completion.bash
>> @@ -1,4 +1,6 @@
>> -#!bash
>> +#!/bin/bash
>> +# The above line is important as this script can be executed when used
>> +# with another shell such as tcsh
>>  #
>>  # bash/zsh completion support for core Git.
>>  #
>> @@ -2481,3 +2483,52 @@ __git_complete gitk __gitk_main
>>  if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
>>  __git_complete git.exe __git_main
>>  fi
>> +
>> +# Method that will output the result of the completion done by
>> +# the bash completion script, so that it can be re-used in another
>> +# context than the bash complete command.
>> +# It accepts 1 to 2 arguments:
>> +# 1: The command-line to complete
>> +# 2: The index of the word within argument #1 in which the cursor is
>> +#    located (optional). If parameter 2 is not provided, it will be
>> +#    determined as best possible using parameter 1.
>> +_git_complete_with_output ()
>> +{
>> +       # Set COMP_WORDS to the command-line as bash would.
>> +       COMP_WORDS=($1)
>> +
>> +       # Set COMP_CWORD to the cursor location as bash would.
>> +       if [ -n "$2" ]; then
>> +               COMP_CWORD=$2
>> +       else
>> +               # 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]}
>
> You might want to use __${COMP_WORDS[0]}_main instead.
>
>> +
>> +       # Print the result that is stored in the bash variable ${COMPREPLY}
>> +       for i in ${COMPREPLY[@]}; do
>> +               echo "$i"
>> +       done
>> +}
>> +
>> +if [ -n "$1" ] ; then
>> +  # If there is an argument, we know the script is being executed
>> +  # so go ahead and run the _git_complete_with_output function
>> +  _git_complete_with_output "$1" "$2"
>> +fi
>
> Why do you need this function in this file? You can very easily add
> this function to git-completion.tcsh.

tcsh does not allow to define functions, so it is not aware of any
of the git-completion.bash functions.  So, git-completion.tcsh
cannot call anything from git-completion.bash.

>> diff --git a/contrib/completion/git-completion.tcsh
>> b/contrib/completion/git-completion.tcsh
>> new file mode 100755
>> index 0000000..7b7baea
>> --- /dev/null
>> +++ b/contrib/completion/git-completion.tcsh
>> @@ -0,0 +1,34 @@
>> +#!tcsh
>> +#
>> +# tcsh completion support for core Git.
>> +#
>> +# Copyright (C) 2012 Marc Khouzam <marc.khouzam@gmail.com>
>> +# Distributed under the GNU General Public License, version 2.0.
>> +#
>> +# This script makes use of the git-completion.bash script to
>> +# determine the proper completion for git commands under tcsh.
>> +#
>> +# To use this completion script:
>> +#
>> +#    1) Copy both this file and the bash completion script to your
>> ${HOME} directory
>> +#       using the names ${HOME}/.git-completion.tcsh and
>> ${HOME}/.git-completion.bash.
>> +#    2) Add the following line to your .tcshrc/.cshrc:
>> +#        source ${HOME}/.git-completion.tcsh
>> +
>> +# One can change the below line to use a different location
>> +set __git_tcsh_completion_script = ${HOME}/.git-completion.bash
>> +
>> +# Check that the user put the script in the right place
>> +if ( ! -e ${__git_tcsh_completion_script} ) then
>> +       echo "ERROR in git-completion.tcsh script.  Cannot find:
>> ${__git_tcsh_completion_script}.  Git completion will not work."
>> +       exit
>> +endif
>> +
>> +# Make the script executable if it is not
>> +if ( ! -x ${__git_tcsh_completion_script} ) then
>> +       chmod u+x ${__git_tcsh_completion_script}
>> +endif
>
> Why not just source it?
>
>> +complete git  'p/*/`${__git_tcsh_completion_script} "${COMMAND_LINE}"
>> | sort | uniq`/'
>> +complete gitk 'p/*/`${__git_tcsh_completion_script} "${COMMAND_LINE}"
>> | sort | uniq`/'
>
> This seems to be very different from bash's 'complete'. I wonder if
> the 'complete' commands in the original script cause any problems.
> Maybe only if you source it, but then again, I would expect a warning
> or something when you run it.

If you source the script under tcsh it will fail miserably because the bash
syntax is very different.  But when you run it, it runs under the bash shell
so everything will work fine.  The 'complete' command in the bash script
will run, but will only affect the temporary bash shell that was started
to run the script.  Useless but harmless.

> But you can use the trick I did with zsh so you can source it:
>
> complete ()
> {
>         # do nothing
>         return 0
> }
>
> . "$script"

This is pretty cool.  Function overriding in shell scripts!  tcsh doesn't
even have functions, so that trick is out of its league :)

Thanks

Marc

  parent reply	other threads:[~2012-11-14  3:36 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CAFj1UpE6OtJEojaED1_DZJD0kU=nVsFE_w8xa0oJE-6auCU2rw@mail.gmail.com>
2012-11-12 20:07 ` Fwd: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash Marc Khouzam
2012-11-13 11:14   ` SZEDER Gábor
2012-11-13 20:12     ` Marc Khouzam
2012-11-13 23:46       ` SZEDER Gábor
2012-11-14  0:49         ` [PATCH] completion: remove 'help' duplicate from porcelain commands SZEDER Gábor
2012-11-14  4:26         ` Fwd: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash Marc Khouzam
2012-11-15 11:51           ` [PATCH] tcsh-completion re-using git-completion.bash Marc Khouzam
2012-11-16  1:41             ` Felipe Contreras
2012-11-16 14:39               ` Marc Khouzam
2012-11-16 15:33                 ` Felipe Contreras
2012-11-16 15:48                   ` Marc Khouzam
2012-11-16 16:12                     ` [PATCH v3] " Marc Khouzam
2012-11-16 17:21                       ` Felipe Contreras
2012-11-16 18:43                         ` [PATCH v4] " Marc Khouzam
2012-11-16 19:59                           ` Junio C Hamano
2012-11-16 20:01                             ` Felipe Contreras
2012-11-16 17:18                     ` [PATCH] " Felipe Contreras
2012-11-16 18:20                       ` Marc Khouzam
2012-11-16 20:04                         ` Felipe Contreras
2012-11-16 20:40                           ` SZEDER Gábor
2012-11-16 21:03                             ` Felipe Contreras
2012-11-16 21:22                               ` SZEDER Gábor
2012-11-16 21:46                                 ` Felipe Contreras
2012-11-17 10:56                                   ` SZEDER Gábor
2012-11-17 11:46                                     ` Felipe Contreras
2012-11-17 14:17                                       ` SZEDER Gábor
2012-11-16 21:20                             ` Junio C Hamano
2012-11-16 21:56                               ` Felipe Contreras
2012-11-17 17:15                                 ` Marc Khouzam
2012-11-17 18:01                                   ` Felipe Contreras
2012-11-20 14:58                                     ` Marc Khouzam
2012-11-20 15:15                                       ` Felipe Contreras
2012-11-20 18:20                                         ` Marc Khouzam
2012-11-20 21:07                                           ` Junio C Hamano
2012-11-13 18:31   ` [PATCH] Add tcsh-completion support to contrib by using git-completion.bash Felipe Contreras
2012-11-14  0:11     ` SZEDER Gábor
2012-11-15  2:40       ` Felipe Contreras
2012-11-14  3:36     ` Marc Khouzam [this message]
2012-11-14  0:09   ` Fwd: " SZEDER Gábor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFj1UpEB5TqQKmEDoPY-nH5d+Ki_0R70Jd=WXtkxEj-emHEfaA@mail.gmail.com' \
    --to=marc.khouzam@gmail.com \
    --cc=felipe.contreras@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=szeder@ira.uka.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).