Skip to content

Commit

Permalink
edit: support "bleopt history_default_point"
Browse files Browse the repository at this point in the history
* util: fix error messages of "bleopt input_encoding"
* edit: fix a bug that "bleopt edit_line_type" has not worked
* edit: fix broken "bleopt history_preserve_point=1" for linewise
  history movement
* edit: support "bleopt history_default_point={begin,near,far}"
* edit: support "bleopt history_default_point={beginning,end}-of-line"
* edit: support "bleopt history_default_point=preserce-column"
* edit: support graphica/logical linewise cursor positioning after
  history movement
  • Loading branch information
akinomyoga committed Dec 19, 2024
1 parent 3d7c98b commit 37291ff
Show file tree
Hide file tree
Showing 6 changed files with 347 additions and 73 deletions.
26 changes: 19 additions & 7 deletions blerc.template
Original file line number Diff line number Diff line change
Expand Up @@ -313,13 +313,25 @@
#bleopt allow_exit_with_jobs=


## The following setting controls the cursor position after the move to other
## history entries. When non-empty values are specified, the offset of the
## cursor from the beginning of the command line is preserved. When an empty
## value is specified the cursor position is the beginning or the end of the
## command lines when the move is to a newer or older entry, respectively.

#bleopt history_preserve_point=
## The following setting controls the default cursor position after moving to
## another history entry. When "preserve" is specified, ble.sh tries to
## preserve the cursor position before moving the history entry. When "begin"
## and "end" are specified, the cursor is placed at the beginning and end,
## respectively, of the entry. When "near" is specified, when we move to an
## older (newer) history entry, the cursor is placed at the end (beginning) of
## the text. When "far" is specified, when we move to an older (newer) history
## entry, the cursor is palced at the beginning (end) of the text. When
## "beginning-of-{,graphical-,logical-}line" is specified, the cursor is placed
## at the beginning of the last (first) line when we move to an older (newer)
## history entry. When "end-of-{,graphical-,logical-}line" is specified, the
## cursor is placed at the end of the last (first) line when we move to an
## older (newer) history entry. When "preserve-{,graphical-,logical-}-column"
## is specified, te cursor is placed at the same column as before moving the
## history entry. When the versions without "graphical" or "logical" is used,
## a logical or graphical line is used based on "bleopt edit_line_type". The
## default is "end-of-line".

#bleopt history_default_point=


## The following setting controls the history sharing. If it has non-empty
Expand Down
1 change: 1 addition & 0 deletions docs/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
- nsearch: support `action={load-{line,command},insert{,-line}}` (motivated by vaab) `#D2286` 32f290df
- complete: support completion for `execute-named-command` `#D2288` 4fee44e6
- complete: support `ble-face menu_complete_{match,selected}` (requested by simonLeary42) `#D2291` 31f264ad
- edit: support `bleopt history_default_point={preserve,begin,end,near,far,{beginning,end}-of-line,preserve-column,...}` (requested by miltieIV2) `#D2297` xxxxxxxx

## Changes

