oh-my-bash/lib/omb-completion.sh

63 lines
1.8 KiB
Bash

#! bash oh-my-bash.module
# Copyright 2023 Koichi Murase.
#
# Helper functions for completions
#
## @fn _omb_completion_reassemble_breaks exclude
## @param[in] $1 exclude Characters to exclude from COMP_WORDSBREAKS
## @var[out] cur[0] Current word after reassembly
## @var[out] cur[1] Part of ${cur[0]} that was originally in previous words
## in COMP_WORDS.
## @arr[out] COMPREPLY This functions empties the array COMPREPLY.
function _omb_completion_reassemble_breaks {
local exclude=$1
local line=$COMP_LINE point=$COMP_POINT
local breaks=${COMP_WORDBREAKS//[\"\'$exclude]}
COMPREPLY=()
cur=("${COMP_WORDS[COMP_CWORD]}" '')
local word rprefix= rword=
for word in "${COMP_WORDS[@]::COMP_CWORD+1}"; do
local space=${line%%"$word"*}
if [[ $space == "$line" ]]; then
# error: COMP_LINE does not contain enough words
return 1
fi
word=${word::point - ${#space}}
if [[ $space || $rword == *["$breaks"] || $word == ["$breaks"]* ]]; then
rprefix=
rword=$word
else
rprefix=$rword
rword+=$word
fi
line=${line:${#space}+${#word}}
((point -= ${#space} + ${#word}))
((point >= 0)) || break
done
cur=("$rword" "$rprefix")
}
## @fn _omb_completion_resolve_breaks
## Adjust completions generated for the reassembled word
## @var[out] cur[1] Prefix to remove set by _omb_completion_reassemble_breaks
## @arr[out] COMPREPLY This functions empties the array COMPREPLY.
function _omb_completion_resolve_breaks {
if [[ ${cur[1]} ]]; then
local i
for i in "${!COMPREPLY[@]}"; do
if [[ ${COMPREPLY[i]} == "$cur_prefix"* ]]; then
COMPREPLY[i]=${COMPREPLY[i]#"$cur_prefix"}
else
unset -v 'COMPREPLY[i]'
fi
done
COMPREPLY=("${COMPREPLY[@]}")
fi
}