闪光警告 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 顺序.