Skip to content

Commit

Permalink
keymap/vi: split widget "text-object" into "text-object-{inner,outer}"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Dec 11, 2023
1 parent 6b144de commit 11cf118
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 9 deletions.
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
31 changes: 22 additions & 9 deletions lib/keymap.vi.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
#
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
25 changes: 25 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit 11cf118

Please sign in to comment.