## Visible bell mini-Howto

Alessandro
Rubini

    rubini@linux.it

JF Project
日本語訳

    JF@linux.or.jp

v2.2, 11 November 1997

この文書では、termcap を使って、ビープ音を鳴らさずに視覚的に知らせる (visible bell) ようシステムを設定する方法を説明します。また、必要に応じて ビープ音自体を消す方法についても紹介しています。

## はじめに

Linux コンソールドライバは、BEL 文字 (ASCII code 7) を出力する際、 いつもビープ音を鳴らすようになっています。これは初期設定での振舞い としては問題ないのですが、ユーザのなかには、コンピュータのビープ音を 鳴らさないようにしたいと思っている人も多いでしょう。この mini-HOWTO は、アプリケーションに BEL コードを出力しないよう指示する方法を説明 するものです。また、カーネルや X Window System を設定して、BEL 文字の 出力の際にビープ音を鳴らさないようにする方法も説明しています。ただ、 この文書は、テキストコンソールに関する説明が大半となっています。X サーバ の設定は、グラフィック環境を使っているユーザ向けに、付け足し程度しか 説明していないので、ご了承ください。

思うに、何かと面倒なことが多いコンピュータを思い通りに動かす最良の 方法は、ハードウェア段階で対処することです。(ビープ音の嫌いなわたしは) コンピュータからスピーカ自体を取り外しています。

## スピーカを取り外す

スピーカを外科的に取り外す (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 年に書かれています。現在では、多少事情が 違うと思われるので、ご注意ください)

ラップトップを使っている場合は、残念ながら、スピーカにアクセスすることは 簡単ではありませんし、余分なスイッチを使って別の目的に転用するようなこと もできません。そうしたユーザにとって、よりよい解決策は、ソフトウェア上で 設定を行ってビープ音を消すことです。そうした方法を以下で説明します。

## コンソールごとにビープ音の音色を変える

Linux 1.3.43 では、Martin Mares が、`console.c` の変更 によって、ビープ音のピッチと持続時間を設定できる機能を追加しました。 コンソールごとに、異なるピッチと持続時間の音色でビープ音を鳴らすよう 設定することが可能です。このタスクの実行には、コンソールデバイスに送られる エスケープシーケンスが使われています。`~/.profile` や `~/.login` ファイルの設定により、別々のビープ 音を個々のコンソールで鳴らすことができます(また、必要に応じて、ビープ音を 消すこともできます)。

エスケープシーケンスは、次のような働きをします。

- ESC-`[10;`xx`]` により、ヘルツ(Hz)単位で ビープ音の周波数を設定します。この値は、21-32766 の範囲でなければならず、 それ以外の値は未定義と解釈されます。引数 xx が定義されていない場合、例えば ESC-`[10]` となっているような場合は、デフォルト値 (750Hz) が 適用されます。

- ESC-`[11;`xx`]` により、ミリ秒単位でビープ音 の持続時間を設定します。2 秒以上を指定すると、デフォルト値 (125ms) が適用 されます。上記同様、引数 xx が定義されていない場合 (ESC-`[11]` )、デフォルト値が使われます。

例えば、50Hz のピッチで一秒間持続させたい場合、bash なら、 " `echo -e "\\33[10;50]\\33[11;1000]"` " と なります (訳注：このコマンドは、X 用ではなく、ターミナル用です。 テキスト端末画面で上記コマンドを打ち、Ctrl-G でそのビープ音を鳴らすことが できます。X 用の設定は、こちらをご覧 ください。) 。("`-e`" は、エスケープシーケンスを理解せよという 意味です。tcsh の場合でも、コマンドスペルは同じです。)

`setterm` コマンドにこのような設定をサポートするバージョンが あるかどうかは知りませんが、将来的には `setterm` のコマンド ラインオプションでビープ音の設定ができようになるだろうと思います。

Linux カーネル 1.3.43 以降を使っているなら、このエスケープシーケンスを 使った設定を行えば充分なので、本書をこれ以上読む必要はないでしょう。 もし、それ以前のカーネルを使っているか、もしくはビープ音を視覚的に表現させ ようと思うなら、次章以下がお役に立ちます。

## termcap と terminfo の基本概念

`/etc/termcap` ファイルは、ターミナルの機能 ( `term`inal `cap`ability ) を 列記したテキストファイルです。多くのアプリケーションが `termcap` ファイルを使って、スクリーン上でのカーソル移動やその他の スクリーン関係の処理を行っています。tcsh や bash、vi 等、すべてのカーソルベースの アプリケーションは、`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` プログラムとそのマニュアルページをご覧ください。

## ビープ音を視覚化する

`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 のコードは、(彼の言によると)次の機能を持つそうです。

- (安全策として)カーソル位置を保存する

- 背景色と対になる色を使って、背景を数回点滅させる

- カーソル位置を元に戻す

## テキストコンソールのビープ音を消す

コンソール上でビープ音の視覚化を強制したい場合は、`termcap` ファイルの `bl` エントリの部分を前章の `vb` の文字列に置き換えてください。アプリケーションごとのカスタマイズ を望まないなら、このアプローチは非常に手軽な方法です (アプリケーションごと のカスタマイズは、次章で説明します)。わたしは、スピーカの取り外しができない Linux マシンには、すべてこのオプションを使っています。

## アプリケーションのビープ音を消す

この章では、 (`termcap` か `terminfo` に記述されている情報を使って) ターミナルタイプを判断しているアプリケーション のうち、 `vb` エントリを使うよう指示することが可能なものを いくつかを取り上げて説明します。

- X サーバ：X サーバでは、"`xset b`" コマンドを使ってビープ音の 音色を調整します。このコマンドは、「ボリューム」「ピッチ」「持続時間」という 3 つ数値の引数を取ります (訳注：例えば、"`xset b` `10 50 2000`" など。) 。また、"`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` での初期設定は聴覚信号になっていますが、 コマンドラインオプションで "`-vb`" を指定するか、リソース (訳注：`~/.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` に記述します。

- `nvi` と `elvis`： "`set flash`" を `~/.exrc` に記述するか、 "`:set flash`" (コロンが必要です)を手動で打ち込んでください。 視覚効果を無効にする場合は、`flash` の部分を `noflash` に変更して使ってください。

- `emacs`："`(setq visible-bell t)`" を `~/.emacs` に記述します。無効にするには、"`(setq visible-bell nil)` とします。

- `less`：コマンドラインで "`-q`" オプションを 付けるとビープ音を視覚化でき、"`-Q`" オプションでシグナル自体 を無効にできます。初期設定を環境変数 `LESS` に設定しておく ことが可能です。

- `screen`：CtrlA-CtrlG コマンドを使います。このコマンドで、 すべてのバーチャルスクリーンの振る舞いを変更することができます。初期設定 の変更については、マニュアルページの "CUSTOMIZATION" の項をご覧ください。

## 問題点

問題となるのは、必ずしもすべてのアプリケーションが `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<