From: Mark Lodato <lodatom@gmail.com>
To: git@vger.kernel.org
Cc: Mark Lodato <lodatom@gmail.com>, spearce@spearce.org, avarab@gmail.com
Subject: [PATCH] completion: make compatible with zsh
Date: Fri, 13 Aug 2010 23:40:37 -0400 [thread overview]
Message-ID: <1281757237-32656-1-git-send-email-lodatom@gmail.com> (raw)
In-Reply-To: <AANLkTimknF-m4_TYt+-vBBW0e3A-DY1nY93k7mPybdaD@mail.gmail.com>
Modify git-completion.bash to work with both bash and zsh. Most code
works fine, but a few things need tweaking. Where possible, code is
written in such a way that both shells interpret fine, but some areas
need special-casing.
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh uses $var[3,-1] to trim the first two characters. There is no
way to write cross-shell code to accomplish this, so we must wrap
this in a check for zsh.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash; in particular, this turns on SH_WORDSPLIT.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
---
On Fri, Aug 13, 2010 at 11:23 PM, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
> On Sat, Aug 14, 2010 at 03:17, Mark Lodato <lodatom@gmail.com> wrote:
>> On Tue, Aug 3, 2010 at 10:57 PM, Mark Lodato <lodatom@gmail.com> wrote:
>>> Modify git-completion.bash to work with both bash and zsh. Most code
>>> works fine, but a few things need tweaking. Where possible, code is
>>> written in such a way that both shells interpret fine, but some areas
>>> need special-casing.
>>
>> Is there any interest in this patch, or anything I could do that would
>> make it more likely to be accepted? Perhaps at least some of these
>> changes could be implemented.
>
> What's the Message-ID for that patch? I can't find it in my mailbox or
> in a public archive (via Google).
Thanks for letting me know.
It appears that my initial message didn't go through. I used the --to
argument with 'git format-patch', but 'git send-email' didn't seem to
parse it properly. It stuck an empty "To:" line at the normal position,
and then put an additional "To: git@vger.kernel.org" at the bottom of
the headers. Gmail must not have liked this.
So, here's another shot. I am not too familiar with how the completion
works, so the changed parts ought to be tested on both zsh and bash.
Any suggestions on how to do so - or results from doing so - would be
greatly appreciated.
I tried to make as few changes to the main part of the script as
possible, so that zsh compatibility does not get in the way of normal
development. If anyone has any suggestions for improvement, please let
me know.
If this should be split into separate patches, I can do that. Each
change is so small, I thought it would make more sense to roll them all
into one.
contrib/completion/git-completion.bash | 53 +++++++++++++++++++++++++++++---
1 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 6756990..dde796e 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -137,12 +137,19 @@ __git_ps1_show_upstream ()
svn*)
# get the upstream from the "git-svn-id: ..." in a commit message
# (git-svn uses essentially the same procedure internally)
- local svn_upstream=($(git log --first-parent -1 \
- --grep="^git-svn-id: \(${svn_url_pattern:2}\)" 2>/dev/null))
+ local svn_upstream pattern n_stop
+ if [[ -n $ZSH_VERSION ]]; then
+ pattern="$svn_url_pattern[3,-1]"
+ else
+ pattern="${svn_url_pattern:2}"
+ fi
+ svn_upstream=($(git log --first-parent -1 \
+ --grep="^git-svn-id: \($pattern\)" 2>/dev/null))
if [[ 0 -ne ${#svn_upstream[@]} ]]; then
svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
svn_upstream=${svn_upstream%@*}
- for ((n=1; "$n" <= "${#svn_remote[@]}"; ++n)); do
+ n_stop="${#svn_remote[@]}"
+ for ((n=1; n <= n_stop; ++n)); do
svn_upstream=${svn_upstream#${svn_remote[$n]}}
done
@@ -2339,6 +2346,11 @@ _git ()
{
local i c=1 command __git_dir
+ if [[ -n $ZSH_VERSION ]]; then
+ emulate -L bash
+ setopt KSH_TYPESET
+ fi
+
while [ $c -lt $COMP_CWORD ]; do
i="${COMP_WORDS[c]}"
case "$i" in
@@ -2372,17 +2384,22 @@ _git ()
fi
local completion_func="_git_${command//-/_}"
- declare -F $completion_func >/dev/null && $completion_func && return
+ declare -f $completion_func >/dev/null && $completion_func && return
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
completion_func="_git_${expansion//-/_}"
- declare -F $completion_func >/dev/null && $completion_func
+ declare -f $completion_func >/dev/null && $completion_func
fi
}
_gitk ()
{
+ if [[ -n $ZSH_VERSION ]]; then
+ emulate -L bash
+ setopt KSH_TYPESET
+ fi
+
__git_has_doubledash && return
local cur="${COMP_WORDS[COMP_CWORD]}"
@@ -2417,3 +2434,29 @@ if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
|| complete -o default -o nospace -F _git git.exe
fi
+
+if [[ -z $ZSH_VERSION ]]; then
+ shopt () {
+ local option
+ if [ $# -ne 2 ]; then
+ echo "USAGE: $0 (-q|-s|-u) <option>" >&2
+ return 1
+ fi
+ case "$2" in
+ nullglob)
+ option="$2"
+ ;;
+ *)
+ echo "$0: invalid option: $2" >&2
+ return 1
+ esac
+ case "$1" in
+ -q) setopt | grep -q "$option" ;;
+ -u) unsetopt "$option" ;;
+ -s) setopt "$option" ;;
+ *)
+ echo "$0: invalid flag: $1" >&2
+ return 1
+ esac
+ }
+fi
--
1.7.2.1
next prev parent reply other threads:[~2010-08-14 3:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1280890654-18486-1-git-send-email-lodatom@gmail.com>
2010-08-14 3:17 ` [PATCH] completion: make compatible with zsh Mark Lodato
2010-08-14 3:23 ` Ævar Arnfjörð Bjarmason
2010-08-14 3:40 ` Mark Lodato [this message]
2010-08-14 3:52 ` Ævar Arnfjörð Bjarmason
[not found] ` <20100814212507.GD2372@burratino>
2010-08-16 1:43 ` Mark Lodato
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1281757237-32656-1-git-send-email-lodatom@gmail.com \
--to=lodatom@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=spearce@spearce.org \
/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.
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 NNTP newsgroup(s).