Re: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash

2012-11-14 Thread Felipe Contreras
On Wed, Nov 14, 2012 at 1:11 AM, SZEDER Gábor sze...@ira.uka.de wrote:
 On Tue, Nov 13, 2012 at 07:31:45PM +0100, Felipe Contreras wrote:
 On Mon, Nov 12, 2012 at 9:07 PM, Marc Khouzam marc.khou...@gmail.com wrote:
  +   # 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.

 That wouldn't work.  __git_main() doesn't set up the
 command-line-specific variables, but the wrapper around it does.

Yeah, but you can set those command-line-specific variables manually,
like the zsh completion wrapper does.

The problem with the _git wrapper is that it will call the
bash-specific complete command.

  +# 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?

 The goal is to re-use a Bash script to do completion in tcsh.  They
 are two different breeds, tcsh doesn't grok bash.  So sourcing the
 completion script is not an option, but we can still run it via Bash
 and use it's results.

I see, but the tcsh script can do something like this:

bash \EOF
echo $BASH
\EOF

Cheers.

-- 
Felipe Contreras
--
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


Re: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash

2012-11-13 Thread Felipe Contreras
On Mon, Nov 12, 2012 at 9:07 PM, Marc Khouzam marc.khou...@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

 ---
  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.

 diff --git a/contrib/completion/git-completion.tcsh
 b/contrib/completion/git-completion.tcsh
 new file mode 100755
 index 000..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.khou...@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`/'


Re: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash

2012-11-13 Thread SZEDER Gábor
On Tue, Nov 13, 2012 at 07:31:45PM +0100, Felipe Contreras wrote:
 On Mon, Nov 12, 2012 at 9:07 PM, Marc Khouzam marc.khou...@gmail.com wrote:
  +   # 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.

That wouldn't work.  __git_main() doesn't set up the
command-line-specific variables, but the wrapper around it does.


  +# 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?

The goal is to re-use a Bash script to do completion in tcsh.  They
are two different breeds, tcsh doesn't grok bash.  So sourcing the
completion script is not an option, but we can still run it via Bash
and use it's results.

--
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


Re: [PATCH] Add tcsh-completion support to contrib by using git-completion.bash

2012-11-13 Thread Marc Khouzam
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.contre...@gmail.com wrote:
 On Mon, Nov 12, 2012 at 9:07 PM, Marc Khouzam marc.khou...@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 000..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.khou...@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