閃光警告 mini-Howto Alessandro Rubini, rubini@linux.it v2.2, 11十一月 1997 _________________________________________________________________ 文件解釋在一個系統上如何使用 termcap 設定一個閃光警告和描述如何依需求使 喇叭聲無效. _________________________________________________________________ 1. 介紹 2. Spekearectomy 3. 每一個 console 發出嗶嗶聲設定 4. 基本概念關於 Termcap 和 Terminfo 5. 定義一個閃光警告 6. 使喇叭聲在上文字 console 失效 7. 告訴應用程式避免發出嗶嗶聲 8. 問題的黑暗邊 _________________________________________________________________ 1. 介紹 每當一個 BEL 字元(ASCII 代碼 7)輸出時 Linux console 發出喇叭聲 .雖然預 設行為是一個正確的選擇 ,許多用戶不喜歡他們的電腦發出發出嗶嗶聲.這份 mini-Howto 意義用來解釋如何告訴應用程式說不要產生 BEL 代碼.它也解釋如何 教導核心和 X 視窗系統當一個 BEL 產生時避免發出嗶嗶聲.注意文件大部分 談 及文字 console ,當設定 X 伺服器 是容易的 catch-all 針對在一個圖形的環境 工作的任何使用者. 面對一個愛挑剔的電腦以我的意見最好的方法是修正 硬體,我自己的電腦甚至沒 有配置一個擴音器. 2. Spekearectomy Speakerectomy 針對喇叭聲的問題 最直接的解決方法就是把喇叭拿(拔)掉, 這樣 就聽不到喇叭的聲音了. .這個運作是直接的和你 甚至不需要任何其他的做法,如 果你要的話它仍有改進的空間. PC 是通常裝備一個笨拙的切換較低的 CPU 時脈的開關. 當你在一個多工環境中 工作時這開關是從未使用,當 你甚至不需要把電腦慢下來執行遊戲基礎在 軟體 loops 上.不幸的是我們不能使用切換增加 處理器速度,但是我們可以使用它使擴 音器 啟動/無效 .有時擴音器是有用的假使你享受一個 silent number cruncher cruncher,例如信號結束的一個 lenghty 編輯.修改開關功能性,只要從 主要的電路版和它依序連接擴音器的線分開來 . 膝上型電腦的擁有人,不幸的不容易的使用 擴音器,他們其中沒有一個剩餘的切換 開關去轉變成另一個 不同的工作.針對這樣的用戶較好的解決方案是設定 他們的 軟體避免發出嗶嗶聲,如以下的描述. 3. 每一個 console 發出嗶嗶聲設定 在 Linux 1.3.43 時候, Martin Mares 加入設定發出嗶嗶聲 程度和持續的能 力,靠修改 console.c.每一個 console 可以是被設定特色一個不同的持續 和/或 者 喇叭聲音的程度 ;任務被完成靠使用 escape 順序輸出 到 console 設備.你 可以設定你自己的 ~/.profile 或者 ~/.login檔案選擇一個不同的嗶聲設定聯接 到 各 console (或者完全一點也不發出嗶嗶聲,如果需要的話). escape 順序如以下運作: * ESC-[10;xx] 選擇喇叭聲頻率用赫芝.這個值 應在範圍 21-32766,否則這個 值是沒有被定義. 如果 `xx' 參數值遺失了,預設值是 (750赫茲) 將會運 作, 當在 `ESC-[10]. * ESC-[11;xx] 選擇喇叭聲持續,在 milli-seconds (毫秒). 如果你指定超過 2秒,預設使用 (125ms).然後再一次 ,如果 `xx' 參數值遺失了 (ESC-[11]) 預設值 將會被使用. 選擇,例如,一個 50Hz 程度可以持續一秒鐘,你可以使用 "echo -e "\\33[10;50]\\33[11;1000]"" with bash (where "-e" 意思是 `了解 Escape 順序'.如果你使用 tcsh 相同的 命令拼寫如 "echo "\\033[10;50]\\033[11;1000]"". 盡管我不知道 setterm 命令的任何版本但它 支持這樣的設定,這命令的將來的版 本也許好好 支持命令行選項來設定喇叭聲聲音. 如果你執行 Linux-1.3.43 或者較新的,你也許滿意 escape 順序和避免閱讀更多 的.如果你執行較舊的核心,或者如果 你要閃光警告,你要閱讀文件其餘的部分. 4. 基本概念關於 Termcap 和 Terminfo 檔案 /etc/termcap是一個文字檔案它列出 terminal capabilities. 數個應用程 式使用 termcap 資料在螢幕周圍移動指標和做 別的螢幕導向的工作. tcsh, bash, vi 以及其他 curses-基礎應用程式使用 termcap 資料庫. 資料庫描述數個終端機的類型. TERM 環境變數在運行時選擇正確的行為 ,靠命名 一個 termcap 欄位是被 應用程式所使用. 在資料庫內部,每一個終端機的能力顯示當一個 two-letter 代碼和一個實際的 escape 順序的表示 被使用來取得想要的效果.在不同的能力之間的分隔符字元 是使用冒號 (":").舉一實例,聽得見的 喇叭聲,它的代碼 "bl",通常出現當 "bl=^G".順序 告訴它喇叭聲聲音是獲得靠列印 control-G 字元, ASCII BEL . 除 bl 能力外, vb 能力是被 重新組織.它是被使用來表現 "閃光警告". vb 通常 在 termcap 檔案 linux 的欄位有遺失. 大部分的現代應用程式和程式庫使用 terminfo 資料庫 代替 termcap. 資料庫中 每一個終端機型態使用一個檔案 和位於 /usr/lib/terminfo;避免使用極大的 目 錄,每一個終端機的類型的描述是儲存在由它的首字母決定的一個 目錄中; 那個 linux 欄位, 因此,是 /usr/lib/terminfo/l/linux.建立一個 terminfo 欄位你 將 ``編譯'' termcap 描述; 談及 tic 程式和它的說明頁. 5. 定義一個閃光警告 你可以加欄位針對 vb 能力在你的自己的 termcap 檔案中,如果沒有已經定義一 個. Dennis Henriksen (duke@diku.dk) 建議插入下列各行在 termcap 欄位中針 對 linux (注意在舊的 distributions 中欄位是叫做 console ): :vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\ 尋跡 backslash 在資料庫是被使用做 escape newline. Dennis' 的碼做下列各 項 (他自己說的): * 儲存指標位置 (uust一個安全謹慎). * 改變背景顏色數次在標準和非標準之間. * 恢複指標位置. 6. 使喇叭聲在上文字 console 失效 如果你強制使閃光警告在你的 console 上你可以使用 "bl" 在 termcap 欄位和 定義它使用相同的字串 建議針對在 "vb" 之上.靠近是便利的如果你不 要自已設 定每一個應用程式 (它如以下的描述,無論如何). 我在所有機器上使用這選項在 哪裡我可以執行 Linux 和我 不能拆開喇叭. 7. 告訴應用程式避免發出嗶嗶聲 這是一不完全的應用程式的清單它可以是被指示去 使用 vb 欄位針對當前的終端 機的形態 (使用任一 termcap 資料或者 terminfo 這個): * X 伺服器:使用 "xset b"命令來選擇 bell 的行為.這個指令取三個數值的 參數:大小,程度和持續. "xset -b" 使 喇叭聲完全無效.設定 X 伺服器影響 在顯示器上所有執行的 應用程式. * xterm: xterm 可以轉換各喇叭聲到一個看得見的或者 聽得見的信號.如果你 使用喇叭聲,"xset" 的設定 將會運作.喇叭聲在 xterm 預設是 聽得見的,但 是你可以使用 "-vb" 命令行選項 和 "xterm*visualBell: true" 的辦法轉 變它成一個 看得見的閃光.你可以拴牢看得見的/聽得見的信號在 運行時靠 control--left-mouse-button 叫出選單 .如果你執行 X 你最有可能的 不需 要下列資料. * tcsh (6.04 和以後的): "set visiblebell". 這指示可以是安放的在 .cshrc 或者可以是互動式的執行 .重設喇叭聲只要 "unset visiblebell". 使任何通知命令無效,使用 "set nobeep" 取代. * bash (任何 bash,如我所知道):放 "set bell-style visible" 在你的 ~/.bashrc中.可能的喇叭聲形態 可以是 "沒有"或者 "可聽得見的". * bash (with readline,如同其他的 readline 基於應用程式):放 "set prefer-visible-bell" 在 ~/.inputrc. * nvi 和 elvis: 放 "set flash" 在 ~/.exrc或者說 ":set flash" 互動式的 (注意 那個冒號).使閃光警告無效使用 noflash 在 flash 的地方. * emacs: 放 "(setq visible-bell t)"在你的 ~/.emacs.它是靠 "(setq visible-bell nil)" 使其沒有效用. * less:使用 "-q"在命令行上使用閃光警告, 使用 "-Q" 使任何報告無效.預設 選項可以 放進你的環境變數 "LESS". * screen: 執行 CtrlA-CtrlG 命令.改變 所有虛擬螢幕的行為.看 man page 在 "CUSTOMIZATION" 之下針對安裝預設值. 8. 問題的黑暗邊 壞消息是它不是每一個應用程式都使用 termcap 或者 terminfo.大部分小的程序 特色在 C 原始碼碼中使用 'backslash-a' (警報) 字元. "alarm" 碼在字串中變 成一個字面上的 ASCII BEL 當儲存成二進位的.真的 應用程式通常不會掉入這種 類,但是注意新學 C 的人 他們給你他們自己的程式.是所有最壞的的是電腦科學 的學生 ,真的. 唯一的方法使這些程式沉默的應用程式是 spekearectomy,或者依 Martin Mares 的方法使用 escape 順序.