From 8bcffc6b11131d989cf92cea52aa849790f1580f Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Wed, 20 Aug 2003 12:03:07 +0000 Subject: 18951: Better option handling (c.f. 18948) --- Completion/Unix/Command/_perforce | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'Completion/Unix/Command/_perforce') diff --git a/Completion/Unix/Command/_perforce b/Completion/Unix/Command/_perforce index cde4cf013..6803ad6da 100644 --- a/Completion/Unix/Command/_perforce +++ b/Completion/Unix/Command/_perforce @@ -251,27 +251,41 @@ _perforce() { fi fi + # Options with arguments we need to pass down when calling + # p4 from completers. There are no options without arguments + # we need to pass. (Don't pass down -L language since we + # parse based on English output.) + local argopts_pass="cCdHpPu" + # Other options which have arguments but we shouldn't pass down. + # There are some debugging options, but they tend to get used + # with the argument in the same word as the option, in which + # case they will be handled OK anyway. + local argopts_ignore="Lx" + + # If we are at or after the command word, remember the + # global arguments to p4 as we will need to pass these down + # when generating completion lists. + local -a _perforce_global_options + # We need to try and check if we are before or after the # subcommand, since some of the options with arguments, in particular -c, # work differently. It didn't work if I just added '*::...' to the # end of the arguments list, anyway. for (( i = 2; i < CURRENT; i++ )); do - if [[ $words[i] = -[cCdHLpPux] ]]; then + if [[ $words[i] = -[$argopts_pass$argopts_ignore] ]]; then # word with following argument + if [[ $words[i] = -[$argopts_pass] ]]; then + _perforce_global_options+=(${words[i,i+1]}) + fi (( i++ )) + elif [[ $words[i] = -[$argopts_pass]* ]]; then + # word including argument which we want to keep + _perforce_global_options+=(${words[i]}) elif [[ $words[i] != -* ]]; then break fi done - # If we are at or after the command word, remember the - # global arguments to p4 as we will need to pass these down - # when generating completion lists. - local -a _perforce_global_options - if (( i <= CURRENT && i > 2 )); then - _perforce_global_options=(${words[2,i-1]}) - fi - if (( i >= CURRENT )); then _arguments -s : \ '-c+[client]:client:_perforce_clients' \ @@ -280,7 +294,7 @@ _perforce() { '-H+[hostname]:host:_hosts' \ '-G[python output]' \ '-L+[message language]:language: ' \ - '-p+[server port]:port:_ports' \ + '-p+[server port]:port:_perforce_hosts_ports' \ '-P+[password on server]:password: ' \ '-s[output script tags]' \ '-u+[user]:user name:_users' \ @@ -305,6 +319,9 @@ _perforce() { _perforce_call_p4() { local cp_tag=$1 shift + # This is for our own use for parsing, and we need English output, + # so... + local +x P4LANGUAGE _call_program $cp_tag p4 "${_perforce_global_options[@]}" "$@" } -- cgit 1.4.1