From 826a2753ab31d723fc97dff83d034b9615eff423 Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sun, 5 Feb 2023 19:21:37 +0900 Subject: [PATCH] util (ble/builtin/trap): support Bash 5.2 "trap -P" --- docs/ChangeLog.md | 1 + make_command.sh | 2 +- note.txt | 148 +++++++++++++++++++++++++++++++++++----------- src/util.hook.sh | 16 +++-- 4 files changed, 128 insertions(+), 39 deletions(-) diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index bd299980..5444df41 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -119,6 +119,7 @@ - complete: preserve original path segments as long as possible `#D1923` `#D1924` e3cdb9d - main: support `BLE_SESSION_ID` and `BLE_COMMAND_ID` `#D1925` 44d9e10 - main: support an option `--inputrc={diff,all,user,none}` `#D1926` 92f2006 +- util (`ble/builtin/trap`): support Bash 5.2 `trap -P` `#D1937` xxxxxxx ## Changes diff --git a/make_command.sh b/make_command.sh index d8833187..ec1dccb0 100755 --- a/make_command.sh +++ b/make_command.sh @@ -1378,7 +1378,7 @@ function sub:scan { #sub:scan/assign sub:scan/builtin trap | sed -E 'h;s/'"$esc"'//g;s/^[^:]*:[0-9]+:[[:space:]]*// - \Zble/util/print "trap -- '\''\$\{_ble_trap_handler//\$q/\$Q}'\'' \$nZd + \Z_ble_trap_handler="trap -- '\''\$\{_ble_trap_handler//\$q/\$Q}'\'' \$nZd \Zline = "bind"Zd \Ztrap_command=["'\'']trap -- Zd \Zlocal trap$Zd diff --git a/note.txt b/note.txt index 4a723e9c..79b43d62 100644 --- a/note.txt +++ b/note.txt @@ -1652,26 +1652,6 @@ bash_tips を使えと書いているが、明らかにこれは bash のバグである。修正するべきだし修 正は難しくない筈である。後で観察する事にする。 -2021-06-12 - - * bash: 開発版 version に関して - - 実は bash-dev 版は 5.1.xxx の儘推移している。本当は 5.2.xxx-alpha の様な形 - にするべきなのではないかという気がする。よく分からない。提案しようかとも思っ - たが実際の所は 5.1.x-maint になっている事から、本来は devel branch は既に出 - た version のメンテナンスモードという意味合いだったのかも知れない。然し、こ - の様になっていると次の version かどうかを判定するのに BASH_VERSINFO を利用 - する事ができない。今迄は新しい version になる事によって何か機能が減るなどし - て動かなくなるという事はなかったので余り気にならなかったが、"テスト" という - 観点から本来は早くに bash-5.2 に増やすべきなのではないかという気がする。 - - 差し当たっての ble.sh の側では release status も見て version を上げる様にす - るのが良いだろうか。と思ったが…。自分はテストの為に release を release に - しているし、逆に maint で動かしているユーザーがいたとしても遅くて使い物にな - らない。自分の relstatus に関してはまた別の値を指定するという手もあるのかも - しれない。と思ったが、それをするぐらいであれば実は configure.ac に於いて - version を 5.2 に書き換えてしまえば良いのである。 - 2021-06-09 * complete: contra x screen-4.99 で auto-menu を有効にしていると、 @@ -1936,12 +1916,52 @@ bash_tips * bump 時にする事 - note.txt に含まれるログの移動 -> done.txt - version up in GNUmakefile, README - - Copyright + - Copyright year - Acknowledgments - todo 項目の整理 - leakvars - keymap の移動 (これは別 commit にする?) +2023-02-03 + + * contrib: ble-import で contrib/ は不要なのではないか? + * contrib: fzf, bash-preexec などは integration dir に移動する。install 時に + symlink を貼る。 + + * histdb: 同じディレクトリの一番最近の履歴を抽出する。 + + 有効なファイル名を記録するのよりも先にこちらを実装するべきである。 + + histdb-history + + * ディレクトリが移動した後も追跡できれば追跡する。 + + ディレクトリの inode を記録するという手もある? 然しファイルシステムが異な + る場合もあるので何とも言えない。別のファイルシステムのディレクトリを掴ん + でしまったら仕方ないので諦める。そもそもディレクトリが移動して元の場所に + ないのであれば別の物を拾っても仕方がない。それを言い出したら一旦ディレク + トリを削除した後に別のディレクトリを移動して持ってきた場合なども考えなけ + ればならなくなる。 + + と思ったが inode を持っていてもそのディレクトリのパスを取得する方法がない。 + ファイルシステム依存で特別のコマンドを走らせれば inode に対応するファイル + 名を列挙する事はできるが、一般にはファイルシステムを浚うしかないので単な + る補完の為には現実的に実行できない。 + https://stackoverflow.com/questions/14822611/is-there-any-way-that-i-can-search-for-a-file-or-a-filename-using-a-given-inode + + 可能性があるとしたら移動先のディレクトリでコマンドを実行した事があるとし + たら、inode が一致する物をデータベース内で探して列挙する事はできる。 + + + 一文字コマンド等の自明なコマンドを対象としない。これは histdb_ignore で指定 + すれば良さそうな気もするが、実行時間などが気になる場合もあるかもしれないし、 + 完全なログを後で欲しいという場合もあるかもしれないので、ignore は別に指定で + きる様にするべきかもしれない。つまり、ログに残すかどうかの ignore と補完で + 現れるかどうかの ignore は本来は別の物であるのに関わらず元の bash では一緒 + くたになっていた (寧ろ元の bash ではログを残すという意味合いは弱くて後でコ + マンドを再利用するというのが目的だったのだから、元の bash で設定ができない + のは理解できる)。 + 2023-01-26 * [保留] histdb: 形式を変更する時は形式自動アップグレードを実装する @@ -2411,15 +2431,6 @@ bash_tips 2022-03-19 - * BUG bash-5.2 で \q{...} が動かなくなっている - - どうもこれは bleopt の設定時に \ が重複しているのが原因の様だ。表示時の問題 - ではなくて本当に値が変わってしまっているという事を確認した。 - - どうもこれは ${var[@]/%/"=$value"} の振る舞いに関する物の様だ。というかこれ - は既に別に patch を用意した物の気がする。というか既にこの問題を発見してそれ - で修正したという事の気がする。やはり早く patch を提出する事にする。 - * 編集文字列に含まれる制御文字の反転表示の可能性 現在は見た目には区別がつかない。プロンプトシーケンス \w, \W, etc に含まれる @@ -3955,10 +3966,28 @@ bash_tips 65822e50 - alias expansion fix in case statements * vi-undo - * 5.2: LS_COLORS readline-colored-completion-prefix (bash e59452c7) + * 5.2: LS_COLORS *.readline-colored-completion-prefix (bash e59452c7) - * 5.2 新機能: READLINE_ARGUMENT: 調べてみると引数が存在している時にのみ定義さ - れる様である。また今気づいた事だが -x 属性が入っている。 + rlvar colored-completion-prefix が on でかつ LS_COLORS の中に + *.readline-colored-completion-prefix という項目がある時、共通一致部分の着色 + をそれに書き換える。 + + 実際に bash の振る舞いを調べてみようとしたがどうも有効にならない。調べてみ + ると、_rl_color_ext_list が初期化されていない。これを初期化する為には何かす + る必要があるのだろうか。_rl_parse_colors という関数で初期化しているようだが、 + この関数はどこから呼び出されているのだろうか。 + + うーん。分かった。readline.c:1327 で呼び出している。これは初期化部分である。 + つまり、readline を初期化するよりも先に LS_COLORS を設定しておく必要がある。 + 更に言うと、bind 'set ... on' も事前にやって置かないと駄目。というか + colored-stats の時点で同じ問題があったのではないか? + + これは単純に _rl_color_ext_list が空だったらその場で _rl_parse_colors の呼 + び出しを試みるという事と、それから LS_COLORS の値が変更される時に + _rl_color_ext_list をクリアする。と思ったが、これだと LS_COLORS が空の時に、 + 毎回 _rl_parse_colors が試みられて非効率的である。 + + * 後、_rl_colored_stats = 0 が _rl_parse_colors の中で設定されている。 2021-04-30 @@ -6854,6 +6883,59 @@ bash_tips Done (実装ログ) ------------------------------------------------------------------------------- +2023-02-05 + + * 5.3: ble/builtin/trap -P [#D1937] + + trap に -p と -P の両方が指定されていた場合はどちらが勝つのか? と思ったら両 + 方指定する事はできませんというエラーになった。ble/builtin/trap でもその様に + 実装する。 + + うーん。builtin trap -P を使ってより効率の良い実装に切り替えようと思ったが、 + 実際には ble.sh の中では « trap '' xxx » の形になっている事を想定した処理に + なっていた。読み取る時も結局 eval "ble/builtin/$(trap -p INT)" 的な形にして + ble/builtin/trap に委譲して処理している (つまり、eval を使って引数を評価し + ている)。なので今迄通り trap -p を使い続けるので良い気がする。敢えて複雑に + 処理を切り替える必要もない。 + + * 2022-03-19 [対応済み] compat bash-5.2 で \q{...} が動かなくなっている [#D1936] + + どうもこれは bleopt の設定時に \ が重複しているのが原因の様だ。表示時の問題 + ではなくて本当に値が変わってしまっているという事を確認した。 + + どうもこれは ${var[@]/%/"=$value"} の振る舞いに関する物の様だ。というかこれ + は既に別に patch を用意した物の気がする。というか既にこの問題を発見してそれ + で修正したという事の気がする。やはり早く patch を提出する事にする。 + + →これはもう修正を提案して修正されている。現在の 5.2 では何も問題は生じてい + ない。 + + * 2021-06-12 [対応済み] bash: 開発版 version に関して [#D1935] + + 実は bash-dev 版は 5.1.xxx の儘推移している。本当は 5.2.xxx-alpha の様な形 + にするべきなのではないかという気がする。よく分からない。提案しようかとも思っ + たが実際の所は 5.1.x-maint になっている事から、本来は devel branch は既に出 + た version のメンテナンスモードという意味合いだったのかも知れない。然し、こ + の様になっていると次の version かどうかを判定するのに BASH_VERSINFO を利用 + する事ができない。今迄は新しい version になる事によって何か機能が減るなどし + て動かなくなるという事はなかったので余り気にならなかったが、"テスト" という + 観点から本来は早くに bash-5.2 に増やすべきなのではないかという気がする。 + + 差し当たっての ble.sh の側では release status も見て version を上げる様にす + るのが良いだろうか。と思ったが…。自分はテストの為に release を release に + しているし、逆に maint で動かしているユーザーがいたとしても遅くて使い物にな + らない。自分の relstatus に関してはまた別の値を指定するという手もあるのかも + しれない。と思ったが、それをするぐらいであれば実は configure.ac に於いて + version を 5.2 に書き換えてしまえば良いのである。 + + 2023-02-05 これは一回提案したが自分が決めるんだと言って reject された。仕方 + がないんで自分の側で処理する事にする。 + + * 2021-05-03 [対応済み] 5.2 新機能: READLINE_ARGUMENT [#D1934] + + 調べてみると引数が存在している時にのみ定義される様である。また今気づいた事 + だが -x 属性が入っている。 + 2023-02-02 * leakvar: いい加減に pending な leakvar fix を入れる [#D1933] diff --git a/src/util.hook.sh b/src/util.hook.sh index f188e974..7f24ab0c 100644 --- a/src/util.hook.sh +++ b/src/util.hook.sh @@ -321,6 +321,7 @@ function ble/builtin/trap/.read-arguments { case ${arg:i:1} in (l) flags=l$flags ;; (p) flags=p$flags ;; + (P) flags=P$flags ;; (*) ble/util/print "ble/builtin/trap: unknown option \"-${arg:i:1}\"." >&2 flags=E$flags ;; @@ -336,13 +337,16 @@ function ble/builtin/trap/.read-arguments { fi done - if [[ $flags != *[hlpE]* ]]; then + if [[ $flags != *[hlpPE]* ]]; then if [[ $flags != *c* ]]; then flags=p$flags elif ((${#sigspecs[@]}==0)); then sigspecs=("$command") command=- fi + elif [[ $flags == *p* && $flags == *P* ]]; then + ble/util/print "ble/builtin/trap: cannot specify both -p and -P" >&2 + flags=E${flags//[pP]} fi } @@ -609,8 +613,7 @@ function ble/builtin/trap { [[ ! $_ble_attached || $_ble_edit_exec_inside_userspace ]] && ble/base/adjust-BASH_REMATCH - if [[ $flags == *p* ]]; then - + if [[ $flags == *[pP]* ]]; then local -a indices=() if ((${#sigspecs[@]})); then local spec ret @@ -628,8 +631,11 @@ function ble/builtin/trap { local q=\' Q="'\''" index _ble_trap_handler for index in "${indices[@]}"; do if ble/builtin/trap/user-handler#load "$index"; then - local n=${_ble_builtin_trap_sig_name[index]} - ble/util/print "trap -- '${_ble_trap_handler//$q/$Q}' $n" + if [[ $flags == *p* ]]; then + local n=${_ble_builtin_trap_sig_name[index]} + _ble_trap_handler="trap -- '${_ble_trap_handler//$q/$Q}' $n" + fi + ble/util/print "$_ble_trap_handler" fi done else