次のページ 前のページ 目次へ

  Visible bell mini-Howto
  Alessandro Rubini, rubini@ipvvis.unipv.it
  v2.1, Aug 1996

訳:中谷千絵 jeanne@mbox.kyoto-inet.or.jp
1996/10/06

  この文書は termcap の使用方法についていくつか重要な点を説明をし、
そして必要に応じてビープ音を完全に無効にするカーネルパッチの入手に
ついての情報を提供しています。

1. はじめに

  Linux コンソールドライバは BEL キャラクタが出力 (ASCII code 7) す
る時はいつでもビープ音を鳴らします。これはデフォルトのふるまいとし
て当然のことですが、多くのユーザーはコンピュータがビープ音を出すこ
とを好みません。この mini-HOWTO では BEL コードを出力しないようにア
プリケーションに伝える方法を説明することを予定しています。カーネル
パッチの入手に関する情報が十分に提供されています。パッチは termcap 
とアプリケーションのデフォルト設定を壊してしてしまうのを避けるため
に多目的であることを意図しています。
  私の意見では最もよい解決はハードウエアで解決することで、私のコン
ピュータにはスピーカーは取り外してしまってついていません。


2 Spekearectomy* (スピーカーを取り外す手術)

  Speakerectomy (スピーカーを取り外す手術)は、ビープ音の問題に対す
るとてもあざやかな解決です。ある種の付加的な音色は価値がありますが、
ビープ音を取り除く最も簡単な方法です。

訳注[*]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 というのは、切断し、取りはずすこと
を意味します。接続線を切断してスピーカーを撤去します。。


  通常 PC には、低速にするためにメインボードクロックを切り替えるあ
まり役に立たないスイッチが用意されています。そのスイッチはマルチタ
スク環境で動かす時にはまったく不要です。そしてソフトウエアのループ
でタイミングをとっているような古い DOS のゲームを低速にする本来の
機能さえもはや使われていません。不運にもプロセッサの速度を増加する
スイッチを使うことはできませんが、そのスイッチをスピーカーを有効か
無効かにするために転用することができます。長時間を要するコンパイル
の終了時に、コンピュータがビープ音を鳴らすことは、静かなコンソール
を望む人にとってもいいことです。

  速度切替えスイッチの機能を変更するには、メインボードからそれを取
り外し、配線をスピーカーと直列に接続するだけです。

  不運にもラップトップを使っている人はスピーカーにアクセスすること
は簡単ではありませんし、違った目的に使用するために余っているスイッ
チもありません。そのようなユーザーの場合、よりよい解決法はソフトウ
エアを音を出さないように設定してみることです。


3. コンソールごとにビープ音を設定

  Linux 1.2.43 に関して、Martin Mares は音の鳴り方を設定できるよう
に console.c ファイルを追加しました。tty にエスケープシーケンスを
書くことで、すべてのコンソールでビープ音の持続時間とピッチを変更で
きます。それぞれのコンソールと連携するそれぞれ違ったビープ音(ある
いはビープ音をならなさない)を設定するために ~/.proflile か
  ~/.login に自分の設定を加えることができます。

エスケープシーケンスは次のように動きます。

  ESC-[10;xx] は ヘルツ(Hz)でベルの振動数を選択します。この値は 
21-32766 の範囲になりますが、そうでない場合結果は不明です(少なくと
もバージョン2.0 では)。先のことはわかりかねますが。もし 'xx' が存在
しないと、`ESC-[10] のようにデフォルト値(750Hz) が適用されます。

  ESC-[11;xx] はミリセコンドの単位でベルの持続時間を選択します。2
秒以上を指定するとデフォルト(125ms)が適用されます。何度もいいます
が、もし 'xx'argumentが存在しないなら、デフォルト値(ESC-[11])が適
用されます。

  エスケープシーケンスを出力するなら、たとえば、bash では(50Hz, 1s)
"echo -e "\33[10;50]\33[11;1000]"" を試すことができます。( -e は エ
スケープシーケンスを理解する、を意味します) 、
tcsh では
"echo "33[10;50] 33[11;1000]" が同様の効果を持ちます。

  これらの制御コードが `setterm-commands' として登録されているので、
