diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index 442f6ce5..6ac87a90 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -78,6 +78,7 @@ - prompt: fix hanging by a zero-width `prompt_ruler` `#D1673` 9033f29 - edit: support `bleopt canvas_winch_action` (requested by Johann-Goncalves-Pereira, guptapriyanshu7) `#D1679` 2243e91 - blerc: fix the name of the option `bleopt canvas_winch_action` (reported by Knusper) 0000000 +- menu (menu-style:desc): improve descriptions (motivated by Shahabaz-Bagwan) `#D1685` 0000000 ## Changes diff --git a/lib/core-complete.sh b/lib/core-complete.sh index 1caac177..67894733 100644 --- a/lib/core-complete.sh +++ b/lib/core-complete.sh @@ -374,6 +374,10 @@ function ble/complete/menu-style:desc/construct-page { local desc_x=$((cand_width+1)); ((desc_x>cols&&(desc_x=cols))) local desc_prefix=; ((cols-desc_x>30)) && desc_prefix='| ' + local desc_sgr0=$'\e[m' + ble/color/face2sgr-ansi syntax_quoted; local desc_sgrq=$ret + ble/color/face2sgr-ansi syntax_delimiter; local desc_sgrt=$ret + end=$begin x=0 y=0 esc= local entry w s pack esc1 x0 y0 pad index=$begin for entry in "${measure[@]}"; do @@ -395,7 +399,7 @@ function ble/complete/menu-style:desc/construct-page { ((x+=pad+${#desc_prefix})) # 説明表示 - local desc='(no description)' + local desc=$desc_sgrt'(no description)'$desc_sgr0 ble/function#try "$menu_class"/get-desc "$pack" if [[ $opt_raw ]]; then y=0 g=0 lc=0 lg=0 LINES=1 COLUMNS=$cols ble/canvas/trace "$desc" truncate:relative:ellipsis @@ -1255,21 +1259,47 @@ _ble_complete_action_command_desc[_ble_attr_CMD_BUILTIN]=builtin _ble_complete_action_command_desc[_ble_attr_CMD_ALIAS]=alias _ble_complete_action_command_desc[_ble_attr_CMD_FUNCTION]=function _ble_complete_action_command_desc[_ble_attr_CMD_FILE]=file -_ble_complete_action_command_desc[_ble_attr_KEYWORD]=keyword +_ble_complete_action_command_desc[_ble_attr_KEYWORD]=command _ble_complete_action_command_desc[_ble_attr_CMD_JOBS]=job -_ble_complete_action_command_desc[_ble_attr_ERR]='???' +_ble_complete_action_command_desc[_ble_attr_ERR]='command ???' _ble_complete_action_command_desc[_ble_attr_CMD_DIR]=directory function ble/complete/action:command/get-desc { + local title= value= if [[ -d $CAND ]]; then - desc=directory + title=directory else local type; ble/util/type type "$CAND" ble/syntax/highlight/cmdtype1 "$type" "$CAND" - if [[ $CAND == */ ]] && ((type==_ble_attr_ERR)); then - type=_ble_attr_CMD_FUNCTION - fi - desc=${_ble_complete_action_command_desc[type]:-'???'} + + case $type in + ($_ble_attr_CMD_ALIAS) + local ret + ble/util/expand-alias "$CAND" + title=alias value=$ret ;; + ($_ble_attr_CMD_FILE) + local path; ble/util/assign path 'type -p -- "$CAND"' + [[ $path == ?*/"$CAND" ]] && path="from ${path%/"$CAND"}" + title=file value=$path ;; + ($_ble_attr_CMD_FUNCTION) + local def; ble/function#getdef "$CAND" + local ret + ble/string#quote-word "$def" ansi:sgrq="$desc_sgrq":quote-empty + title=function value=$ret ;; + ($_ble_attr_CMD_JOBS) + ble/util/joblist.check + local job; ble/util/assign job 'jobs -- "$CAND" 2>/dev/null' || job='???' + title=job value=${job:-(ambiguous)} ;; + ($_ble_attr_ERR) + if [[ $CAND == */ ]]; then + title='function namespace' + else + title=${_ble_complete_action_command_desc[_ble_attr_ERR]} + fi ;; + (*) + title=${_ble_complete_action_command_desc[type]:-'???'} ;; + esac fi + desc=${title:+$desc_sgrt($title)$desc_sgr0}${value:+ $value} } # action:variable @@ -1293,6 +1323,29 @@ function ble/complete/action:variable/complete { function ble/complete/action:variable/init-menu-item { local ret; ble/color/face2g syntax_varname; g=$ret } +function ble/complete/action:variable/get-desc { + local _ble_local_title=variable + if ble/is-array "$CAND"; then + _ble_local_title=array + elif ble/is-assoc "$CAND"; then + _ble_local_title=assoc + fi + + local _ble_local_value= + if [[ $_ble_local_title == array || $_ble_local_title == assoc ]]; then + builtin eval "local count=\${#$CAND[@]}" + if ((count==0)); then + count=empty + else + count="$count items" + fi + _ble_local_value=$'\e[94m['$count$']\e[m' + else + local ret; ble/string#quote-word "${!CAND}" ansi:sgrq="$desc_sgrq":quote-empty + _ble_local_value=$ret + fi + desc="$desc_sgrt($_ble_local_title)$desc_sgr0 $_ble_local_value" +} #------------------------------------------------------------------------------ # source @@ -1640,6 +1693,36 @@ function ble/complete/source:command/gen { ble/complete/source/test-limit ${#ret[@]} || return 1 ((${#ret[@]})) && printf '%s\n' "${ret[@]}" fi + + # ジョブ名列挙 + if [[ ! $COMPV || $COMPV == %* ]]; then + # %コマンド名 + local q="'" Q="'\''" + local compv_quoted=${COMPV#'%'} + compv_quoted="'${compv_quoted//$q/$Q}'" + builtin compgen -j -P % -- "$compv_quoted" + + # %ジョブ番号 + local i joblist; ble/util/joblist + local job_count=${#joblist[@]} + for i in "${!joblist[@]}"; do + if [[ ${joblist[i]} =~ ^\[([0-9]+)\] ]]; then + joblist[i]=%${BASH_REMATCH[1]} + else + unset -v 'joblist[i]' + fi + done + joblist=("${joblist[@]}") + + # %% %+ %- + if ((job_count>0)); then + ble/array#push joblist %% %+ + ((job_count>=2)) && + ble/array#push joblist %- + fi + + builtin compgen -W '"${joblist[@]}"' -- "$compv_quoted" + fi } ## ble/complete/source:command arg ## @param[in] arg @@ -4479,7 +4562,7 @@ function ble/complete/menu-complete.class/get-desc { local item=$1 local "${_ble_complete_cand_varnames[@]/%/=}" # WA #D1570 checked ble/complete/cand/unpack "$item" - desc="(action: $ACTION)" + desc="$desc_sgrt(action:$ACTION)$desc_sgr0" ble/function#try ble/complete/action:"$ACTION"/get-desc } @@ -6510,7 +6593,7 @@ function ble/complete/action:sabbrev/init-menu-item { } function ble/complete/action:sabbrev/get-desc { local ret; ble/complete/sabbrev/get "$INSERT" - desc="(sabbrev expansion) $ret" + desc="$desc_sgrt(sabbrev)$desc_sgr0 $ret" } function ble/complete/source:sabbrev { local keys; ble/complete/sabbrev/get-keys diff --git a/note.txt b/note.txt index cde4301c..e038a3fc 100644 --- a/note.txt +++ b/note.txt @@ -1928,34 +1928,6 @@ bash_tips 2021-09-06 - * 2021-08-30 complete: alias desc に alias の内容を表示するべきだろうか (motivated by Shahabaz-Bagwan) - https://www.youtube.com/watch?v=YS1vxEhd2Pc - https://github.com/akinomyoga/ble.sh/issues/132 - - * reject: 或いはその場で展開してしまう様なオプションを提供しても良いのかも - しれない。その場合には遡った書き換えが起こるので不可逆であるという事。そ - して他の候補が表示されている場合には候補が表示されなくなるなどの問題があ - る。 - - 取り敢えずその場での展開は考えない事にする。後で要望があれば実装するかも - しれない。何れにしてもユーザーがそういう設定を書けば実現できるのだから - ble.sh 側で一々設定しないという態度も考えられる。とは言いつつユーザー側で - ちゃんと実装するには色々と細かい事があるような気もする。 - - * done: そもそも job 名が補完候補に現れていない気がする。 - コマンド名の補完でジョブ名も列挙する事にした。 - - * done: 変数 (action:variable) についても説明をちゃんと生成する。変数の中身 - でも展開すれば良い気がする。 - - * done: 説明を着色する。現在は単に黒で表示しているが着色した方が分かりやす - いのではないか。或いは種別の方を着色して、展開結果などの値については黒で - 表示した方が分かりやすいかもしれない。 - - 実行可能ファイルの着色に関してはパスをシンボリックリンクかどうかで各セグ - メントを着色すると良い気もする。そう考えるとやはり値の方を着色する事も考 - えるべきの気がする。 - * menu: メニューの詳細表示を toggle できる様にするべきではないか。 表示するか表示しないか完全に固定するのは微妙な気がする。 @@ -5624,6 +5596,34 @@ bash_tips 2021-12-06 + * 2021-08-30 complete: alias desc に alias の内容を表示するべきだろうか (motivated by Shahabaz-Bagwan) [#D1685] + https://www.youtube.com/watch?v=YS1vxEhd2Pc + https://github.com/akinomyoga/ble.sh/issues/132 + + * reject: 或いはその場で展開してしまう様なオプションを提供しても良いのかも + しれない。その場合には遡った書き換えが起こるので不可逆であるという事。そ + して他の候補が表示されている場合には候補が表示されなくなるなどの問題があ + る。 + + 取り敢えずその場での展開は考えない事にする。後で要望があれば実装するかも + しれない。何れにしてもユーザーがそういう設定を書けば実現できるのだから + ble.sh 側で一々設定しないという態度も考えられる。とは言いつつユーザー側で + ちゃんと実装するには色々と細かい事があるような気もする。 + + * done: そもそも job 名が補完候補に現れていない気がする。 + コマンド名の補完でジョブ名も列挙する事にした。 + + * done: 変数 (action:variable) についても説明をちゃんと生成する。変数の中身 + でも展開すれば良い気がする。 + + * done: 説明を着色する。現在は単に黒で表示しているが着色した方が分かりやす + いのではないか。或いは種別の方を着色して、展開結果などの値については黒で + 表示した方が分かりやすいかもしれない。 + + 実行可能ファイルの着色に関してはパスをシンボリックリンクかどうかで各セグ + メントを着色すると良い気もする。そう考えるとやはり値の方を着色する事も考 + えるべきの気がする。 + * 2021-09-06 trace: ellipsis の位置が relative の時にずれる [#D1684] menu_style=desc で説明が表示しきれない時に発生する問題。但し既存の処理にず diff --git a/src/color.sh b/src/color.sh index e3305795..0ecf10de 100644 --- a/src/color.sh +++ b/src/color.sh @@ -988,6 +988,8 @@ function ble/color/face2sgr { ble/color/initialize-faces && ble/color/face2sgr function ble/color/iface2g { ble/color/initialize-faces && ble/color/iface2g "$@"; } function ble/color/iface2sgr { ble/color/initialize-faces && ble/color/iface2sgr "$@"; } +function ble/color/face2sgr-ansi { ble/color/initialize-faces && ble/color/face2sgr "$@"; } + # 遅延初期化子 _ble_color_faces_initialized= function ble/color/initialize-faces { @@ -1001,9 +1003,8 @@ function ble/color/initialize-faces { } ## @fn ble/color/face2sgr face ## @var[out] ret - function ble/color/face2sgr { - ble/color/g2sgr $((_ble_faces[_ble_faces__$1])) - } + function ble/color/face2sgr { ble/color/g2sgr $((_ble_faces[_ble_faces__$1])); } + function ble/color/face2sgr-ansi { ble/color/g2sgr-ansi $((_ble_faces[_ble_faces__$1])); } ## @fn ble/color/iface2g iface ## @var[out] ret function ble/color/iface2g { diff --git a/src/util.sh b/src/util.sh index c47eedee..55453cba 100644 --- a/src/util.sh +++ b/src/util.sh @@ -1241,8 +1241,11 @@ function ble/string#quote-word { [[ :$opts: =~ $rex ]] && sgrq=${BASH_REMATCH[1]} sgr0=$_ble_term_sgr0 rex=':sgr0=(('$rex_csi'|[^:])*):' - [[ :$opts: =~ $rex ]] && + if [[ :$opts: =~ $rex ]]; then sgr0=${BASH_REMATCH[1]} + elif [[ :$opts: == *:ansi:* ]]; then + sgr0=$'\e[m' + fi fi if [[ ! $ret ]]; then