diff --git a/README-ja_JP.md b/README-ja_JP.md index 12066f73..28f89594 100644 --- a/README-ja_JP.md +++ b/README-ja_JP.md @@ -485,21 +485,21 @@ bleopt input_encoding='C' ## 2.5 ベル -設定 `edit_abell` と設定 `edit_vbell` は、編集関数 `bell` の振る舞いを制御します。 -`edit_abell` が非空白の文字列の場合、音による通知が有効になります (つまり、制御文字の `BEL` (0x07) が `stderr` に出力されます)。 -`edit_vbell` が非空白の文字列の場合、画面での通知が有効になります。既定では音による通知が有効で、画面での通知が無効になっています。 +設定 `edit_bell` は編集関数 `bell` の振る舞いを制御するコロン区切りのリストです。 +値 `abell`, `vbell`, `visual` はそれぞれ対応するベルの提示方法を有効化します。 +値 `abell` は音による通知に対応し、制御文字の BEL (0x07) を `stderr` に出力します。 +値 `vbell` は画面での通知に対応し、端末画面上にメッセージを表示します。 +値 `visual` は画面の反転に対応し、DECSCNM を用いて端末画面を瞬間的に反転します。 +既定では音による通知のみが有効になっています。 設定 `vbell_default_message` は画面での通知で使用するメッセージ文字列を指定します。既定値は `' Wuff, -- Wuff!! '` です。 設定 `vbell_duration` は画面での通知を表示する時間の長さを指定します。単位はミリ秒です。既定値は `2000` です。 +設定 `vbell_align` は画面での通知の表示位置を指定します。`left`, `center`, `right` が指定できます。 -例えば、画面での通知は以下のように設定・有効化できます: -```bash -bleopt edit_vbell=1 vbell_default_message=' BEL ' vbell_duration=3000 -``` +例えば、以下の設定によって、音による通知を無効化して画面での通知を設定・有効化できます。 -もう一つの例として、音による通知は以下の様にして無効化できます。 ```bash -bleopt edit_abell= +bleopt edit_bell=vbell vbell_{default_message=' BEL ',duration=3000,align=right} ``` ## 2.6 着色の設定 diff --git a/README.md b/README.md index 27d32621..7411f947 100644 --- a/README.md +++ b/README.md @@ -501,18 +501,28 @@ bleopt input_encoding='C' ## 2.5 Bell -The options `edit_abell` and `edit_vbell` control the behavior of the edit function `bell`. If `edit_abell` is a non-empty string, the audible bell is enabled, i.e. ASCII Control Character `BEL` (0x07) will be written to `stderr`. If `edit_vbell` is a non-empty string, the visual bell is enabled. By default, the audible bell is enabled while the visual bell is disabled. +The option `edit_bell` controls the behavior of the edit function (widget) +called `bell`. It is a colon-separated list of the values `vbell`, `abell`, +and `visual`. When a value is contained, the corresponding type of the bell is +enabled. The value `abell` corresponds to the audible bell, which prints ASCII +Control Character BEL (0x07) will be written to `stderr`. The value +`vbell` corresponds to the visible bell, which shows the message in the +terminal display. The value `visual` corresponds to the visual bell, which +flashes the terminal screen by turning on the DECSCNM mode for a +short moment. By default, only the audible bell is enabled. + +The option `vbell_default_message` specifies the default message shown by the +visual bell. The default value of this setting is `' Wuff, -- Wuff!! '`. The +option `vbell_duration` specifies the display duration of the visual-bell +message. The unit is a millisecond. The default value is `2000`. The option +`vbell_align` specifies the position of `vbell` by `left`, `center`, or +`right`. + +For example, the audible bell can be disabled, and the visual bell can be set +up as: -The option `vbell_default_message` specifies the message shown as the visual bell. The default value is `' Wuff, -- Wuff!! '`. The option `vbell_duration` specifies the display duration of the visual-bell message. The unit is a millisecond. The default value is `2000`. - -For example, the visual bell can be enabled as: -``` -bleopt edit_vbell=1 vbell_default_message=' BEL ' vbell_duration=3000 -``` - -For another instance, the audible bell is disabled as: -``` -bleopt edit_abell= +```bash +bleopt edit_bell=vbell vbell_{default_message=' BEL ',duration=3000,align=right} ``` ## 2.6 Highlight Colors diff --git a/ble.pp b/ble.pp index d7260736..97f1cee2 100644 --- a/ble.pp +++ b/ble.pp @@ -2581,16 +2581,24 @@ function ble/base/unload { ble/base/adjust-bash-options ble/base/adjust-BASH_REMATCH + # src/edit.sh + ble-edit/bind/clear-keymap-definition-loader + ble/widget/.bell/.clear-DECSCNM + + # decode.sh + ble/decode/keymap#unload + + # src/util.sh ble/term/stty/TRAPEXIT "$1" ble/term/leave ble/util/buffer.flush blehook/invoke unload - ble/decode/keymap#unload - ble-edit/bind/clear-keymap-definition-loader ble/builtin/trap/finalize "$1" ble/util/import/finalize + + # main ble/base/clean-up-runtime-directory finalize - ble/fd#finalize + ble/fd#finalize # this is used by the above function ble/base/clear-version-variables return 0 } 0<&"$_ble_util_fd_tui_stdin" 1>&"$_ble_util_fd_tui_stdout" 2>&"$_ble_util_fd_tui_stderr" diff --git a/blerc.template b/blerc.template index 1839c6d5..1b88970e 100644 --- a/blerc.template +++ b/blerc.template @@ -65,11 +65,15 @@ ## Line editor settings -## The following settings turns on/off the audible bells and visible bells for -## errors while user edit. The non-empty value turns on the bells. - -#bleopt edit_abell=1 -#bleopt edit_vbell= +## This option controls the behavior of the bell in the line editing by +## colon-separated values. When "abell", "vbell", and "visual" are contained, +## the audible bells, the visible bells, and the visual bells are enabled. The +## audible bell sends BEL to the terminal. The visible bell shows the message +## on the terminal display. The visual bell is the GNU-Screen style bell that +## flashes the terminal display by turning on DECSCNM in a short moment. Old +## settings "edit_vbell" and "edit_abell" should be updated to use "edit_bell". + +#bleopt edit_bell=abell ## The following setting turns on the delayed load of history when an non-empty diff --git a/note.txt b/note.txt index b82f8fb7..4e34c8c0 100644 --- a/note.txt +++ b/note.txt @@ -7392,6 +7392,20 @@ bash_tips Done (実装ログ) ------------------------------------------------------------------------------- +2024-06-20 + + * vbell: edit_vbell edit_abell の設定を統合する [#D2229] + + * visible bell vs visual bell? ソースコード上は全て visible になっている。 + audible と対象になっている。一方で wiki では visual bell になっている。元 + の GNU Screen では visual bell である。 + + * DECSCNM を使った反転にも対応する? これを visual と名付けるのでも良い気が + する。これについては visible + + これまで visual/visible としていたのは visible に統一する事にして、新しいベ + ルの形式として GNU screen と同様の方法を用いる visual を導入する事にした。 + 2024-06-19 * vbell: panel 内部に表示する (requested by bb010g) [#D2228] diff --git a/src/edit.sh b/src/edit.sh index e6142923..d19fadc9 100644 --- a/src/edit.sh +++ b/src/edit.sh @@ -31,21 +31,45 @@ # 1 追加入力欄 # 2 infobar -## @bleopt edit_vbell -## 編集時の visible bell の有効・無効を設定します。 -## bleopt_edit_vbell=1 -## 有効です。 -## bleopt_edit_vbell= -## 無効です。 -bleopt/declare -v edit_vbell '' - -## @bleopt edit_abell -## 編集時の audible bell (BEL 文字出力) の有効・無効を設定します。 -## bleopt_edit_abell=1 -## 有効です。 -## bleopt_edit_abell= -## 無効です。 -bleopt/declare -v edit_abell 1 +## @bleopt edit_bell +## A colon-separated list of fields to control the behavior of the bell in +## line editing. +## +## @opt vbell +## When this is specified, the visible bell (vbell) is enabled for the edit +## bell. The message is shown in the position specified by "bleopt +## vbell_align" +## +## @opt abell +## When this is specified, the audible bell (abell) is enabled for the edit +## bell. The event is notified by printing BEL to the terminal. +## +## @opt visual +## When this is specified, the visual bell in the GNU Screen style is +## enabled for the edit bell. The event is notified by flashing the screen +## by DECSCNM. +## +bleopt/declare -v edit_bell 'abell' +bleopt/declare -v edit_vbell '[obsolute: use edit_bell=vbell]' +bleopt/declare -v edit_abell '[obsolute: use edit_bell=abell]' +function bleopt/obsolete:edit_vbell { return 0; } +function bleopt/obsolete:edit_abell { return 0; } +function bleopt/check:edit_vbell { + if [[ $value ]]; then + ble/opts#append-unique bleopt_edit_bell vbell + else + ble/opts#remove bleopt_edit_bell vbell + fi + value=$bleopt_edit_vbell +} +function bleopt/check:edit_abell { + if [[ $value ]]; then + ble/opts#append-unique bleopt_edit_bell abell + else + ble/opts#remove bleopt_edit_bell abell + fi + value=$bleopt_edit_abell +} ## @bleopt history_lazyload ## bleopt_history_lazyload=1 @@ -4792,12 +4816,34 @@ function ble-decode/keymap:yankpop/define { # **** bell **** @edit.bell +_ble_term_DECSCNM_state= + function ble/widget/.bell { - [[ $bleopt_edit_vbell ]] && ble/term/visible-bell "$1" - [[ $bleopt_edit_abell ]] && ble/term/audible-bell + [[ :$bleopt_edit_bell: == *:vbell:* ]] && ble/term/visible-bell "$1" + [[ :$bleopt_edit_bell: == *:abell:* ]] && ble/term/audible-bell + + if [[ :$bleopt_edit_bell: == *:visual:* ]]; then + ble/util/buffer $'\e[?5h' + ble/util/buffer.flush + _ble_term_DECSCNM_state=1 + if ble/is-function ble/util/idle.push; then + ble/util/idle.push --sleep=50 ble/widget/.bell/.clear-DECSCNM + else + ble/util/msleep 50 + ble/widget/.bell/.clear-DECSCNM + fi + fi + return 0 } +function ble/widget/.bell/.clear-DECSCNM { + [[ $_ble_term_DECSCNM_state ]] || return + _ble_term_DECSCNM_state= + ble/util/buffer $'\e[?5l' + ble/util/buffer.flush +} + # blehook/declare widget_bell (defined in def.sh) function ble/widget/bell { ble-edit/content/clear-arg