Add an automatic check for required option argument
Get rid of manually listing unhandled long options: Instead of listing options requiring an argument one by one in the case statement in _hledger_compreply_optarg(), the option completion lists are searched and if the option does require an argument an empty COMPREPLY is send. Short options are uncounted for and still need a manual entry. This necessitated setting $subcommandOptions beforehand, so it is moved back where it was -- in the sub-command loop in main().
This commit is contained in:
		
							parent
							
								
									3eccfb85e0
								
							
						
					
					
						commit
						d82e13bb51
					
				| @ -23,6 +23,7 @@ _hledger_completion_function() { | ||||
|     esac | ||||
| 
 | ||||
|     local subcommand | ||||
|     local subcommandOptions | ||||
|     local i | ||||
|     for ((i=1; i<${#words[@]}; i++)); do | ||||
|         subcommand=${words[i]} | ||||
| @ -40,6 +41,16 @@ _hledger_completion_function() { | ||||
|             )" | ||||
|             return 0 | ||||
|         fi | ||||
|         if [[ $cur == -* ]]; then | ||||
|             # Replace dashes with underscores and use indirect expansion | ||||
|             subcommandOptions=_hledger_complist_options_${subcommand//-/_} | ||||
|             _hledger_compreply "$(_hledger_compgen "${!subcommandOptions}")" | ||||
| 
 | ||||
|             # Suspend space on completion of long options requiring an argument | ||||
|             [[ ${COMPREPLY[0]} == --*= ]] && compopt -o nospace | ||||
| 
 | ||||
|             return 0 | ||||
|         fi | ||||
|         break | ||||
|     done | ||||
| 
 | ||||
| @ -62,18 +73,6 @@ _hledger_completion_function() { | ||||
|         return 0 | ||||
|     fi | ||||
| 
 | ||||
|     if [[ $cur == -* ]]; then | ||||
|         local subcommandOptions | ||||
|         # Replace dashes with underscores and use indirect expansion | ||||
|         subcommandOptions=_hledger_complist_options_${subcommand//-/_} | ||||
|         _hledger_compreply "$(_hledger_compgen "${!subcommandOptions}")" | ||||
| 
 | ||||
|         # Suspend space on completion of long options requiring an argument | ||||
|         [[ ${COMPREPLY[0]} == --*= ]] && compopt -o nospace | ||||
| 
 | ||||
|         return 0 | ||||
|     fi | ||||
| 
 | ||||
|     # Set this from here on because queries tend to have lots of special chars | ||||
|     # TODO: better handling of special characters | ||||
|     compopt -o filenames | ||||
| @ -208,7 +207,7 @@ _hledger_compgen() { | ||||
| # Try required option argument completion. Set COMPREPLY and return 0 on | ||||
| # success, 1 if option doesn't require an argument or out of context | ||||
| _hledger_compreply_optarg() { | ||||
|     local optionIndex=$((cword - 1)) | ||||
|     local option=${words[cword - 1]} | ||||
|     local match=$cur | ||||
|     local wordlist | ||||
| 
 | ||||
| @ -217,12 +216,12 @@ _hledger_compreply_optarg() { | ||||
|         match="" | ||||
|     # Once input is present, cword is incremented so we compensate | ||||
|     elif [[ $prev == = ]]; then | ||||
|         optionIndex=$((cword - 2)) | ||||
|         option=${words[cword - 2]} | ||||
|     fi | ||||
| 
 | ||||
|     [[ ${words[optionIndex]} == -* ]] || return | ||||
|     [[ $option == -* ]] || return | ||||
| 
 | ||||
|     case ${words[optionIndex]} in | ||||
|     case $option in | ||||
|         --alias) | ||||
|             compopt -o nospace -o filenames | ||||
|             _hledger_compreply "$( | ||||
| @ -270,10 +269,26 @@ _hledger_compreply_optarg() { | ||||
|             _hledger_compreply "$(compgen -W "$wordlist" -- "$match")" | ||||
|             ;; | ||||
|         # Argument required, but no handler (yet) | ||||
|         -b|--begin|-e|--end|-p|--period|--depth|--drop) | ||||
|         -b|-e|-p) | ||||
|             _hledger_compreply "" | ||||
|             ;; | ||||
|         # Check if an unhandled long option requires an argument | ||||
|         *) | ||||
|             local optionList argRequired | ||||
| 
 | ||||
|             if [[ -n $subcommandOptions ]]; then | ||||
|                 optionList=${!subcommandOptions} | ||||
|             else | ||||
|                 optionList=$_hledger_complist_generic_options | ||||
|             fi | ||||
| 
 | ||||
|             while IFS= read -r argRequired; do | ||||
|                 if [[ $argRequired == "$option=" ]]; then | ||||
|                     _hledger_compreply "" | ||||
|                     return 0 | ||||
|                 fi | ||||
|             done <<< "$optionList" | ||||
| 
 | ||||
|             return 1 | ||||
|             ;; | ||||
|     esac | ||||
|  | ||||
| @ -23,6 +23,7 @@ _hledger_completion_function() { | ||||
|     esac | ||||
| 
 | ||||
|     local subcommand | ||||
|     local subcommandOptions | ||||
|     local i | ||||
|     for ((i=1; i<${#words[@]}; i++)); do | ||||
|         subcommand=${words[i]} | ||||
| @ -40,6 +41,16 @@ _hledger_completion_function() { | ||||
|             )" | ||||
|             return 0 | ||||
|         fi | ||||
|         if [[ $cur == -* ]]; then | ||||
|             # Replace dashes with underscores and use indirect expansion | ||||
|             subcommandOptions=_hledger_complist_options_${subcommand//-/_} | ||||
|             _hledger_compreply "$(_hledger_compgen "${!subcommandOptions}")" | ||||
| 
 | ||||
|             # Suspend space on completion of long options requiring an argument | ||||
|             [[ ${COMPREPLY[0]} == --*= ]] && compopt -o nospace | ||||
| 
 | ||||
|             return 0 | ||||
|         fi | ||||
|         break | ||||
|     done | ||||
| 
 | ||||
| @ -62,18 +73,6 @@ _hledger_completion_function() { | ||||
|         return 0 | ||||
|     fi | ||||
| 
 | ||||
|     if [[ $cur == -* ]]; then | ||||
|         local subcommandOptions | ||||
|         # Replace dashes with underscores and use indirect expansion | ||||
|         subcommandOptions=_hledger_complist_options_${subcommand//-/_} | ||||
|         _hledger_compreply "$(_hledger_compgen "${!subcommandOptions}")" | ||||
| 
 | ||||
|         # Suspend space on completion of long options requiring an argument | ||||
|         [[ ${COMPREPLY[0]} == --*= ]] && compopt -o nospace | ||||
| 
 | ||||
|         return 0 | ||||
|     fi | ||||
| 
 | ||||
|     # Set this from here on because queries tend to have lots of special chars | ||||
|     # TODO: better handling of special characters | ||||
|     compopt -o filenames | ||||
| @ -208,7 +207,7 @@ _hledger_compgen() { | ||||
| # Try required option argument completion. Set COMPREPLY and return 0 on | ||||
| # success, 1 if option doesn't require an argument or out of context | ||||
| _hledger_compreply_optarg() { | ||||
|     local optionIndex=$((cword - 1)) | ||||
|     local option=${words[cword - 1]} | ||||
|     local match=$cur | ||||
|     local wordlist | ||||
| 
 | ||||
| @ -217,12 +216,12 @@ _hledger_compreply_optarg() { | ||||
|         match="" | ||||
|     # Once input is present, cword is incremented so we compensate | ||||
|     elif [[ $prev == = ]]; then | ||||
|         optionIndex=$((cword - 2)) | ||||
|         option=${words[cword - 2]} | ||||
|     fi | ||||
| 
 | ||||
|     [[ ${words[optionIndex]} == -* ]] || return | ||||
|     [[ $option == -* ]] || return | ||||
| 
 | ||||
|     case ${words[optionIndex]} in | ||||
|     case $option in | ||||
|         --alias) | ||||
|             compopt -o nospace -o filenames | ||||
|             _hledger_compreply "$( | ||||
| @ -270,10 +269,26 @@ _hledger_compreply_optarg() { | ||||
|             _hledger_compreply "$(compgen -W "$wordlist" -- "$match")" | ||||
|             ;; | ||||
|         # Argument required, but no handler (yet) | ||||
|         -b|--begin|-e|--end|-p|--period|--depth|--drop) | ||||
|         -b|-e|-p) | ||||
|             _hledger_compreply "" | ||||
|             ;; | ||||
|         # Check if an unhandled long option requires an argument | ||||
|         *) | ||||
|             local optionList argRequired | ||||
| 
 | ||||
|             if [[ -n $subcommandOptions ]]; then | ||||
|                 optionList=${!subcommandOptions} | ||||
|             else | ||||
|                 optionList=$_hledger_complist_generic_options | ||||
|             fi | ||||
| 
 | ||||
|             while IFS= read -r argRequired; do | ||||
|                 if [[ $argRequired == "$option=" ]]; then | ||||
|                     _hledger_compreply "" | ||||
|                     return 0 | ||||
|                 fi | ||||
|             done <<< "$optionList" | ||||
| 
 | ||||
|             return 1 | ||||
|             ;; | ||||
|     esac | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user