:set visualbell の時に画面フラッシュが発生しない #1026

Closed
ryunix opened this Issue Feb 8, 2017 · 29 comments

Comments

Projects
None yet
6 participants
@ryunix
Member

ryunix commented Feb 8, 2017

質問・報告の内容

まず、仕様整理をさせてください。
:set novisualbell の時に h キーを押し続けるなどでこれ以上カーソルが移動できない時にビープ音がなります。
このビープ音を画面フラッシュにする設定が :set visualbell だと理解しています。

この理解が正しい時、:set visualbell の時に画面フラッシュが発生しません。

起動時の t_vb の値は t_vb=^[[?5h$<100/>^[[?5l になっていました。
:help 'visualbell' にある通りの値である <Esc>|f を設定してみようと思いましたが、入力方法がよく分からず試せていません。(CTRL-V_CTRL-[ の後に |f を入力し、:set t_vb? すると ^[ だけになっている...)

Vimのバージョン

8.0.0314 (MacVim)

OSの種類/ディストリ/バージョン

  • macOS Sierra

使用している or 関係していそうなプラグイン

なし

その他

使用している端末エミュレータは Terminal.app です。
環境変数 TERM は xterm-256color になっています。
gVim でも確認しましたが結果は同じでした。(起動時の t_vb の値は ^[|f になっていました)

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Feb 9, 2017

Member

私の環境では画面フラッシュしました。

$ vim -Nu NONE +"set vb"

して k を入力で

環境:
CUI Vim 8.0.0314 on fedora 25 via PuTTY
TERMはxterm-256color
t_vbの値も同じでした。

Terminal.app の設定かなにかあるんですかね?よく知らんけど
これの逆を設定すればいいのかな?
How to disable flashing terminal in Mac OS

Member

h-east commented Feb 9, 2017

私の環境では画面フラッシュしました。

$ vim -Nu NONE +"set vb"

して k を入力で

環境:
CUI Vim 8.0.0314 on fedora 25 via PuTTY
TERMはxterm-256color
t_vbの値も同じでした。

Terminal.app の設定かなにかあるんですかね?よく知らんけど
これの逆を設定すればいいのかな?
How to disable flashing terminal in Mac OS

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

http://stackoverflow.com/questions/11657000/how-to-get-a-visual-bell-in-vim-on-mac

iTerm2.app とか Terminal.app とかは設定しないと駄目っぽいですがどうでしょう?

Member

mattn commented Feb 9, 2017

http://stackoverflow.com/questions/11657000/how-to-get-a-visual-bell-in-vim-on-mac

iTerm2.app とか Terminal.app とかは設定しないと駄目っぽいですがどうでしょう?

@ryunix

This comment has been minimized.

Show comment
Hide comment
@ryunix

ryunix Feb 9, 2017

Member

ありがとうございます。
Terminal.app の設定を見直しましたが、ビジュアルベルを使用する設定になっていました。(既定値)
ただ、「消音時のみ」と言う気になるチェックボックスがあったので外してみましたが変わらずダメでした。
ちなみに、シェルで <BS> 連打によるこれ以上消せないよと言う時には画面フラッシュが発生しました。

2017-02-09 9 43 58

Member

ryunix commented Feb 9, 2017

ありがとうございます。
Terminal.app の設定を見直しましたが、ビジュアルベルを使用する設定になっていました。(既定値)
ただ、「消音時のみ」と言う気になるチェックボックスがあったので外してみましたが変わらずダメでした。
ちなみに、シェルで <BS> 連打によるこれ以上消せないよと言う時には画面フラッシュが発生しました。

2017-02-09 9 43 58

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Feb 9, 2017

Member

念のため確認します。MacVimを-Nu NONE +"set vb"なコマンドライン引数で起動しても結果は同じでした?

Member

h-east commented Feb 9, 2017

念のため確認します。MacVimを-Nu NONE +"set vb"なコマンドライン引数で起動しても結果は同じでした?

@ryunix

This comment has been minimized.

Show comment
Hide comment
@ryunix

ryunix Feb 9, 2017

Member

はい、それで起動させています。

Member

ryunix commented Feb 9, 2017

はい、それで起動させています。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

@ryunix 端末で echo -e "\a" 実行するとどうなりますか?

Member

mattn commented Feb 9, 2017

@ryunix 端末で echo -e "\a" 実行するとどうなりますか?

@ryunix

This comment has been minimized.

Show comment
Hide comment
@ryunix

ryunix Feb 9, 2017

Member

@mattn 画面フラッシュが発生しました。

Member

ryunix commented Feb 9, 2017

@mattn 画面フラッシュが発生しました。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

なるほど、vim で bell ってない可能性が出てきましたね。

Member

mattn commented Feb 9, 2017

なるほど、vim で bell ってない可能性が出てきましたね。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Feb 9, 2017

Member

試しに let &t_vb = "\<Esc>[?5h$<2000/>\<Esc>[?5l" としてみたら、<BS> 入力(visual bell 契機)から2秒後に CSI ?5h CSI ?5l がまとめて送られるという動作になっていました。
本来 CSI ?5h (画面色反転) 2秒後 CSI ?5l (戻す) となるべきところ、待機時間の発生位置がおかしいため、色反転が実行されてない (or 短すぎる) と思われます。

Terminal.app on macOS Sierra で確認

Member

ichizok commented Feb 9, 2017

試しに let &t_vb = "\<Esc>[?5h$<2000/>\<Esc>[?5l" としてみたら、<BS> 入力(visual bell 契機)から2秒後に CSI ?5h CSI ?5l がまとめて送られるという動作になっていました。
本来 CSI ?5h (画面色反転) 2秒後 CSI ?5l (戻す) となるべきところ、待機時間の発生位置がおかしいため、色反転が実行されてない (or 短すぎる) と思われます。

Terminal.app on macOS Sierra で確認

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Feb 9, 2017

Member

vim は t_vb 送っているだけなので、端末側の問題かも。

Member

ichizok commented Feb 9, 2017

vim は t_vb 送っているだけなので、端末側の問題かも。

@ryunix

This comment has been minimized.

Show comment
Hide comment
@ryunix

ryunix Feb 9, 2017

Member

んんー、なるほど...?
Terminal.app を使っている限りはどうしようもないってことですかね。

Member

ryunix commented Feb 9, 2017

んんー、なるほど...?
Terminal.app を使っている限りはどうしようもないってことですかね。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

バッファに入ってフラッシュしてないのかな。Terminal.app

Member

mattn commented Feb 9, 2017

バッファに入ってフラッシュしてないのかな。Terminal.app

@saitoha

This comment has been minimized.

Show comment
Hide comment
@saitoha

saitoha Feb 9, 2017

Member

このくらいならttyドライバでバッファリングすると思います。
ttyをselect(2)する時に、だいたい1024とか4096byteとかで取ってくるので、
溢れない限りはtimevalで指定した時間待つんじゃないでしょうか。

なお、termiosのVMIN/VTIMEはキー入力の読み出しタイミングに影響する確かめたことがありますが、
出力にどう影響するかどうかは理解していません。

Member

saitoha commented Feb 9, 2017

このくらいならttyドライバでバッファリングすると思います。
ttyをselect(2)する時に、だいたい1024とか4096byteとかで取ってくるので、
溢れない限りはtimevalで指定した時間待つんじゃないでしょうか。

なお、termiosのVMIN/VTIMEはキー入力の読み出しタイミングに影響する確かめたことがありますが、
出力にどう影響するかどうかは理解していません。

@saitoha

This comment has been minimized.

Show comment
Hide comment
@saitoha

saitoha Feb 9, 2017

Member

溢れない限りはtimevalで指定した時間待つんじゃないでしょうか。

・・・という仕様でしたっけ、select(2)。すいません、たぶん違いますね。

Member

saitoha commented Feb 9, 2017

溢れない限りはtimevalで指定した時間待つんじゃないでしょうか。

・・・という仕様でしたっけ、select(2)。すいません、たぶん違いますね。

@saitoha

This comment has been minimized.

Show comment
Hide comment
@saitoha

saitoha Feb 9, 2017

Member

どちらにせよ、今のvimの出し方だと一回のバッファ読み出しでもらうことになるので
今のt_vbの設定で意図した通り動く端末はまず無いんじゃないかと思うんですよね・・・

Member

saitoha commented Feb 9, 2017

どちらにせよ、今のvimの出し方だと一回のバッファ読み出しでもらうことになるので
今のt_vbの設定で意図した通り動く端末はまず無いんじゃないかと思うんですよね・・・

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

つまり2回に分けて書けと

Member

mattn commented Feb 9, 2017

つまり2回に分けて書けと

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Feb 9, 2017

Member

t_vb$<100/> は誰が解釈しているのだろう?

Member

k-takata commented Feb 9, 2017

t_vb$<100/> は誰が解釈しているのだろう?

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Feb 9, 2017

Member

詳しく見たら、待機はここの tputs の中で起こってました。
https://github.com/vim/vim/blob/65189a129/src/term.c#L2532
で、tputs(t_vb, 1, out_char_nf) すると out_buf には \e[?5h\e[?5l が書き出されて、それが write される。
他の環境では tputs 後の out_buf はどうなるんでしょうか?
\e[?5h + (何か sleep 的な処理?) + \e[?5l になるのか、あるいは tputs の中で visual bell してしまうとか?

Member

ichizok commented Feb 9, 2017

詳しく見たら、待機はここの tputs の中で起こってました。
https://github.com/vim/vim/blob/65189a129/src/term.c#L2532
で、tputs(t_vb, 1, out_char_nf) すると out_buf には \e[?5h\e[?5l が書き出されて、それが write される。
他の環境では tputs 後の out_buf はどうなるんでしょうか?
\e[?5h + (何か sleep 的な処理?) + \e[?5l になるのか、あるいは tputs の中で visual bell してしまうとか?

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

しかしながら xterm の terminfo の flush が既に \E[?5h$<100/>\E[?5l, だからなー。これは端末の不具合としか思えないな。

Member

mattn commented Feb 9, 2017

しかしながら xterm の terminfo の flush が既に \E[?5h$<100/>\E[?5l, だからなー。これは端末の不具合としか思えないな。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Feb 9, 2017

Member

http://invisible-island.net/ncurses/man/terminfo.5.html#h3-Types-of-Capabilities
tputs("$<...>", ...) で millisecond delay がかかるということですか。

Member

ichizok commented Feb 9, 2017

http://invisible-island.net/ncurses/man/terminfo.5.html#h3-Types-of-Capabilities
tputs("$<...>", ...) で millisecond delay がかかるということですか。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Feb 9, 2017

Member

で、tputs(t_vb, 1, out_char_nf) すると out_buf には \e[?5h\e[?5l が書き出されて、それが write される。

最初に(tputs 経由で1文字ずつ) out_char_nf が呼ばれて \e[?5h を出力、その後 tputs の中でwaitが入り、その後 out_char_nf が呼ばれて \e[?5l を出力。
ただし、out_char_nf の中で flush していないので、実際にはwaitの後で \e[?5h\e[?5l がまとめて端末に出力されてしまうということですね。

なので、t_vb を出力するときは1文字ずつ flush するようにすれば、flash するようになるのではないかと。

Member

k-takata commented Feb 9, 2017

で、tputs(t_vb, 1, out_char_nf) すると out_buf には \e[?5h\e[?5l が書き出されて、それが write される。

最初に(tputs 経由で1文字ずつ) out_char_nf が呼ばれて \e[?5h を出力、その後 tputs の中でwaitが入り、その後 out_char_nf が呼ばれて \e[?5l を出力。
ただし、out_char_nf の中で flush していないので、実際にはwaitの後で \e[?5h\e[?5l がまとめて端末に出力されてしまうということですね。

なので、t_vb を出力するときは1文字ずつ flush するようにすれば、flash するようになるのではないかと。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Feb 9, 2017

Member

私の環境でvisualbell動作するのPuTTYだけでした。
TeraTermとGNOME terminalはvisualbell動作しない。

TeraTermはキー押しっぱなしにするとたまに画面フラッシュします。
GNOME terminalはまったく画面フラッシュしない。特に設定とかなさそうでした。

Member

h-east commented Feb 9, 2017

私の環境でvisualbell動作するのPuTTYだけでした。
TeraTermとGNOME terminalはvisualbell動作しない。

TeraTermはキー押しっぱなしにするとたまに画面フラッシュします。
GNOME terminalはまったく画面フラッシュしない。特に設定とかなさそうでした。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

@k-takata wait の前にだけ flush 入れるので良さそうですがどうでしょう?

Member

mattn commented Feb 9, 2017

@k-takata wait の前にだけ flush 入れるので良さそうですがどうでしょう?

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Feb 9, 2017

Member

tputs 中から、コールバックで out_char_nf が1文字ずつ呼ばれるわけですが、wait直前の文字であることの判定はできないのではないかと。

Member

k-takata commented Feb 9, 2017

tputs 中から、コールバックで out_char_nf が1文字ずつ呼ばれるわけですが、wait直前の文字であることの判定はできないのではないかと。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Feb 9, 2017

Member

なるほど(コード読んで無いのがバレた)

Member

mattn commented Feb 9, 2017

なるほど(コード読んで無いのがバレた)

@k-takata k-takata added the kind/bug label Feb 12, 2017

@ichizok

This comment has been minimized.

Show comment
Hide comment
Member

ichizok commented May 15, 2017

https://github.com/vim/vim/compare/master...ichizok:fix/visualbell.diff
out_str_cf() を作って $<..> を特別扱い

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata May 17, 2017

Member

out_char_flush みたいなのを作って一文字ずつ flush させるしかないかなと考えていたのですが、確かに $< を自前で解析すれば、バッファリングを活用できますね。いいと思います。

Member

k-takata commented May 17, 2017

out_char_flush みたいなのを作って一文字ずつ flush させるしかないかなと考えていたのですが、確かに $< を自前で解析すれば、バッファリングを活用できますね。いいと思います。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Jun 23, 2017

Member

投げました。
vim/vim#1789

Member

ichizok commented Jun 23, 2017

投げました。
vim/vim#1789

@ichizok

This comment has been minimized.

Show comment
Hide comment
Member

ichizok commented Jun 28, 2017

8.0.0683
vim/vim@2e147ca

@ichizok ichizok closed this Jun 28, 2017

@ichizok ichizok added the xlose/fixed label Jun 28, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment