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
|
esac
|
||||||
|
|
||||||
local subcommand
|
local subcommand
|
||||||
|
local subcommandOptions
|
||||||
local i
|
local i
|
||||||
for ((i=1; i<${#words[@]}; i++)); do
|
for ((i=1; i<${#words[@]}; i++)); do
|
||||||
subcommand=${words[i]}
|
subcommand=${words[i]}
|
||||||
@ -40,6 +41,16 @@ _hledger_completion_function() {
|
|||||||
)"
|
)"
|
||||||
return 0
|
return 0
|
||||||
fi
|
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
|
break
|
||||||
done
|
done
|
||||||
|
|
||||||
@ -62,18 +73,6 @@ _hledger_completion_function() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
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
|
# Set this from here on because queries tend to have lots of special chars
|
||||||
# TODO: better handling of special characters
|
# TODO: better handling of special characters
|
||||||
compopt -o filenames
|
compopt -o filenames
|
||||||
@ -208,7 +207,7 @@ _hledger_compgen() {
|
|||||||
# Try required option argument completion. Set COMPREPLY and return 0 on
|
# Try required option argument completion. Set COMPREPLY and return 0 on
|
||||||
# success, 1 if option doesn't require an argument or out of context
|
# success, 1 if option doesn't require an argument or out of context
|
||||||
_hledger_compreply_optarg() {
|
_hledger_compreply_optarg() {
|
||||||
local optionIndex=$((cword - 1))
|
local option=${words[cword - 1]}
|
||||||
local match=$cur
|
local match=$cur
|
||||||
local wordlist
|
local wordlist
|
||||||
|
|
||||||
@ -217,12 +216,12 @@ _hledger_compreply_optarg() {
|
|||||||
match=""
|
match=""
|
||||||
# Once input is present, cword is incremented so we compensate
|
# Once input is present, cword is incremented so we compensate
|
||||||
elif [[ $prev == = ]]; then
|
elif [[ $prev == = ]]; then
|
||||||
optionIndex=$((cword - 2))
|
option=${words[cword - 2]}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[[ ${words[optionIndex]} == -* ]] || return
|
[[ $option == -* ]] || return
|
||||||
|
|
||||||
case ${words[optionIndex]} in
|
case $option in
|
||||||
--alias)
|
--alias)
|
||||||
compopt -o nospace -o filenames
|
compopt -o nospace -o filenames
|
||||||
_hledger_compreply "$(
|
_hledger_compreply "$(
|
||||||
@ -270,10 +269,26 @@ _hledger_compreply_optarg() {
|
|||||||
_hledger_compreply "$(compgen -W "$wordlist" -- "$match")"
|
_hledger_compreply "$(compgen -W "$wordlist" -- "$match")"
|
||||||
;;
|
;;
|
||||||
# Argument required, but no handler (yet)
|
# Argument required, but no handler (yet)
|
||||||
-b|--begin|-e|--end|-p|--period|--depth|--drop)
|
-b|-e|-p)
|
||||||
_hledger_compreply ""
|
_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
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@ -23,6 +23,7 @@ _hledger_completion_function() {
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
local subcommand
|
local subcommand
|
||||||
|
local subcommandOptions
|
||||||
local i
|
local i
|
||||||
for ((i=1; i<${#words[@]}; i++)); do
|
for ((i=1; i<${#words[@]}; i++)); do
|
||||||
subcommand=${words[i]}
|
subcommand=${words[i]}
|
||||||
@ -40,6 +41,16 @@ _hledger_completion_function() {
|
|||||||
)"
|
)"
|
||||||
return 0
|
return 0
|
||||||
fi
|
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
|
break
|
||||||
done
|
done
|
||||||
|
|
||||||
@ -62,18 +73,6 @@ _hledger_completion_function() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
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
|
# Set this from here on because queries tend to have lots of special chars
|
||||||
# TODO: better handling of special characters
|
# TODO: better handling of special characters
|
||||||
compopt -o filenames
|
compopt -o filenames
|
||||||
@ -208,7 +207,7 @@ _hledger_compgen() {
|
|||||||
# Try required option argument completion. Set COMPREPLY and return 0 on
|
# Try required option argument completion. Set COMPREPLY and return 0 on
|
||||||
# success, 1 if option doesn't require an argument or out of context
|
# success, 1 if option doesn't require an argument or out of context
|
||||||
_hledger_compreply_optarg() {
|
_hledger_compreply_optarg() {
|
||||||
local optionIndex=$((cword - 1))
|
local option=${words[cword - 1]}
|
||||||
local match=$cur
|
local match=$cur
|
||||||
local wordlist
|
local wordlist
|
||||||
|
|
||||||
@ -217,12 +216,12 @@ _hledger_compreply_optarg() {
|
|||||||
match=""
|
match=""
|
||||||
# Once input is present, cword is incremented so we compensate
|
# Once input is present, cword is incremented so we compensate
|
||||||
elif [[ $prev == = ]]; then
|
elif [[ $prev == = ]]; then
|
||||||
optionIndex=$((cword - 2))
|
option=${words[cword - 2]}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[[ ${words[optionIndex]} == -* ]] || return
|
[[ $option == -* ]] || return
|
||||||
|
|
||||||
case ${words[optionIndex]} in
|
case $option in
|
||||||
--alias)
|
--alias)
|
||||||
compopt -o nospace -o filenames
|
compopt -o nospace -o filenames
|
||||||
_hledger_compreply "$(
|
_hledger_compreply "$(
|
||||||
@ -270,10 +269,26 @@ _hledger_compreply_optarg() {
|
|||||||
_hledger_compreply "$(compgen -W "$wordlist" -- "$match")"
|
_hledger_compreply "$(compgen -W "$wordlist" -- "$match")"
|
||||||
;;
|
;;
|
||||||
# Argument required, but no handler (yet)
|
# Argument required, but no handler (yet)
|
||||||
-b|--begin|-e|--end|-p|--period|--depth|--drop)
|
-b|-e|-p)
|
||||||
_hledger_compreply ""
|
_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
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user