Files
dot/.local/share/blesh/contrib/syntax/edit.named-command.bash

107 lines
3.7 KiB
Bash
Raw Normal View History

2026-02-14 12:43:31 -05:00
# blesh/contrib/syntax/edit.named-command.bash
# (C) 2024, Koichi Murase <myoga.murase@gmail.com>
ble-import core-syntax
#------------------------------------------------------------------------------
# syntax
function ble/syntax:edit.named-command/initialize-ctx {
ctx=$_ble_ctx_EDIT_NamedCommand
}
function ble/syntax:edit.named-command/initialize-vars { return 0; }
_ble_syntax_context_proc[_ble_ctx_EDIT_NamedCommand]=ble/syntax:edit.named-command/ctx-rlfunc
function ble/syntax:edit.named-command/ctx-rlfunc {
if ble/string#match "$tail" $'^[[:blank:]]+'; then
((_ble_syntax_attr[i]=_ble_ctx_UNSPECIFIED,i+=${#BASH_REMATCH}))
return 0
elif ble/string#match "$tail" $'^[^[:blank:]]+'; then
local name=$BASH_REMATCH
# determine the color
local ret
ble/builtin/bind/rlfunc2widget/type "$name"
case $ret in
(rlfunc) _ble_syntax_attr[i]=$_ble_attr_KEYWORD ;;
(widget) _ble_syntax_attr[i]=$_ble_attr_CMD_FUNCTION ;;
(*) _ble_syntax_attr[i]=$_ble_attr_FILE_WARN ;;
esac
# register a word
ble/syntax/parse/word-push "$ctx" "$i"
((i+=${#name}))
ble/syntax/parse/word-pop
((ctx=_ble_ctx_UNSPECIFIED))
return 0
else
((ctx=_ble_ctx_UNSPECIFIED))
ble/syntax:text/ctx-unspecified
fi
}
#------------------------------------------------------------------------------
# completion
function ble/complete/action:edit.named-command/initialize { return 0; }
function ble/complete/action:edit.named-command/initialize.batch { inserts=("${cands[@]}"); }
function ble/complete/action:edit.named-command/complete { ble/complete/action/complete.addtail ' '; }
function ble/complete/action:edit.named-command/get-desc {
case $DATA in
(rlfunc) desc='(readline bindable function)' ;;
(widget) desc='(ble.sh widget)' ;;
(*) desc='(unknown)' ;;
esac
desc=$desc_sgrt$desc$desc_sgr0
}
function ble/complete/action:edit.named-command/init-menu-item {
local ret
case $DATA in
(rlfunc) ble/color/face2g command_keyword; g=$ret ;;
(widget) ble/color/face2g command_function; g=$ret ;;
(*) ble/color/face2g argument_error; g=$ret ;;
esac
}
function ble/complete/source:edit.named-command {
# ToDo: これで良いのか? 外側も書き換えないと挿入時や menu-filter で問題になるのでは
local COMPS=$COMPS COMPV=$COMPS comps_flags= comps_fixed=
ble/complete/source/reduce-compv-for-ambiguous-match
"${_ble_util_set_declare[@]//NAME/mark}" # disable=#D1570
local dict entry
if ble/builtin/bind/rlfunc2widget/load-dict; then
for entry in "${dict[@]}"; do
((cand_iloop++%bleopt_complete_polling_cycle==0)) && ble/complete/check-cancel && return 148
local rl= widget=
ble/bash/read rl widget <<< "$entry"
if [[ $rl == "$COMPS"* && $widget != - ]]; then
ble/set#add mark "$rl"
ble/complete/cand/yield edit.named-command "$rl" rlfunc
fi
done
fi
local widgets widget
ble/util/assign-array widgets 'compgen -A function -X "ble/widget/*.*" -- "ble/widget/$COMPS"'
for widget in "${widgets[@]}"; do
((cand_iloop++%bleopt_complete_polling_cycle==0)) && ble/complete/check-cancel && return 148
widget=${widget#ble/widget/}
ble/set#contains mark "$widget" ||
ble/complete/cand/yield edit.named-command "$widget" widget
done
return 0
}
_ble_syntax_completion_context_check_prefix[_ble_ctx_EDIT_NamedCommand]=edit.named-command/rlfunc
function ble/syntax/completion-context/prefix:edit.named-command/rlfunc {
local word=${text:istat:index-istat}
ble/string#match "$word" $'^[[:blank:]]*'
ble/syntax/completion-context/add edit.named-command "$((istat+${#BASH_REMATCH}))"
}
_ble_syntax_completion_context_check_here[_ble_ctx_EDIT_NamedCommand]='add edit.named-command'