Visible bell mini-Howto Alessandro Rubini
rubini@linux.it
JF Project 日本語訳
JF@linux.or.jp
v2.2, 11 November 1997 この文書では、termcap を使って、ビープ音を鳴らさずに視覚的に知らせる (visible bell) ようシステムを設定する方法を説明します。また、必要に応じて ビープ音自体を消す方法についても紹介しています。
<!--Introduction-->はじめに Linux コンソールドライバは、BEL 文字 (ASCII code 7) を出力する際、 いつもビープ音を鳴らすようになっています。これは初期設定での振舞い としては問題ないのですが、ユーザのなかには、コンピュータのビープ音を 鳴らさないようにしたいと思っている人も多いでしょう。この mini-HOWTO は、アプリケーションに BEL コードを出力しないよう指示する方法を説明 するものです。また、カーネルや X Window System を設定して、BEL 文字の 出力の際にビープ音を鳴らさないようにする方法も説明しています。ただ、 この文書は、テキストコンソールに関する説明が大半となっています。X サーバ の設定は、グラフィック環境を使っているユーザ向けに、付け足し程度しか 説明していないので、ご了承ください。 思うに、何かと面倒なことが多いコンピュータを思い通りに動かす最良の 方法は、ハードウェア段階で対処することです。(ビープ音の嫌いなわたしは) コンピュータからスピーカ自体を取り外しています。 <!--Spekearectomy-->スピーカを取り外す スピーカを外科的に取り外す (Speakerectomy 訳注: Speakerectomy について著者からの説明です。
Alessandro Rubini Speakerectomy is a neologism, an invented word. Taken from the surgical vocabulary, - ctomy means cut-and-remove. It's (loud)speaker removal -- by cutting wires. ( Speakerectomy という言葉は、私が勝手に作った造語です。 外科的な言葉に由来します。-ctomy というのは、切断し、取りはずすこと を意味します。つまり、接続線を切断してスピーカーを撤去することです。)
) こと、それがビープ音の問題を解決するのに最も賢明な手段です。 これは、字義通り、ビープ音の発生源を取り外すことでビープ音が 鳴らないようにするわけです。この手術は回りくどさがなく、 麻酔すら不要ですが、ただ、安直な方法ではあるので洗練の余地はあります。
通常、PC には、CPU を低速にするためのあまり役に立たないシステムクロック 切り替えスイッチが付いています。このスイッチは、マルチタスク環境で動かす ような場合には、全く使用されません。ソフトウェアループでタイミングを 取っている古い DOS ゲームを低速で動かすような場合ですら、もはや使われて いません。残念ながらこのスイッチを使ってプロセッサ速度を上げることは できませんが、これを転用してスピーカ の有効無効を切り替えることができます。確かに、ビープ音が役立つ場合も あります。静かで高速なマシンを使っていて、例えば、長時間のコンパイルの 終了時をビープ音で知らせるといった際には、スピーカが役立つこともある でしょう。このスイッチの機能を変更するには、メインボードからそれを 取り外して、配線をスピーカと直列に接続するだけです。 (訳注:この文書は、1997 年に書かれています。現在では、多少事情が 違うと思われるので、ご注意ください) ラップトップを使っている場合は、残念ながら、スピーカにアクセスすることは 簡単ではありませんし、余分なスイッチを使って別の目的に転用するようなこと もできません。そうしたユーザにとって、よりよい解決策は、ソフトウェア上で 設定を行ってビープ音を消すことです。そうした方法を以下で説明します。
<!--Per-console Beep Configuration--> コンソールごとにビープ音の音色を変える Linux 1.3.43 では、Martin Mares が、console.c の変更 によって、ビープ音のピッチと持続時間を設定できる機能を追加しました。 コンソールごとに、異なるピッチと持続時間の音色でビープ音を鳴らすよう 設定することが可能です。このタスクの実行には、コンソールデバイスに送られる エスケープシーケンスが使われています。~/.profile~/.login ファイルの設定により、別々のビープ 音を個々のコンソールで鳴らすことができます(また、必要に応じて、ビープ音を 消すこともできます)。 エスケープシーケンスは、次のような働きをします。 ESC-xx により、ヘルツ(Hz)単位で ビープ音の周波数を設定します。この値は、21-32766 の範囲でなければならず、 それ以外の値は未定義と解釈されます。引数 xx が定義されていない場合、例えば ESC- となっているような場合は、デフォルト値 (750Hz) が 適用されます。 ESC-xx により、ミリ秒単位でビープ音 の持続時間を設定します。2 秒以上を指定すると、デフォルト値 (125ms) が適用 されます。上記同様、引数 xx が定義されていない場合 (ESC- )、デフォルト値が使われます。 例えば、50Hz のピッチで一秒間持続させたい場合、bash なら、 " echo -e "\\33[10;50]\\33[11;1000]" " と なります (訳注:このコマンドは、X 用ではなく、ターミナル用です。 テキスト端末画面で上記コマンドを打ち、Ctrl-G でそのビープ音を鳴らすことが できます。X 用の設定は、こちらをご覧 ください。) 。("" は、エスケープシーケンスを理解せよという 意味です。tcsh の場合でも、コマンドスペルは同じです。) setterm コマンドにこのような設定をサポートするバージョンが あるかどうかは知りませんが、将来的には setterm のコマンド ラインオプションでビープ音の設定ができようになるだろうと思います。 Linux カーネル 1.3.43 以降を使っているなら、このエスケープシーケンスを 使った設定を行えば充分なので、本書をこれ以上読む必要はないでしょう。 もし、それ以前のカーネルを使っているか、もしくはビープ音を視覚的に表現させ ようと思うなら、次章以下がお役に立ちます。 <!--Basic Concepts About Termcap and Terminfo--> termcap と terminfo の基本概念 /etc/termcap ファイルは、ターミナルの機能 ( terminal capability ) を 列記したテキストファイルです。多くのアプリケーションが termcap ファイルを使って、スクリーン上でのカーソル移動やその他の スクリーン関係の処理を行っています。tcsh bashvi 等、すべてのカーソルベースの アプリケーションは、termcap データベースを使用して います。 termcap データベースには、各種のターミナルタイプが 記述されています。実行時には、環境変数 TERM によって ターミナルの振る舞いが選択されます。これは、termcap の エントリのひとつを指定することで、アプリケーションがそこに記述されたデータ を利用するという仕組みになっています。 このデータベース内では、ターミナルの個々の機能が、二文字のコードと、 必要な効果を得るための実際のエスケープシーケンスとで表記されています。 異なる機能を区別する際には、分離用の文字としてコロン (":") が使われています。 例えば、ビープ音は、"bl" というコードで表記され、通常は、" bl=ˆG " というふうに記載されます。このシーケンスの意味は、 Ctrl-G という文字 (ASCII BEL) を出力する際にビープ音を鳴らすというものです。 bl 機能に加えて、vb 機能というのが あります。これが、ビープ音を視覚的に表す (visible bell) 際に 使われるコードです。ただ、vb は、通常、termcap ファイルの linux エントリには記述されて いません。 最近のアプリケーションやライブラリでは、termcap の かわりに terminfo が使われています。 terminfo データベース では、ターミナルタイプごとにひとつのファイルを使うようになっていて、 それらは /usr/lib/terminfo 以下に置かれています。 そして、ディレクトリ構造を分かり易くするために、それぞれのターミナルタイプ の記述ファイルは、そのターミナル名の頭文字の付いたディレクトリ内に保存 されています。それゆえ、linux エントリは、 /usr/lib/terminfo/l/linux ファイルとなります。 terminfo エントリを構築するには、termcap の記述ファイルを「コンパイル」する必要があります。詳細は、tic プログラムとそのマニュアルページをご覧ください。 <!--Defining a Visible Bell-->ビープ音を視覚化する termcap ファイルに vb 機能の エントリーがまだ定義されていない場合は、自分でエントリを追加することが できます。これは Dennis Henriksen (duke@diku.dk) からの提案なのですが、 以下の行を termcap ファイルの linux エントリ内に書き込むことで、vb 機能が利用可能になります (古いディストリビューションでは、この linux エントリが console という名前になっている ので、注意してください)。 :vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\ 行末のバックスラッシュは、データベース内での改行をエスケープするための ものです。上記 Dennis のコードは、(彼の言によると)次の機能を持つそうです。 (安全策として)カーソル位置を保存する 背景色と対になる色を使って、背景を数回点滅させる カーソル位置を元に戻す <!--Disabling the Audible Bell on the Text Console--> テキストコンソールのビープ音を消す コンソール上でビープ音の視覚化を強制したい場合は、termcap ファイルの bl エントリの部分を前章の vb の文字列に置き換えてください。アプリケーションごとのカスタマイズ を望まないなら、このアプローチは非常に手軽な方法です (アプリケーションごと のカスタマイズは、次章で説明します)。わたしは、スピーカの取り外しができない Linux マシンには、すべてこのオプションを使っています。 <!--Telling Applications to Avoid Beeping--> アプリケーションのビープ音を消す この章では、 (termcapterminfo に記述されている情報を使って) ターミナルタイプを判断しているアプリケーション のうち、 vb エントリを使うよう指示することが可能なものを いくつかを取り上げて説明します。 X サーバ:X サーバでは、"xset b" コマンドを使ってビープ音の 音色を調整します。このコマンドは、「ボリューム」「ピッチ」「持続時間」という 3 つ数値の引数を取ります (訳注:例えば、"xset b " など。) 。また、"xset -b" で、ビープ音を 無効にできます。この X サーバの設定は、ディスプレイ上で動作するすべての アプリケーションに影響を与えます。 xterm: xterm can convert each bell to either a visible or audible signal. If you use the audible bell, the settings of "xset" will apply. The bell in xterm defualts to be audible, but you can use the "-vb" command line option and the "xterm*visualBell: true" resource to turn it to a visible flash. You can toggle visible/audible signaling at run-time by using the menu invoked by control--left-mouse-button. If you run X you most likely won't need the following information. ]]> xterm:xterm は、BEL 文字を聴覚信号か視覚信号かの どちらにでも変換することができます。聴覚信号(ビープ音)を使う場合は、 上記の xset コマンドでの設定方法がそのまま当てはまり ます。xterm での初期設定は聴覚信号になっていますが、 コマンドラインオプションで "" を指定するか、リソース (訳注:~/.Xresources の意味と思われます) に "xterm*visualBell: true と記述することで、 画面をフラッシュさせる視覚信号に変更できます。また、実行中でも Control--left-mouse-button で聴覚信号と視覚信号を切り替えることができます。 X を実行しているのなら、おそらくこれらの情報があれば、以下の説明は不用 だと思われます。 tcsh (6.04 以降):"set visiblebell" としてください。この設定は、.cshrc に記述することも できますし、手動で打ち込んでもかまいません。元のビープ音に戻す際は、 "unset visiblebell" とします。シグナルを一切消す場合は、 "set nobeep" を使います。 bash (著者の知る限り、バージョンを問いません): "set bell-style visible~/.bashrc に記述してください。bell-style のオプションは、これ以外にも "none" と "audible" があります。 bash (readline を使っている bash、 および readline ベースのすべてのアプリケーション): "set prefer-visible-bell" を ~/.inputrc に記述します。 nvielvis: "set flash" を ~/.exrc に記述するか、 ":set flash" (コロンが必要です)を手動で打ち込んでください。 視覚効果を無効にする場合は、flash の部分を noflash に変更して使ってください。 emacs:"(setq visible-bell t)" を ~/.emacs に記述します。無効にするには、" (setq visible-bell nil) とします。 less:コマンドラインで "" オプションを 付けるとビープ音を視覚化でき、"" オプションでシグナル自体 を無効にできます。初期設定を環境変数 LESS に設定しておく ことが可能です。 screen:CtrlA-CtrlG コマンドを使います。このコマンドで、 すべてのバーチャルスクリーンの振る舞いを変更することができます。初期設定 の変更については、マニュアルページの "CUSTOMIZATION" の項をご覧ください。 <!--The Dark Side of the Problem-->問題点 問題となるのは、必ずしもすべてのアプリケーションが termcap terminfo を使っているわけではない ということです。小さなプログラムの大部分では、C ソースコード内で 「バックスラッシュ a」(アラーム) 文字が使われています。この「アラーム」 文字は、実行バイナリでそのまま ASCII の BEL 文字になります。きちんとした プログラムは、通常こうしたことはないのですが、C の初心者が作成した プログラムには気を付けてください。コンピュータサイエンスを学び始めた ばかりの学生は、特にひどかったりします。 そうしたプログラムのビープ音を消す唯一の方法は、スピーカ自体を取り外すか、 Martin Mares が作成したエスケープシーケンスを使うことです。 日本語訳について 日本語訳は Linux-JF プロジェクトの多くの方々にサポート頂きました。 ありがとうございます。 誤植・誤訳等については、JF メーリングリスト <JF@linux.or.jp> か、 <ysenda@pop01.odn.ne.jp> までお願いします。 訳: 中谷千絵 <jeanne@mbox.kyoto-inet.or.jp> (1996/10/06) 更新: 千旦裕司 <ysenda@pop01.odn.ne.jp> (2001/08/28) 校正: Seiji Kaneko <skaneko@a2.mbn.or.jp<