Fix: pass *all* accounts and rules files to hledger calls
_hledger_optarg() is used to parse the options on the command line and provide their arguments for context aware completion suggestions
This commit is contained in:
		
							parent
							
								
									d98ff3b93d
								
							
						
					
					
						commit
						dee25d4811
					
				@ -263,40 +263,49 @@ _hledger_compreply_query() {
 | 
				
			|||||||
    return 0
 | 
					    return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Get ledger file from -f --file arguments from COMP_WORDS and pass it to the
 | 
					# Parse the command line so far and fill the array $optarg with the arguments to
 | 
				
			||||||
# 'hledger' call. Note that --rules-file - if present - must also be passed!
 | 
					# given options. $optarg should be declared by the caller
 | 
				
			||||||
_hledger() {
 | 
					_hledger_optarg() {
 | 
				
			||||||
    local hledgerArgs=("$@")
 | 
					    local options=("$@")
 | 
				
			||||||
    local hledgerFile
 | 
					    local i j offset
 | 
				
			||||||
    local hledgerRulesFile
 | 
					    optarg=()
 | 
				
			||||||
    local i
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # hledger balance --file ~/ledger _
 | 
					    # hledger balance --file ~/ledger _
 | 
				
			||||||
    # 0       1       2      3        4
 | 
					    # 0       1       2      3        4
 | 
				
			||||||
    for (( i=1; i < ${#COMP_WORDS[@]} - 2; i++ )); do
 | 
					    for (( i=1; i < ${#COMP_WORDS[@]} - 2; i++ )); do
 | 
				
			||||||
        case ${COMP_WORDS[i]} in
 | 
					        offset=0
 | 
				
			||||||
            -f|--file)
 | 
					        for j in "${!options[@]}"; do
 | 
				
			||||||
 | 
					            if [[ ${COMP_WORDS[i]} == "${options[j]}" ]]; then
 | 
				
			||||||
                if [[ ${COMP_WORDS[i+1]} == '=' ]]; then
 | 
					                if [[ ${COMP_WORDS[i+1]} == '=' ]]; then
 | 
				
			||||||
                    hledgerFile=${COMP_WORDS[i+2]}
 | 
					                    offset=2
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                    hledgerFile=${COMP_WORDS[i+1]}
 | 
					                    offset=1
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
                # Pass it through compgen to unescape it
 | 
					                # Pass it through compgen to unescape it
 | 
				
			||||||
                hledgerFile=$(compgen -W "$hledgerFile")
 | 
					                optarg+=("$(compgen -W "${COMP_WORDS[i + offset]}")")
 | 
				
			||||||
                ;;
 | 
					            fi
 | 
				
			||||||
            --rules-file)
 | 
					        done
 | 
				
			||||||
                if [[ ${COMP_WORDS[i+1]} == '=' ]]; then
 | 
					        ((i += offset))
 | 
				
			||||||
                    hledgerRulesFile=${COMP_WORDS[i+2]}
 | 
					    done
 | 
				
			||||||
                else
 | 
					}
 | 
				
			||||||
                    hledgerRulesFile=${COMP_WORDS[i+1]}
 | 
					
 | 
				
			||||||
                fi
 | 
					# Get ledger file from -f --file arguments from COMP_WORDS and pass it to the
 | 
				
			||||||
                hledgerRulesFile=$(compgen -W "$hledgerRulesFile")
 | 
					# 'hledger' call. Note that --rules-file - if present - must also be passed!
 | 
				
			||||||
                ;;
 | 
					# Multiple files are allowed so pass them all in the order of appearance.
 | 
				
			||||||
        esac
 | 
					_hledger() {
 | 
				
			||||||
 | 
					    local hledgerArgs=("$@")
 | 
				
			||||||
 | 
					    local file
 | 
				
			||||||
 | 
					    local -a optarg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _hledger_optarg -f --file
 | 
				
			||||||
 | 
					    for file in "${optarg[@]}"; do
 | 
				
			||||||
 | 
					        [[ -f $file ]] && hledgerArgs+=(--file "$file")
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [[ -f $hledgerFile ]] && hledgerArgs+=(--file "$hledgerFile")
 | 
					    _hledger_optarg --rules-file
 | 
				
			||||||
    [[ -f $hledgerRulesFile ]] && hledgerArgs+=(--rules-file "$hledgerRulesFile")
 | 
					    for file in "${optarg[@]}"; do
 | 
				
			||||||
 | 
					        [[ -f $file ]] && hledgerArgs+=(--rules-file "$file")
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Discard errors. Is there a way to validate files before using them?
 | 
					    # Discard errors. Is there a way to validate files before using them?
 | 
				
			||||||
    hledger "${hledgerArgs[@]}" 2>/dev/null
 | 
					    hledger "${hledgerArgs[@]}" 2>/dev/null
 | 
				
			||||||
 | 
				
			|||||||
@ -263,40 +263,49 @@ _hledger_compreply_query() {
 | 
				
			|||||||
    return 0
 | 
					    return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Get ledger file from -f --file arguments from COMP_WORDS and pass it to the
 | 
					# Parse the command line so far and fill the array $optarg with the arguments to
 | 
				
			||||||
# 'hledger' call. Note that --rules-file - if present - must also be passed!
 | 
					# given options. $optarg should be declared by the caller
 | 
				
			||||||
_hledger() {
 | 
					_hledger_optarg() {
 | 
				
			||||||
    local hledgerArgs=("$@")
 | 
					    local options=("$@")
 | 
				
			||||||
    local hledgerFile
 | 
					    local i j offset
 | 
				
			||||||
    local hledgerRulesFile
 | 
					    optarg=()
 | 
				
			||||||
    local i
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # hledger balance --file ~/ledger _
 | 
					    # hledger balance --file ~/ledger _
 | 
				
			||||||
    # 0       1       2      3        4
 | 
					    # 0       1       2      3        4
 | 
				
			||||||
    for (( i=1; i < ${#COMP_WORDS[@]} - 2; i++ )); do
 | 
					    for (( i=1; i < ${#COMP_WORDS[@]} - 2; i++ )); do
 | 
				
			||||||
        case ${COMP_WORDS[i]} in
 | 
					        offset=0
 | 
				
			||||||
            -f|--file)
 | 
					        for j in "${!options[@]}"; do
 | 
				
			||||||
 | 
					            if [[ ${COMP_WORDS[i]} == "${options[j]}" ]]; then
 | 
				
			||||||
                if [[ ${COMP_WORDS[i+1]} == '=' ]]; then
 | 
					                if [[ ${COMP_WORDS[i+1]} == '=' ]]; then
 | 
				
			||||||
                    hledgerFile=${COMP_WORDS[i+2]}
 | 
					                    offset=2
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                    hledgerFile=${COMP_WORDS[i+1]}
 | 
					                    offset=1
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
                # Pass it through compgen to unescape it
 | 
					                # Pass it through compgen to unescape it
 | 
				
			||||||
                hledgerFile=$(compgen -W "$hledgerFile")
 | 
					                optarg+=("$(compgen -W "${COMP_WORDS[i + offset]}")")
 | 
				
			||||||
                ;;
 | 
					            fi
 | 
				
			||||||
            --rules-file)
 | 
					        done
 | 
				
			||||||
                if [[ ${COMP_WORDS[i+1]} == '=' ]]; then
 | 
					        ((i += offset))
 | 
				
			||||||
                    hledgerRulesFile=${COMP_WORDS[i+2]}
 | 
					    done
 | 
				
			||||||
                else
 | 
					}
 | 
				
			||||||
                    hledgerRulesFile=${COMP_WORDS[i+1]}
 | 
					
 | 
				
			||||||
                fi
 | 
					# Get ledger file from -f --file arguments from COMP_WORDS and pass it to the
 | 
				
			||||||
                hledgerRulesFile=$(compgen -W "$hledgerRulesFile")
 | 
					# 'hledger' call. Note that --rules-file - if present - must also be passed!
 | 
				
			||||||
                ;;
 | 
					# Multiple files are allowed so pass them all in the order of appearance.
 | 
				
			||||||
        esac
 | 
					_hledger() {
 | 
				
			||||||
 | 
					    local hledgerArgs=("$@")
 | 
				
			||||||
 | 
					    local file
 | 
				
			||||||
 | 
					    local -a optarg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _hledger_optarg -f --file
 | 
				
			||||||
 | 
					    for file in "${optarg[@]}"; do
 | 
				
			||||||
 | 
					        [[ -f $file ]] && hledgerArgs+=(--file "$file")
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [[ -f $hledgerFile ]] && hledgerArgs+=(--file "$hledgerFile")
 | 
					    _hledger_optarg --rules-file
 | 
				
			||||||
    [[ -f $hledgerRulesFile ]] && hledgerArgs+=(--rules-file "$hledgerRulesFile")
 | 
					    for file in "${optarg[@]}"; do
 | 
				
			||||||
 | 
					        [[ -f $file ]] && hledgerArgs+=(--rules-file "$file")
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Discard errors. Is there a way to validate files before using them?
 | 
					    # Discard errors. Is there a way to validate files before using them?
 | 
				
			||||||
    hledger "${hledgerArgs[@]}" 2>/dev/null
 | 
					    hledger "${hledgerArgs[@]}" 2>/dev/null
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user