Edited at
VimDay 25

Vimのtermios制御におけるCBREAK modeの導入

More than 3 years have passed since last update.

この記事はVim Advent Calendar 2015の25日目の記事です。

今日は地味な話ですが、Vimのtermios制御において、CBREAK modeを導入したい、という主張をさせて下さい。

みなさんは、POSIX端末版のVimを起動した際に、例えば下図のような変な出力が画面に出てきてしまって嫌な思いをしたことがありませんか?

xterm

こういう現象がなぜ起きるかというと、Vimのtermios制御(TTYドライバに対する制御)がヘボいからです。

Vimは基本的にRAW Mode(端末は制御文字でシグナルを生成せず、入力はエコーバックされず、バッファリングされない)で動作しているのですが、たまにCOOKED Mode(<C-c>等の制御文字でシグナルを生成し、入力はエコーバックし、バッファリングされる)で動くことがあります。

例えば、サスペンド時やvim scriptのsystem()をコールした時などです。

Vimはこの2つの端末モードを巧妙に切り変えているのですが、端末モードが2つだけしかないことで、ちょっと無理が生じています。

たとえば、vim scriptでsystem()関数が呼ばれると同時に、キー入力を受け取ってしまうと端末にゴミが表示される、という問題があります。(それを隠すために無駄にRedrawする処理を入れることがあったりして、美しくありません)

そこで、RAWとCOOKEDの中間のCBREAK Mode(端末はシグナル生成し、入力はエコーバックせず、バッファリングされない)を導入することを提案してみました。

詳細は、vim_devへ投稿したパッチをご欄頂きたいのですが、地味なパッチのせいかなかなか試してくれる方が現れず、しばらく進展がありません。

普段、入力のエコーバックを微妙なタイミング制御で回避するなどの工夫をされているプラグイン作者の方に、是非お試し頂きたいパッチです。

また、たとえばtcap queryをせっかく真面目に実装した端末があるのに、そのユーザが不具合に遭遇して損をするという状況になっていますので、早めに改善をして頂きたい案件だと思っています。