やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Vim等Linux端末はCtrl+Sでフリーズする。Ctrl+Qで復旧せよ

 Linux端末上における罠。フリーズというより出力停止。テレプリンタ時代のコマンド。

問題

 Vimを使っているとしばしばフリーズすることがあった。原因不明。メモリ不足でもないはず。今までは端末のタブを閉じて強制終了していた。

原因

 なんとLinuxの端末でCtrl+Sキーは出力を停止するコマンドだった。じつはディスプレイに出力されないだけで入力は受け付けているらしい。だが出力されないため、フリーズしたように見える。

 Ctrl+SWindowsでいう「保存(save)」のショートカットキーとしてよく使われている。まちがって押してしまうことがあるかもしれない。

起源

 そもそも、出力停止コマンドとは何か? 出力停止したい時などあるのか?

 どうやらこのコマンドの起源はテレプリンタらしい。かつてはディスプレイでなくプリンタで出力していた。いちいち出力を一時停止して確認していたようだ。

 現代ではディスプレイなので、まったく使う機会がないはず。それほど前時代的なコマンドらしい。もう歴史の勉強をしているような気分。

解決

 Ctrl+Qで出力再開できる。

永久解決

 そもそも出力停止コマンドを無効化したいなら以下。

~/.bashrc

[[ -t 0 ]] && { stty stop undef; stty start undef; }

 .bashrcファイルに上記を追記する。コードの意味は以下。

code 意味
[[ -t 0 ]] 標準入力がオープンしているとき
stty stop undef Ctrl+Sによる出力停止が無効化
stty start undef Ctrl+Qによる出力再開が無効化

 試しにvimCtrl+Sを入力するとフリーズしなくなった。文字入力モードだと^Sと入力されたが。

所感

 こんな罠があるとは知らなかった。ASCII文字コードの制御コードといい、コンピュータの基礎技術にはすでに使われなくなった前時代的なコマンドが多数ある。

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux