From 11cf118af260e19ff7e7c1565b67d3f86cf99098 Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Mon, 11 Dec 2023 07:47:08 +0900 Subject: [PATCH] keymap/vi: split widget "text-object" into "text-object-{inner,outer}" --- docs/ChangeLog.md | 1 + lib/keymap.vi.sh | 31 ++++++++++++++++++++++--------- note.txt | 25 +++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index f8ced007..335c9617 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -14,6 +14,7 @@ - make: support `make uninstall` `#D2068` a39a4a89 - edit: support `bleopt {edit_marker{,_error},exec_exit_mark}` `#D2079` e4e1c874 - edit: add widget `zap-to-char` `#D2082` ce7ce403 +- keymap/vi: split widget `text-object` into `text-object-{inner,outer}` `#D2093` xxxxxxxx ## Changes diff --git a/lib/keymap.vi.sh b/lib/keymap.vi.sh index 47f3f693..b30ba171 100644 --- a/lib/keymap.vi.sh +++ b/lib/keymap.vi.sh @@ -5077,11 +5077,16 @@ function ble/keymap:vi/text-object.hook { return 0 } -function ble/keymap:vi/.check-text-object { - local n=${#KEYS[@]}; ((n&&n--)) - ble-decode-key/ischar "${KEYS[n]}" || return 1 +function ble/keymap:vi/.attempt-text-object { + local c=${1:-} + if [[ ! $c ]]; then + # If the type is not specified, it is determined from the last key the user + # input (i or a). This is for the backward compatibility. + local n=${#KEYS[@]}; ((n&&n--)) + ble-decode-key/ischar "${KEYS[n]}" || return 1 + local ret; ble/util/c2s "${KEYS[n]}"; c=$ret + fi - local ret; ble/util/c2s "${KEYS[n]}"; local c=$ret [[ $c == [ia] ]] || return 1 [[ $_ble_keymap_vi_opfunc || $_ble_decode_keymap == vi_[xs]map ]] || return 1 @@ -5092,11 +5097,19 @@ function ble/keymap:vi/.check-text-object { } function ble/widget/vi-command/text-object { - ble/keymap:vi/.check-text-object && return 0 + ble/keymap:vi/.attempt-text-object "$@" && return 147 ble/widget/vi-command/bell return 1 } +function ble/widget/vi-command/text-object-outer { + ble/widget/vi-command/text-object a +} + +function ble/widget/vi-command/text-object-inner { + ble/widget/vi-command/text-object i +} + #------------------------------------------------------------------------------ # Command # @@ -5724,8 +5737,8 @@ function ble-decode/keymap:vi_omap/define { ble-bind -f 'C-[' vi_omap/cancel ble-bind -f 'C-c' vi_omap/cancel - ble-bind -f a vi-command/text-object - ble-bind -f i vi-command/text-object + ble-bind -f a vi-command/text-object-outer + ble-bind -f i vi-command/text-object-inner # 範囲の種類の変更 (vim o_v o_V) ble-bind -f v vi_omap/switch-to-charwise @@ -7584,8 +7597,8 @@ function ble-decode/keymap:vi_xmap/define { ble-bind -f '"' vi-command/register - ble-bind -f a vi-command/text-object - ble-bind -f i vi-command/text-object + ble-bind -f a vi-command/text-object-outer + ble-bind -f i vi-command/text-object-inner ble-bind -f 'C-\ C-n' vi_xmap/cancel ble-bind -f 'C-\ C-g' vi_xmap/cancel diff --git a/note.txt b/note.txt index 5831af9f..b7a2ec39 100644 --- a/note.txt +++ b/note.txt @@ -7063,6 +7063,31 @@ bash_tips Done (実装ログ) ------------------------------------------------------------------------------- +2023-12-11 + + * vi: text-object を別の文字に割り当てようとしている人がいる (requested by Darukutsu) [#D2093] + https://github.com/akinomyoga/ble.sh/issues/377 + + 元々は text-object a も i も同じ一つの widget で処理していてユーザーのキー + 入力が a か i かに応じて振る舞いを変更していた。然し、別の文字に + text-object を割り当てようとすると i でも a でもないのでエラーになってしま + う。 + + 元の Vim script ではどうなっているのか確認したが noremap で設定している限り + は、実際に i や a がどう設定されているかどうかに関係なく、 i と指定すれば + inner text-object になるし a と指定すれば outer text-object になる。なので、 + noremap を使っている限りは類似の問題は生じない。 + + 仕方ないので今回は text-object widget を text-object-inner と + text-object-outer に分解する事にする。 + + 実装を考え直した。text-object をそのまま引数を受け取る様に拡張する方が良い。 + i と a の binding は分かりやすさの為にそれぞれ text-object-inner と + text-object-outer のままにしておくが、text-object.impl という widget を新設 + するよりは元より text-object で引数に対応する事にして、 + text-object-{inner,outer} はその widget を呼び出す様にする。こちらの方が無 + 駄な diff がなく良い。 + 2023-12-08 * ble/array#*: nocasematch の時に _ble_local_script の ARR 置換が arr を誤爆 (reported by jkemp814) [#D2092]