Visible bell mini-Howto

Alessandro Rubini

rubini@linux.it

JF Project - 日本語訳

JF@linux.or.jp

v2.2, 11 November 1997

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Table of Contents
1. はじめに
2. スピーカを取り外す
3. コンソールごとにビープ音の音色を変える
4. termcap と terminfo の基本概念
5. ビープ音を視覚化する
6. テキストコンソールのビープ音を消す
7. アプリケーションのビープ音を消す
8. 問題点
9. 日本語訳について

1. はじめに

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

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2. スピーカを取り外す

スピーカを外科的に取り外す (Speakerectomy [1] ) こと、それがビープ音の
問題を解決するのに最も賢明な手段です。これは、字義通り、ビープ音の発生
源を取り外すことでビープ音が鳴らないようにするわけです。この手術は回り
くどさがなく、麻酔すら不要ですが、ただ、安直な方法ではあるので洗練の余
地はあります。

通常、PC には、CPU を低速にするためのあまり役に立たないシステムクロック
切り替えスイッチが付いています。このスイッチは、マルチタスク環境で動か
すような場合には、全く使用されません。ソフトウェアループでタイミングを
取っている古い DOS ゲームを低速で動かすような場合ですら、もはや使われて
いません。残念ながらこのスイッチを使ってプロセッサ速度を上げることはで
きませんが、これを転用してスピーカの有効無効を切り替えることができます
。確かに、ビープ音が役立つ場合もあります。静かで高速なマシンを使ってい
て、例えば、長時間のコンパイルの終了時をビープ音で知らせるといった際に
は、スピーカが役立つこともあるでしょう。このスイッチの機能を変更するに
は、メインボードからそれを取り外して、配線をスピーカと直列に接続するだ
けです。 (訳注：この文書は、1997 年に書かれています。現在では、多少事情
が違うと思われるので、ご注意ください)

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

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

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]" " となります [2] 。("-e" は、エスケープシーケ
ンスを理解せよという意味です。tcsh の場合でも、コマンドスペルは同じです
。)

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

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4. 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
プログラムとそのマニュアルページをご覧ください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

5. ビープ音を視覚化する

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

 ・ (安全策として)カーソル位置を保存する
   
 ・ 背景色と対になる色を使って、背景を数回点滅させる
   
 ・ カーソル位置を元に戻す
   
 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

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

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

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

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

 

 ・ X サーバ：X サーバでは、"xset b" コマンドを使ってビープ音の音色を調
    整します。このコマンドは、「ボリューム」「ピッチ」「持続時間」とい
    う 3 つ数値の引数を取ります [3] 。また、"xset -b" で、ビープ音を無
    効にできます。この X サーバの設定は、ディスプレイ上で動作するすべて
    のアプリケーションに影響を与えます。
   
 ・ 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" の項をご覧ください
    。
   
 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

8. 問題点

問題となるのは、必ずしもすべてのアプリケーションが termcap や terminfo
を使っているわけではないということです。小さなプログラムの大部分では、C
ソースコード内で「バックスラッシュ a」(アラーム) 文字が使われています。
この「アラーム」文字は、実行バイナリでそのまま ASCII の BEL 文字になり
ます。きちんとしたプログラムは、通常こうしたことはないのですが、C の初
心者が作成したプログラムには気を付けてください。コンピュータサイエンス
を学び始めたばかりの学生は、特にひどかったりします。

そうしたプログラムのビープ音を消す唯一の方法は、スピーカ自体を取り外す
か、 Martin Mares が作成したエスケープシーケンスを使うことです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

9. 日本語訳について

日本語訳は Linux-JF プロジェクトの多くの方々にサポート頂きました。あり
がとうございます。

誤植・誤訳等については、JF メーリングリスト <JF@linux.or.jp> か、
<ysenda@pop01.odn.ne.jp> までお願いします。

訳                                (1996
： 中谷千絵                       /10/ 
                                  06)  
更                                (2001
新 千旦裕司                       /08/ 
：                                28)  
校                                     
正 Seiji Kaneko                        
：                                     

Notes

[1] 訳注： Speakerectomy について著者からの説明です。                  
                                                                       
           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 というのは、切         
           断し、取りはずすことを意味します。つまり、接続線を切        
           断してスピーカーを撤去することです。)                       
                                                                       
                                            --Alessandro Rubini        
                                                                       
[2] (訳注：このコマンドは、X 用ではなく、ターミナル用です。テキスト端末
    画面で上記コマンドを打ち、Ctrl-G でそのビープ音を鳴らすことができま
    す。X 用の設定は、こちらをご覧ください。)                          
                                                                       
[3] (訳注：例えば、"xset b 10 50 2000" など。)                         

