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