新しい`setterm' コマンドはコマンドラインでのベル設定をサポートして
いるかもしれないことに注意してください。しかし、私の知っているバー
ジョンの `setterm' に、これらのコードをサポートしているものはありま
せん。

  もし Linux-1.3.43 あるいはそれより新しいバージョンを動かしている
なら、あなたはエスケープシーケンスで満足し、そしてこれ以上は読まな
いかもしれませんね。もしあなたが古いカーネル(私自身は小さな 386 マ
シンでそれを使っています)を動作させているか、あるいはもしあなたが
ビジュアルベルを使いたいならよく読んでくださいね。


4. Termcap についての基本的概念

  /etc/termcap ファイルは端末制御コードを集めているテキストファイ
ルです。いくつかのアプリケーションは、スクリーンでのカーソルの移動
や、あるいはスクリーン指向の作業をするのに termcap 情報を使います。
tash や bash 、あるいは vi など curses ライブラリを使っているすべ
てのアプリケーションは termcapdatabase を使います。

  database はさまざまなの端末の種類を記録し、そしてアプリケーションは 
termcap で正しい登録を参照して TERM 環境変数を使います。その時、それぞ
れの制御コードは期待通りの効果を得るために使用される連続する文字に関連
づけられた2文字のコードで表されます。区切り文字はコロン(":")です。ひ
とつの例として、ビープ音は code "bl" ですが、それは、いつもつながった
"bl=^G" で表され、control-G という文字を使う ASCII BEL のアプリケーショ
ンを示しています。

  bl 制御に付け加えて、vb 制御があります。それは、ビジュアルベルを
表します。vb はLinux の /etc/termcap で通常コンソール登録にはあり
ません。


5. ビジュアルベルを定義する

  あなたは自分の termcap ファイルに vb 制御登録を追加できます。
Dennis Henriksen (duke@diku.dk) はコンソールに対するtermcap 登録に
次の行を挿入することを提案しました。

       :vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\

  連続しているバックスラッシュ(\\) はデータベースで新しい行を回避
するために使われます。Dennis' codeは(彼自身の言葉で言うなら)次のこ
とをします。

● カーソルの位置を保持する(安全装備)

● 通常状態とリバースとの間で背景色を数回選択変更する

● カーソル位置を復帰する。

termcap を修正する場合のいくつかの注意点

● あなたの TERM 変数がどうなっているかをチェックしましょう。それ
が "console" として使用されているなら、ご使用の Linux 配布物と 
kernel のバージョンに依存します。実際に、"linux" の変更のためで
す。

● vb 領域がすでにそこにあるかどうかチェックしましょう。配布者はド
キュメントを読んでいるし、いつもソフトウエアをアップグレードしてい
ます。

● いくつかのアプリケーションは termcap を使用しませんが terminfo 
データベースを使います。それらはあなたの vb 登録を認識しないかもし
れません。terminfo はtermcap よりももっと難しいばかりでなくもっと
強力です。


6. アプリケーションへの伝達

  以下のものは実際の端末の種類に vb 登録を使用するように指示できる
アプリケーションの未完成のリストです。

● 6.04 とそれ以降の tcsh では "set visiblebell" です 。指令は
  .cshrc に記述するか、あるいは対話的に実行できます。ビープ音を
リセットするには "unset visiblebell" です。指令を無効にするには
 "setnobeep" です。

● bash(私が知っている限りではどんな bash でも) では、~/.bashrc に、
"set bell-style visible" を記述します。種類は "none" あるいは 
"audible" が可能です。

● bash (readline を持っているもの、他の readline を使うアプリケー
ションも同様ですが)では ~/.inputrc" に、set prefer-visible-bell" 
を設定します。

● nvi と elvis では、~/.exrc に "set flash" を記述するか、対話的
に(コロン: をつけて) ":set flash" を伝えます。 ビープ音を無効にす
るには flash のかわりに noflash を使います。

