Skip to content

Commit

Permalink
menu (menu-style:desc): improve descriptions
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Dec 6, 2021
1 parent b90ac78 commit 4de1b45
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 42 deletions.
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Expand Up @@ -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

Expand Down
103 changes: 93 additions & 10 deletions lib/core-complete.sh
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand Down
56 changes: 28 additions & 28 deletions note.txt
Expand Up @@ -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 できる様にするべきではないか。

表示するか表示しないか完全に固定するのは微妙な気がする。
Expand Down Expand Up @@ -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 で説明が表示しきれない時に発生する問題。但し既存の処理にず
Expand Down
7 changes: 4 additions & 3 deletions src/color.sh
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
5 changes: 4 additions & 1 deletion src/util.sh
Expand Up @@ -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
Expand Down

0 comments on commit 4de1b45

Please sign in to comment.