* Bug: git completion: __git_ignore_line ignores complete branch @ 2015-08-02 14:44 Daniel Hahler 2015-08-02 16:20 ` Mikael Magnusson 0 siblings, 1 reply; 3+ messages in thread From: Daniel Hahler @ 2015-08-02 14:44 UTC (permalink / raw) To: Zsh Hackers' List -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 __git_ignore_line_inside_arguments seems to be responsible for an error when trying to complete an already complete branch. E.g. "git branch -D branch<tab>" results in: -- no matches found: `branch-name' -- But "git branch -D branc<tab>" will complete "branch". This is the function: (( $+functions[__git_ignore_line] )) || __git_ignore_line () { declare -a ignored ignored=() ((CURRENT > 1)) && ignored+=(${line[1,CURRENT-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) ((CURRENT < $#line)) && ignored+=(${line[CURRENT+1,-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) $* -F ignored } (( $+functions[__git_ignore_line_inside_arguments] )) || __git_ignore_line_inside_arguments () { declare -a compadd_opts zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F: __git_ignore_line $* $compadd_opts } And it is used like this in _git-branch: dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_branch_names' The problem is that it will ignore the current word, "branch", but should do so probably only if it is not being completed currently, i.e. has a space at the end?! It works when completing "branc", because then only "branc" will be ignored. $line in the context of __git_ignore_line will be the part after "git branch -D", and $CURRENT will be 3. That seems to be off?! For the case at hand, using ${line[1,CURRENT-3]//...} seems to fix it, but probably an index matching the position in $line, and then -1 should be used?! Regards, Daniel. -----BEGIN PGP SIGNATURE----- iEYEARECAAYFAlW+LMYACgkQfAK/hT/mPgBbkQCgt4Y+fZ6zxT4Gn0IY8p4iLpcM IaUAoOdcs+PuBtbLgRJukynIHCk2aw3l =GQku -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Bug: git completion: __git_ignore_line ignores complete branch 2015-08-02 14:44 Bug: git completion: __git_ignore_line ignores complete branch Daniel Hahler @ 2015-08-02 16:20 ` Mikael Magnusson 2015-08-05 19:22 ` Daniel Hahler 0 siblings, 1 reply; 3+ messages in thread From: Mikael Magnusson @ 2015-08-02 16:20 UTC (permalink / raw) To: Daniel Hahler; +Cc: Zsh Hackers' List On Sun, Aug 2, 2015 at 4:44 PM, Daniel Hahler <genml+zsh-workers@thequod.de> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > __git_ignore_line_inside_arguments seems to be responsible for an error when trying > to complete an already complete branch. > > E.g. "git branch -D branch<tab>" results in: > -- no matches found: `branch-name' -- > > But "git branch -D branc<tab>" will complete "branch". > > This is the function: > > (( $+functions[__git_ignore_line] )) || > __git_ignore_line () { > declare -a ignored > ignored=() > ((CURRENT > 1)) && > ignored+=(${line[1,CURRENT-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) > ((CURRENT < $#line)) && > ignored+=(${line[CURRENT+1,-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) > $* -F ignored > } > > (( $+functions[__git_ignore_line_inside_arguments] )) || > __git_ignore_line_inside_arguments () { > declare -a compadd_opts > > zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F: > > __git_ignore_line $* $compadd_opts > } > > And it is used like this in _git-branch: > > dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_branch_names' > > The problem is that it will ignore the current word, "branch", but should do so probably > only if it is not being completed currently, i.e. has a space at the end?! > > It works when completing "branc", because then only "branc" will be ignored. > > $line in the context of __git_ignore_line will be the part after "git branch -D", and $CURRENT will be 3. That seems to be off?! > > For the case at hand, using ${line[1,CURRENT-3]//...} seems to fix it, but probably > an index matching the position in $line, and then -1 should be used?! I haven't looked at the code but this sounds like huge confusion in the code. The ignore-line style already does this generically for anything you can complete, _git shouldn't be doing it manually in a single specific case at all. -- Mikael Magnusson ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Bug: git completion: __git_ignore_line ignores complete branch 2015-08-02 16:20 ` Mikael Magnusson @ 2015-08-05 19:22 ` Daniel Hahler 0 siblings, 0 replies; 3+ messages in thread From: Daniel Hahler @ 2015-08-05 19:22 UTC (permalink / raw) To: Mikael Magnusson; +Cc: Zsh Hackers' List -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 02.08.2015 18:20, Mikael Magnusson wrote: > On Sun, Aug 2, 2015 at 4:44 PM, Daniel Hahler wrote: >> __git_ignore_line_inside_arguments seems to be responsible for an error when trying >> to complete an already complete branch. >> >> E.g. "git branch -D branch<tab>" results in: >> -- no matches found: `branch-name' -- >> >> But "git branch -D branc<tab>" will complete "branch". >> >> This is the function: >> >> (( $+functions[__git_ignore_line] )) || >> __git_ignore_line () { >> declare -a ignored >> ignored=() >> ((CURRENT > 1)) && >> ignored+=(${line[1,CURRENT-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) >> ((CURRENT < $#line)) && >> ignored+=(${line[CURRENT+1,-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) >> $* -F ignored >> } >> >> (( $+functions[__git_ignore_line_inside_arguments] )) || >> __git_ignore_line_inside_arguments () { >> declare -a compadd_opts >> >> zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F: >> >> __git_ignore_line $* $compadd_opts >> } >> >> And it is used like this in _git-branch: >> >> dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_branch_names' >> >> The problem is that it will ignore the current word, "branch", but should do so probably >> only if it is not being completed currently, i.e. has a space at the end?! >> >> It works when completing "branc", because then only "branc" will be ignored. >> >> $line in the context of __git_ignore_line will be the part after "git branch -D", and $CURRENT will be 3. That seems to be off?! >> >> For the case at hand, using ${line[1,CURRENT-3]//...} seems to fix it, but probably >> an index matching the position in $line, and then -1 should be used?! > > I haven't looked at the code but this sounds like huge confusion in > the code. The ignore-line style already does this generically for > anything you can complete, _git shouldn't be doing it manually in a > single specific case at all. I see, but it is not used (nor recommended to be used) by default (with "true" or "other). Is it possible to use it dynamically, e.g. after "git branch -D" only? The tag in this context appears to be ":completion::complete:git-branch::", which is not specific enough (for including the "-D"), but might make sense anyway? zstyle ":completion::complete:git-branch:*" ignore-line true A drawback of using this seems to be that it would also ignore branches named "branch" then.. Additionally, it won't work when using a function ("gb"), where completion is linked to via: compdef _git gb=git-branch But this can be fixed by using this instead: compdef -e 'words=(git branch ${words[2,-1]}); ((CURRENT++)); _normal' gb It seems like the special handling in _git makes sense, but could be generalized?! Then it would have to use something else than $CURRENT, which refers to $words, while it uses $line, which appears to be something shorter / more specific?! And then the current word needs to be excluded, too. Regards, Daniel. -----BEGIN PGP SIGNATURE----- iEYEARECAAYFAlXCYnMACgkQfAK/hT/mPgBlLwCbB6aZ8Q0PeCkaA61/npf8ICXD zjUAn0dhtRs3N50HuZ8hBdu6+AuuwYOi =AFJT -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-08-05 19:22 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-08-02 14:44 Bug: git completion: __git_ignore_line ignores complete branch Daniel Hahler 2015-08-02 16:20 ` Mikael Magnusson 2015-08-05 19:22 ` Daniel Hahler
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ 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).