● emacs では ~/.emacs に "(setq visible-bell t)" を書きます。
"(setq visible-bell nil)" で無効になります。

● less では、ビジュアルベルを使うにはコマンドラインで "-q" を使い
ます。 "-Q" を使うと無効になるという報告がいくつかあります。デフォ
ルトオプションは環境変数 "LESS" を使うことができます。

●スクリーン
 xterm: xterm はビジュアルあるいはビープ音のいずれかの信号をおのお
ののベル表示に変換できます。ビープ音がデフォルトですが、コマンドラ
インのオプション "-bv" と"xterm*visualBell: true" を使うことができ
ます。control-mouse-2 menu(control キーを押して3ボタンマウスの第
2ボタンを使った時に画面に表示されるメニュー) を使ってビジュアルベ
ルとビープ音を頻繁に切り替えることができます。

● その他の X アプリケーションでは、 コマンドラインのオプション 
"-f volume" で、 X サーバに音量を伝えることができます。"volume" は 
0 から 100 の間です。 サーバに対するコマンドラインのオプションをパ
スする方法については X ドキュメントあるいは専門書を参考にしてくだ
さい。


7. ビープ音を無効にする

  コンソールでビジュアルベルを強くしたいなら、termcap ファイルのな
かで、上述 した vb に対して与えられているのと同じ行で bl 登録を置
き換えることができます。このアプローチはそれぞれのアプリケーション
をカスタマイズする作業から解放されます。私は Linux を動作させるこ
とができるマシンではすべてこのオプションを使っています。

  ハード的に接続線でつながれた音声機器を使用するアプリケーションで
は、それらのソースコードはこのような変更では影響されないことに注意
してください。


8. 設定しやすくする

  コンソールでビープ音とビジュアルベルを選択できるようにしたいなら、
Linux のコンソールで2つの違った種類の端末を使えます。たとえば、そ
れらにコンソール(console) と、コンソール-vb (console-vb) のように
名前をつけることができます。 console 登録がオリジナルになりますが、
もうひとつのものは、bl の種類としてビジュアルベル系列をつくること
ができます。このようにしてコンソールでのベルのふるまいを変更できま
す。

● tcsh では、スクリーンフラッシュを得るには "setenv TERM console-vb"、
そしてビープ音を鳴らすには "setenv TERM console" とします。

● bash ではフラッシュには "TERM=console-vb; export TERM"、そして
ビープ音には "TERM=console; export TERM" とします。

  termcap の形式は別の言語で端末の種類を定義できるので、あなたは差
分だけデータベースを挿入する必要があることを注意してください。さら
なる情報については manpages を参考にしてください。


9. その他の解決方法

  残念な情報としては、すべてのアプリケーションが termcap を認識す
るわけではないということです。大部分の小さなプログラムは C ソース
コードで 'backslash-a' ( \a ) をわざわざ使っています。これらのキャ
ラクターは実行バイナリーで文字通りテキストの ASCII BEL になります。
通常、実際のアプリケーションはこのカテゴリーに入りませんが、あなた
に自分のプログラムを渡す C の入門者には警戒しましょう。特にコンピュー
タサイエンスを学び始めた学生の初心者はみんな最悪です。

  これらのアプリケーションでスピーカーを止めるただひとつの方法は
speakerectomy(スピーカーを取り外す手術) か、あるいは、Martin Mares 
の作成したエスケープシーケンスを利用することです。

  以前、私は自分のためにパッチを作りました。エスケープシーケンスが
あるのでそれ以上をサポートしませんでした。私は音の調子をサポートす
るために1.3.42 で私のパッチをもう一度使いました。ところが、1.3.43 
ではすでにそれを持っているの発見したのです:-)

---------------------------------------------

日本語訳についての問い合わせは
jeanne@mbox.kyoto-inet.or.jp

日本語訳は Linux-JF プロジェクトの多くの方々にサポート頂きました。
ありがとうございます。
訳:中谷千絵 jeanne@mbox.kyoto-inet.or.jp
1996/10/06

次のページ 前のページ 目次へ