Expand Down
21 changes: 10 additions & 11 deletions lib/keymap.vi.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2702,7 +2702,7 @@ function ble/widget/vi-command/goto-global-mark.impl {
ble/widget/vi-command/bell
return 1
fi
ble-edit/history/goto "${data[0]}"
ble-edit/history/goto "${data[0]}" point=near
fi

# find position by data[1]:data[2]
Expand Down Expand Up @@ -4068,18 +4068,17 @@ function ble/widget/vi-command/.history-goto {
return 1
fi

ble-edit/history/goto "$new_index"

# adjust the cursor position
local ret
if ((new_index<old_index)); then
ble-edit/content/find-logical-eol 0 "$((nline-count-1))"
ble/keymap:vi/needs-eol-fix "$ret" && ((ret--))
local point_opts point point_x
if ((new_index>old_index)); then
point_opts=forward
else
ble-edit/content/find-logical-bol 0 "$count"
point_opts=backward
fi
_ble_edit_ind=$ret

ble-edit/history/goto "$new_index"

# adjust the cursor position
ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
ble/keymap:vi/adjust-command-mode
}

Expand Down Expand Up @@ -5568,7 +5567,7 @@ function ble/widget/vi-command/search.core {
if ((r==0)); then
local new_index; ble/history/get-index -v new_index
[[ $index != "$new_index" ]] &&
ble-edit/history/goto "$index"
ble-edit/history/goto "$index" point=none
if ((opt_backward)); then
local i=${#_ble_edit_str}
ble/keymap:vi/needs-eol-fix "$i" && ((i--))
Expand Down
80 changes: 80 additions & 0 deletions note.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,20 @@ bash_tips
- make_command.sh の整理 (scan 分離, char_width 分離)
- note.txt -> memo.txt

2024-12-18

* edit: C-c 後の履歴位置が変だ (reported by dezza)
https://github.com/akinomyoga/ble.sh/discussions/540

C-c を実行した後は C-m を実行した時と同様に全ての編集をクリアして、履歴位置
は履歴の末端に移動するべきである。

* global: 実は [:space:] は \v\f\r\n にも一致する

一方で [:blank:] は全く使われていない。実は [:space:] になっている箇所は全
て [:blank:] なのでは? ただし改行 \n も意図していた可能性があるのでそれにつ
いては $_ble_term_IFS に置き換える。

2024-12-09

* highlight: cd を bind -x 経由で実行するとコマンドキャッシュがクリアされないので
Expand Down Expand Up @@ -7700,6 +7714,72 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2024-12-18

* edit: 履歴移動を行った時のカーソル位置の設定 (requested by miltieIV2) [#D2297]
https://github.com/akinomyoga/ble.sh/issues/537

* fixed: 何と今まで "bleopt edit_line_type" が動いていなかった様だ。

* fixed: 何と今まで bleopt/check:input_encoding のエラーメッセージの一部が
表示されていなかった様だ。

* ok: ble-0.3 では ble/util/print ではなく echo を使っているので問題なかっ
た。

* ok: 類似のものは他にはないようだ。

* done: wiki, blerc

x fixed: preserve にしても位置が preserve されていない

これは何処かの時点で壊れたという事だろうか。上に遡る時には必ずカーソルは
先頭に移動してしまう。また、下に移動する時には前のコマンドラインの末端位
置に移動しようとする。現在のカーソル位置は全く保持していない。keymap.vi
特有の問題ではないようだ。emacs モードでも同様の現象が起こっている。

うーん。呼び出しの順序的に履歴移動が発生しなかった時に正しい位置にカーソ
ルを移動してエラーメッセージも必要に応じて出力しなければならない。しかし
現在の枠組みだと履歴移動が発生したかどうかを forward-history-line.impl の
呼び出し元で知ることができない。

振る舞いについて確認する forward-history-line.impl は先ず行を追跡して適切
な履歴項目の位置を探し出している。その後で対応する行が見つかれば其処に移
動するし、見つからなければ先頭項目か末端項目に移動して終了する。

* 先ず ble/widget/forward-history-line.impl を呼び出したら、履歴移動が発
生しなかったとしても、必ずカーソル位置は適切な位置に設置することにする。

x resolved: forward-history-line etc 等との consistency はどうなっているの
か? 複数行の時に forward-history-line も位置を調整しようとしている。履歴
移動後にどの位置にいるのかは実は ble-edit/history/goto で管理するのではな
くて forward-history-line 等の実装ごとに適切に処理する必要があるのではな
いか?

* done: ble-edit/history/goto でもカーソル位置を調整するしその呼び出し元
でもカーソル位置を調整しているというのは無駄の処理の気がする。→これは
ble-edit/history/goto で opts を受け取って clear-point が指定されている
場合には、単に _ble_edit_ind=0 にする事にした。

forward-history-line 等の行指向の履歴移動の場合には振る舞いを行指向に変更
した物を別に実装することにした。

* done: preserve-{,graphical,logical-}column 等も用意するべきではないか?

* done: clear-point ではなく point=none にする。point=near 等に対応する

* done: graphical, logical も外から指定できるようにする? graphical-linewise
もしくは logical-linewise の形で。と思ったが、そもそも
forward-history-line.impl の時点でどちらか分からないので、これも更に外側
から種類を受け取る様に修正する必要がある→面倒だと思ったが結局対応した。

[動作確認]

x fixed: 全く動かなくなっている。と思ったら graphica/logical の決定による
point の書き換えに失敗していた。修正した。

その他は大体動いている様だ。

2024-12-12

* style: prefix:$name の形をしている定義関数の呼び出しのクォートを調整 [#D2296]
Expand Down
Loading

0 comments on commit 37291ff

Please sign in to comment.