Skip to content

Commit 01182d3

Browse files
committed
keymap.vi: support ":marks"
* canvas: refactor ble/util/c2s-edit
1 parent 486314c commit 01182d3

File tree

8 files changed

+173
-83
lines changed

8 files changed

+173
-83
lines changed

docs/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
- keymap/vi: add readline-compatible widgets for `vi_imap` and `vi_nmap` (requested by excited-bore) `#D2304` d7ec488a
7878
- edit: support bash-5.2 readline bindable function `vi-edit-and-execute-command` `#D2306` c395eb33 xxxxxxxx
7979
- edit: support readline bindable function `paste-from-clipboard` in more environments `#D2307` 17646524
80+
- keymap/vi: support `:marks` `#D2320` xxxxxxxx
8081

8182
## Changes
8283

lib/core-syntax.sh

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -355,16 +355,9 @@ function ble/syntax/print-status/.graph {
355355
return 0
356356
else
357357
local ret
358-
ble/util/s2c "$char"
359-
local code=$ret
360-
if ((code<32)); then
361-
ble/util/c2s "$((code+64))"
362-
graph="$_ble_term_rev^$ret$_ble_term_sgr0"
363-
elif ((code==127)); then
364-
graph="$_ble_term_rev^?$_ble_term_sgr0"
365-
elif ((128<=code&&code<160)); then
366-
ble/util/c2s "$((code-64))"
367-
graph="${_ble_term_rev}M-^$ret$_ble_term_sgr0"
358+
ble/util/s2c "$char"; local code=$ret
359+
if ble/unicode/GraphemeCluster/ControlRepresentation "$code"; then
360+
graph=$_ble_term_rev$ret$_ble_term_sgr0
368361
else
369362
graph="'$char' ($code)"
370363
fi

lib/keymap.vi.sh

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,35 +1137,6 @@ function ble/keymap:vi/register#play {
11371137
ble/widget/.MACRO "${ret[@]}"
11381138
return 0
11391139
}
1140-
## @fn ble/keymap:vi/register#dump/escape text
1141-
## @var[out] ret
1142-
function ble/keymap:vi/register#dump/escape {
1143-
local text=$1
1144-
local out= i=0 iN=${#text}
1145-
while ((i<iN)); do
1146-
local tail=${text:i}
1147-
if ble/util/isprint+ "$tail"; then
1148-
out=$out$BASH_REMATCH
1149-
((i+=${#BASH_REMATCH}))
1150-
else
1151-
ble/util/s2c "$tail"
1152-
local code=$ret
1153-
if ((code<32)); then
1154-
ble/util/c2s "$((code+64))"
1155-
out=$out$_ble_term_rev^$ret$_ble_term_sgr0
1156-
elif ((code==127)); then
1157-
out=$out$_ble_term_rev^?$_ble_term_sgr0
1158-
elif ((128<=code&&code<160)); then
1159-
ble/util/c2s "$((code-64))"
1160-
out=$out${_ble_term_rev}M-^$ret$_ble_term_sgr0
1161-
else
1162-
out=$out${tail::1}
1163-
fi
1164-
((i++))
1165-
fi
1166-
done
1167-
ret=$out
1168-
}
11691140
function ble/keymap:vi/register#dump {
11701141
local k ret out=
11711142
local value type content
@@ -1184,19 +1155,13 @@ function ble/keymap:vi/register#dump {
11841155
(B:*) type=block ;;
11851156
(*) type=char ;;
11861157
esac
1187-
ble/keymap:vi/register#dump/escape "$content"; content=$ret
11881158

1189-
out=$out'"'$k' ('$type') '$content$'\n'
1159+
ble/string#escape-for-display "$content" sgr1="$_ble_term_rev":sgr0="$_ble_term_sgr0"
1160+
out=$out'"'$k' ('$type') '$ret$'\n'
11901161
done
11911162
ble/edit/info/show ansi "$out"
11921163
return 0
11931164
}
1194-
function ble/widget/vi-command:reg { ble/keymap:vi/register#dump; }
1195-
function ble/widget/vi-command:regi { ble/keymap:vi/register#dump; }
1196-
function ble/widget/vi-command:regis { ble/keymap:vi/register#dump; }
1197-
function ble/widget/vi-command:regist { ble/keymap:vi/register#dump; }
1198-
function ble/widget/vi-command:registe { ble/keymap:vi/register#dump; }
1199-
function ble/widget/vi-command:register { ble/keymap:vi/register#dump; }
12001165
function ble/widget/vi-command:registers { ble/keymap:vi/register#dump; }
12011166

12021167
function ble/widget/vi-command/append-arg {
@@ -2710,7 +2675,7 @@ function ble/keymap:vi/mark/get-mark.impl {
27102675
ret=$index
27112676
return 0
27122677
}
2713-
## @fn ble/keymap:vi/mark/get-mark.impl c
2678+
## @fn ble/keymap:vi/mark/get-local-mark
27142679
## @param[in] c
27152680
## mark の番号 (文字コード) を指定します。
27162681
## @var[out] ret
@@ -2855,6 +2820,55 @@ function ble/widget/vi-command/goto-mark.hook {
28552820
return 1
28562821
}
28572822

2823+
function ble/widget/vi-command:marks {
2824+
ble/keymap:vi/mark/update-mark-history
2825+
2826+
local -a entries=() # <char>:<hindex>:<bol>:<col>
2827+
local c
2828+
for c in "${!_ble_keymap_vi_mark_local[@]}"; do
2829+
local value=${_ble_keymap_vi_mark_local[c]}
2830+
[[ $value ]] && ble/array#push entries "$c::$value"
2831+
done
2832+
for c in "${!_ble_keymap_vi_mark_global[@]}"; do
2833+
local value=${_ble_keymap_vi_mark_global[c]}
2834+
[[ $value ]] && ble/array#push entries "$c:$value"
2835+
done
2836+
2837+
local -a fields=()
2838+
local data ret
2839+
for data in "${entries[@]}"; do
2840+
ble/string#split data : "$data"
2841+
2842+
ble/util/c2s-edit "${data[0]}" sgr1=$'\e[9807m':sgr0=$'\e[9807m'; local s=$ret
2843+
2844+
# determine the line number and history position
2845+
local line hlabel=
2846+
if [[ ${data[1]} ]]; then
2847+
local entry
2848+
ble/history/get-edited-entry "$index"
2849+
line=$entry
2850+
hlabel=' !'${data[1]}
2851+
else
2852+
line=$_ble_edit_str
2853+
fi
2854+
ble/string#count-char "${line::data[2]}" $'\n'
2855+
((line=1+ret))
2856+
2857+
ble/keymap:vi/mark/get-mark.impl "$line" "${data[3]}"; local ind=$ret
2858+
2859+
ble/array#push fields "${data[0]}" "$s" "$line" "${data[3]}" "$ind" "$hlabel"
2860+
done
2861+
2862+
if ((${#fields[@]})); then
2863+
local content
2864+
ble/util/sprintf content '%7d %s\t(%3d, %3d) %5d%s\n' "${fields[@]}"
2865+
content=${content%$'\n'}
2866+
local mydbg=1
2867+
ble/edit/info/show ansi "$content"
2868+
fi
2869+
return 0
2870+
}
2871+
28582872
#------------------------------------------------------------------------------
28592873
# repeat (nmap .)
28602874

@@ -5503,6 +5517,8 @@ function ble/widget/vi-command/commandline.hook {
55035517
local cmd=ble/widget/vi-command:"${command[0]}"
55045518
if ble/is-function "$cmd"; then
55055519
"$cmd" "${command[@]:1}"; local ext=$?
5520+
elif ble/util/compgen cmd -A function -- "ble/widget/vi-command:${command[@]}" && ((${#cmd[@]}==1)); then
5521+
"$cmd" "${command[@]:1}"; local ext=$?
55065522
else
55075523
ble/widget/vi-command/bell "unknown command $1"; local ext=1
55085524
fi

note.txt

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,11 @@ bash_tips
19261926
- make_command.sh の整理 (scan 分離, char_width 分離)
19271927
- note.txt -> memo.txt
19281928

1929+
2025-01-21
1930+
1931+
* global: LC_COLLATE=C grc '\[ -\?\]' で検索すると LC_COLLATE=C を設定せずに
1932+
判定している箇所が沢山出てくる。これらは大丈夫だろうか? 駄目の気がする。
1933+
19291934
2025-01-16
19301935

19311936
* README: ble-attach は startup files の最後でなければならないという話。
@@ -1969,8 +1974,6 @@ bash_tips
19691974

19701975
2024-12-23
19711976

1972-
* vi_cmap: :marks の対応。ないと marks のデバグの時に不便
1973-
19741977
* vi_nmap: pu をした時のカーソル位置が vim と一致しない
19751978
Ref #D2304
19761979

@@ -7734,6 +7737,59 @@ bash_tips
77347737

77357738
2025-01-30
77367739

7740+
* 2024-12-23 vi_cmap: :marks の対応。ないと marks のデバグの時に不便 [#D2320]
7741+
7742+
* done: ble/string#escape-for-display 等も調整が必要ではないか? Unicode 制
7743+
御文字の対応はどうなっている? これは新しく用意した
7744+
ble/unicode/GraphemeCluster/ControlRepresentation を用いて処理することに
7745+
した。
7746+
7747+
* fixed: c2w-edit 及び c2s-edit は未だ判定していない Unicode 制御文字は素通
7748+
りしてしまう。これは問題ではないのか? → 原理的には c2w-edit 及び
7749+
c2s-edit を使用している段階では既に Unicode 制御文字の処理を行っていると
7750+
いう前提? だとすると実は c2s-edit を現在の様に外部から呼び出すのは本当は
7751+
駄目なのでは?
7752+
7753+
現在 c2w-edit を使っている箇所は 3 つある。何れも既に処理済みの文字列に対
7754+
する処理と分かっているのだろうか?
7755+
7756+
* self-insert については overwrite mode で削除する文字数を決定するのに使っ
7757+
ている。これは、未だ判定していない Unicode 制御文字が来る可能性があるが、
7758+
ずれていたとしても其処まで大した問題にはならないだろうという気がする。
7759+
7760+
* .delete-backward-char に関しては、既に登録されている文字に対しての判定
7761+
なので、(rendering 後であれば) Unicode 制御文字として登録されている筈で、
7762+
問題は発生しない筈。
7763+
7764+
何れにしても c2w-edit は頻繁に使用されているという訳でもないので、Unicode
7765+
制御文字としての判定を追加しても良いのでは? 少なくとも s2c 等の処理よりは
7766+
軽い様な気がするので其処まで気にしなくて良いのではないかという気がする。
7767+
7768+
? ok: そもそも c2w-edit や c2s-edit は LANG=C の時には全ての unicode 文字に
7769+
ついて ASCII 表現を使用するべきなのではないか? と思ったが、よく考えたら
7770+
LC_CTYPE が unicode でない時にはそもそも code として Unicode 範囲の物が現
7771+
れる事もないので気にしなくて良い? 既存の取り扱いだと self-insert の時点で
7772+
本当に ASCII の文字列に変換されてしまうという物だった様な気がする。なので、
7773+
code として Unicode 範囲の物を受け取ったら常に Unicode が使える前提として
7774+
処理してしまって問題ない?
7775+
7776+
これは将来的に "表示に用いる文字コードだけ変更する機能" が必要になった時
7777+
に考えれば良い。
7778+
7779+
* global marks と local marks の両方を表示する様にするべき? うーん。と思っ
7780+
たが global marks は全然登録されていない。後で global marks を定義する方
7781+
法について確認して、global marks を定義した上で動作確認する。global marks
7782+
は mA などとすれば作る事ができる → 動作確認した。動いている気がする。
7783+
7784+
* 記録されている行頭位置をそのまま表示しているが、行頭位置は行頭の ind なの
7785+
ではないか。これを行番号に変換するべきでは → その様に変換してから表示す
7786+
る様に修正した。
7787+
7788+
2025-01-28 動作確認する。うーん。特殊文字の反転がそのままになっている。
7789+
toggle をちゃんと指定しているのに。確認してみると c2s-edit の結果が単に
7790+
sgr1 だけになっている。何故? → これは複数の呼び出しで ret を上書きしていた。
7791+
ちゃんと ret の結果を保持する様にして修正した。
7792+
77377793
* keymap.vi: command mode を使った後 marks が消滅する問題 [#D2319]
77387794

77397795
#D2320 の :marks のテストをするに当たって、そもそも全然 `[ や `] が登録され

src/canvas.sh

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,8 @@ function ble/util/c2w {
9191
## 編集画面での表示上の文字幅を返します。
9292
## @var[out] ret
9393
function ble/util/c2w-edit {
94-
local cs=${_ble_unicode_GraphemeCluster_ControlRepresentation[$1]}
95-
if [[ $cs ]]; then
96-
ret=${#cs}
97-
elif (($1<32||127<=$1&&$1<160)); then
98-
# 制御文字は ^? と表示される。
99-
ret=2
100-
# TAB は???
101-
102-
# 128-159: M-^?
103-
((128<=$1&&(ret=4)))
94+
if ble/unicode/GraphemeCluster/ControlRepresentation "$1"; then
95+
ret=${#ret}
10496
else
10597
ble/util/c2w "$1"
10698
fi
@@ -122,6 +114,29 @@ function ble/util/s2w {
122114
ble/util/s2w-edit "$1" R
123115
}
124116

117+
## @fn ble/util/c2s-edit ccode [opts]
118+
## 編集画面での表現を返します。
119+
## @param[opt] opts
120+
## @opt sgr1 sgr0
121+
## 制御文字の代替表現を囲むのに使用する文字列を指定します。
122+
##
123+
## @var[out] ret
124+
function ble/util/c2s-edit {
125+
if ble/unicode/GraphemeCluster/ControlRepresentation "$1"; then
126+
if [[ ${2-} ]]; then
127+
local cr=$ret sgr0= sgr1=
128+
if ble/opts#extract-last-optarg "$2" sgr1 "$_ble_term_rev"; then
129+
sgr1=$ret
130+
ble/opts#extract-last-optarg "$2" sgr0 "$_ble_term_sgr0"
131+
sgr0=$ret
132+
ret=$sgr1$cr$sgr0
133+
fi
134+
fi
135+
else
136+
ble/util/c2s "$1"
137+
fi
138+
}
139+
125140
# ---- 文字種判定 ----
126141

127142
#%< canvas.c2w.sh
@@ -946,6 +961,27 @@ function ble/unicode/GraphemeCluster/.get-ascii-rep {
946961
fi
947962
}
948963

964+
function ble/unicode/GraphemeCluster/ControlRepresentation {
965+
# cache
966+
if [[ ${_ble_unicode_GraphemeCluster_ControlRepresentation[$1]+set} ]]; then
967+
ret=${_ble_unicode_GraphemeCluster_ControlRepresentation[$1]}
968+
[[ $ret ]]
969+
return "$?"
970+
fi
971+
972+
if (($1<32||127<=$1&&$1<160)) || {
973+
ble/unicode/GraphemeCluster/c2break "$1"
974+
((ret==_ble_unicode_GraphemeClusterBreak_Control)); }; then
975+
local cs
976+
ble/unicode/GraphemeCluster/.get-ascii-rep "$1"
977+
ret=$cs
978+
return 0
979+
else
980+
_ble_unicode_GraphemeCluster_ControlRepresentation[$1]=
981+
return 1
982+
fi
983+
}
984+
949985
## @fn ble/unicode/GraphemeCluster/match text i flags
950986
## @param[in] text i
951987
## @param[in] flags

src/color.sh

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,18 +1726,9 @@ function ble/highlight/layer:plain/update/.getch {
17261726
ch='^?'
17271727
fi
17281728
else
1729-
local ret; ble/util/s2c "$ch"
1730-
local cs=${_ble_unicode_GraphemeCluster_ControlRepresentation[ret]}
1731-
if [[ $cs ]]; then
1732-
ch=$cs
1733-
elif ((ret<0x20)); then
1734-
ble/util/c2s "$((ret+64))"
1735-
ch="^$ret"
1736-
elif ((0x80<=ret&&ret<=0x9F)); then
1737-
# C1 characters
1738-
ble/util/c2s "$((ret-64))"
1739-
ch="M-^$ret"
1740-
fi
1729+
local ret
1730+
ble/util/s2c "$ch"
1731+
ble/unicode/GraphemeCluster/ControlRepresentation "$ret" && ch=$ret
17411732
fi
17421733
}
17431734

src/edit.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5190,6 +5190,8 @@ function ble/widget/self-insert {
51905190
# 上書きモードの時は Unicode 文字幅を考慮して既存の文字を置き換える。
51915191
# ※現在の LC_CTYPE で対応する文字がない場合でも、意図しない動作を防ぐために、
51925192
# 対応していたと想定した時の文字幅で削除する。
5193+
# TODO: c2w-edit では TAB は "^I" として扱われるが、本当は現在の列に応じ
5194+
# て計算するべき?
51935195
local ret w; ble/util/c2w-edit "$code"; w=$((arg*ret))
51945196

51955197
local iN=${#_ble_edit_str}
@@ -5432,6 +5434,8 @@ function ble/widget/.delete-backward-char {
54325434
local w=0 ret i
54335435
for ((i=0;i<a;i++)); do
54345436
ble/util/s2c "${_ble_edit_str:_ble_edit_ind-a+i:1}"
5437+
# TODO: c2w-edit では TAB は "^I" として扱われるが、本当は現在の列に
5438+
# 応じて計算するべき?
54355439
ble/util/c2w-edit "$ret"
54365440
((w+=ret))
54375441
done

src/util.sh

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,19 +1182,12 @@ function ble/string#escape-for-display {
11821182

11831183
while [[ $tail ]]; do
11841184
if ble/util/isprint+ "$tail"; then
1185-
head=$head${BASH_REMATCH}
1185+
head=$head$BASH_REMATCH
11861186
tail=${tail:${#BASH_REMATCH}}
11871187
else
1188-
ble/util/s2c "${tail::1}"
1189-
local code=$ret
1190-
if ((code<32)); then
1191-
ble/util/c2s "$((code+64))"
1192-
ret=$sgr1^$ret$sgr0
1193-
elif ((code==127)); then
1194-
ret=$sgr1^?$sgr0
1195-
elif ((128<=code&&code<160)); then
1196-
ble/util/c2s "$((code-64))"
1197-
ret=${sgr1}M-^$ret$sgr0
1188+
ble/util/s2c "${tail::1}"; local code=$ret
1189+
if ble/unicode/GraphemeCluster/ControlRepresentation "$ret"; then
1190+
ret=$sgr1$ret$sgr0
11981191
else
11991192
ret=${tail::1}
12001193
fi

0 commit comments

Comments
 (0)