Skip to content

Commit 36ab934

Browse files
committed
edit: adjust cursor position after "bind -x" in vi_nmap
1 parent 430a174 commit 36ab934

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

docs/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@
211211
- complete: work around `mawk <= 1.3.4-20230525` type-inference bug (reported by KaKi87) `#D2295` 546499b5
212212
- main: work around macOS sed (reported by Mossop) `#D2298` a16aa594
213213
- main: delay attaching in kitty, Ghostty, and VS Code Terminal `#D2215` xxxxxxxx
214+
- edit: adjust cursor position after `bind -x` in vi_nmap (requested by miltieIV2) `#D2317` xxxxxxxx
214215

215216
## Contrib
216217

note.txt

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

1929+
2025-01-16
1930+
1931+
* README: ble-attach は startup files の最後でなければならないという話。
1932+
19291933
2024-12-24
19301934

19311935
* vscode における初期化問題
@@ -7728,6 +7732,71 @@ bash_tips
77287732
Done (実装ログ)
77297733
-------------------------------------------------------------------------------
77307734

7735+
2025-01-16
7736+
7737+
* vi_nmap: "bind -x" 実行後のカーソルの位置 (requested by miltieIV2) [#D2317]
7738+
https://github.com/akinomyoga/ble.sh/issues/547
7739+
7740+
bash ではカーソルを行末などに置いても勝手に調整を行う。
7741+
7742+
vi_nmap における complete の時には一体どうしていたか。d7ec488a を見ると特に
7743+
core-complete.sh の側では vi_nmap に対する特別の処理は実装していない様に見
7744+
える。menu_complete に入った後で行末で menu_complete を抜けた後のカーソル位
7745+
置を何処で調節しているのかが分からない。
7746+
7747+
* 実際に挿入が起こった時には ble/keymap:vi/complete/insert.hook 経由で調整
7748+
しているのかと思ったが、よく見ると別にカーソル位置の調整はここでは行って
7749+
いない様に見える。
7750+
7751+
* と思ったが、実は core-complete.sh の側でちゃんと vi_nmap に対する特別の処
7752+
理を含めている。c106239a で実はその処理が既に追加されていたのだった。
7753+
7754+
本当は edit.sh の中に特定の keymap に対する特別処理を余り追加したくないが、
7755+
その為には色々と hook を定義しなければならず微妙である。例えば "bind -x の
7756+
処理が終了した時に呼び出される hook" という物をわざわざ実装する必要があるか
7757+
という話になる。
7758+
7759+
因みに現在 edit.sh の中で明示的に vi_nmap を参照している箇所はどれぐらいあ
7760+
るだろうか。結構たくさんある。filter-word.impl, undo,
7761+
{start,end,print}-keyboard-macro, history-search, nsearch, ... うーん。もう
7762+
実装の分離は諦めて良い気がする。
7763+
7764+
次に直接 needs-eol-fix を呼び出すべきか、adjust-command-mode を一括で呼び出
7765+
すべきか。adjust-command-mode の処理の中には C-o に対する処理も含まれている。
7766+
つまり、単にカーソル位置を調節するだけでは不十分という事ではないだろうか。
7767+
7768+
? 一方で、vi_nmap の中で C-o に抗う様な物を実装する可能性はあるだろうか。普
7769+
通に考えたら C-o の vi_nmap の中で何か実行してそれに抗うというのは考えに
7770+
くい。と思ったが、例えば引数を追加するコマンドを bind -x の中で実行した場
7771+
合には、引数をそのままにして抜けてしまったら問題になる。うーん。そもそも
7772+
vi_nmap の中の全ての widget が最後に adjust-command-mode を実行するわけで
7773+
はないのだ。
7774+
7775+
やはり下手な調整は実行せずにカーソル位置の調整だけに留めるべきなのだろう
7776+
か。
7777+
7778+
* 然し現在の実装では実のところ clear-arg をコマンド実行後に呼び出している
7779+
のでそもそも bind -x の中で引数を追加する等のことは想定していない。その
7780+
様な事をしたいのであれば、ble.sh 専用の widget を使うべきという事。そも
7781+
そも Bash では (ble.sh の widget を呼び出して) 引数を調整することはでき
7782+
ないので Bash の bind -x 経由でそれを実行しようとするべきではない。Bash
7783+
でも ble.sh でも動く兼用の設定にしたいとしても、ble.sh では引数を設定し
7784+
て Bash ではそれをしないという様な機能というのも考えにくい。
7785+
7786+
という事なので、bind -x の中で引数を設定するだけとか register を設定する
7787+
だけとかそういう物を実装することは想定しないとして、無条件に
7788+
adjust-command-mode を呼び出すという形で良い事にする。
7789+
7790+
? 或いは、C-o に突入する様な機能を実装した時にそれが即座にキャンセルされる
7791+
様な振る舞いになって不都合ではないか。然し、C-o を自前で実装するという事
7792+
があるだろうか…。と思ったが、bind -x の関数の中で ble.sh の widget を順
7793+
番に呼び出して処理をするという可能性もある。という事を考えると C-o に突入
7794+
した直後はそのままという可能性もある。うーん。
7795+
7796+
もう一つの可能性は vi_nmap で始まって vi_nmap で終わったら
7797+
adjust-command-mode を呼び出すという事。それ以外の場合には何もしないかカー
7798+
ソル位置の調整だけ行うという可能性。うーん。取り敢えずこれで実装してみた。
7799+
77317800
2025-01-07
77327801

77337802
* integration/zoxide: compopt -o noquote は余分 (reported by tessus) [#D2316]

src/edit.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11950,6 +11950,22 @@ function ble/widget/.EDIT_COMMAND {
1195011950
local N=${#_ble_edit_str}
1195111951
((_ble_edit_ind<0?_ble_edit_ind=0:(_ble_edit_ind>N&&(_ble_edit_ind=N))))
1195211952
((_ble_edit_mark<0?_ble_edit_mark=0:(_ble_edit_mark>N&&(_ble_edit_mark=N))))
11953+
if [[ $_ble_decode_keymap == vi_nmap ]]; then
11954+
if [[ $KEYMAP == vi_nmap ]]; then
11955+
# Note: If the command did not change the current keymap, we perform the
11956+
# adjustment for a normal command in vi_nmap. For example, this exits
11957+
# the single command mode by C-o. We do not support the shell commands
11958+
# that tries to adjust arguments and registers without exiting the single
11959+
# command mode. There are already limitations with such a command
11960+
# because we clear the arguments after evaluating the shell command.
11961+
ble/keymap:vi/adjust-command-mode
11962+
else
11963+
# If the current keymap became vi_nmap due to the command, we do not
11964+
# perform extra adjustment for C-o, etc. We just fix the current cursor
11965+
# position.
11966+
ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
11967+
fi
11968+
fi
1195311969

1195411970
return "$ext"
1195511971
}

0 commit comments

Comments
 (0)