Visible bell mini-HowtoAlessandroRubinirubini@linux.itJF 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-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 以降を使っているなら、このエスケープシーケンスを
使った設定を行えば充分なので、本書をこれ以上読む必要はないでしょう。
もし、それ以前のカーネルを使っているか、もしくはビープ音を視覚的に表現させ
ようと思うなら、次章以下がお役に立ちます。
termcap と terminfo の基本概念/etc/termcap ファイルは、ターミナルの機能 (
terminal capability ) を
列記したテキストファイルです。多くのアプリケーションが 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 " など。)
。また、"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
に記述します。
nvi と elvis:
"set flash" を ~/.exrc に記述するか、
":set flash" (コロンが必要です)を手動で打ち込んでください。
視覚効果を無効にする場合は、flash の部分を
noflash に変更して使ってください。
emacs:"(setq visible-bell t)"
を ~/.emacs に記述します。無効にするには、"
(setq visible-bell nil) とします。
less:コマンドラインで "" オプションを
付けるとビープ音を視覚化でき、"" オプションでシグナル自体
を無効にできます。初期設定を環境変数 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<