Библиотека сайта rus-linux.net
1. Введение
Драйвер консоли Linux производит звуковой сигнал каждый раз, когда выводится символ BEL (ASCII код 7). Это считается нормальным поведением, но некоторым пользователям не нравится, когда их компьютер начинает пищать. Это мини-HOWTO описывает, как указать приложениям не выводить символ BEL, и как заставить ядро и X-windows не пищать при выводе символа BEL. Замечу, что большая часть этого документа имеет отношение к текстовой консоли; тем не менее любой пользователь, работающий в графическом окружении, может легко понять, как настроить X-сервер.
Хотя, по-моему, лучший выход усмирить нервный компьютер - это отключить динамик (что я и сделал).
2. Онемение
Онемение (лат. speakerotomy :-) - это самое лучшее решение нашей проблемы. Как следует из названия, она представляет из себя удаление звуковых сигналов путем удаления того, что издает эти сигналы. Операция довольна проста и не требует никаких анестезирующих средств.
Персональный компьютер обычно поставляется с идиотской кнопкой "Turbo", снижающей тактовую частоту процессора. Обычно она никогда не используется, за исключением случаев, когда вы хотите поиграть в старую-добрую игру времен XT. Т.е. обычно мы не используем эту кнопку по прямому назначению, но мы можем легко ее переделать для включения/выключения динамика, т.к. иногда динамик очень даже нужен (например, для уведомления о том, что закончилась продолжительная компиляция). Чтобы это сделать, просто отключите ее от материнской платы и подсоедините провода последовательно с динамиком.
К сожалению, пользователи портативных компьютеров не имеют доступа к динамику, кроме того, у них нет свободной кнопки для этого. Самое лучшее решение для таких пользователей - соответственно настроить программное обеспечение. Что мы и сделаем.
3. Настройка звукового сигнала на каждой консоли
В Linux 1.3.43, Martin Mares, изменив console.c
, добавил возможность настраивать частоту и длительность звукового сигнала. Каждая консоль, при помощи escape-последовательностей, может быть настроена на звуковой сигнал с разной частотой и/или длительностью. Вы можете изменить ~/.profile
или ~/.login
, настроив разный сигнал для каждой консоли (или вообще его выключить).
Escape-последовательности следующие:
ESC-
[10;
xx]
устанавливает частоту сигнала в герцах. Значение должно быть в диапазоне 21-32766. При отсутствии или неправильном значении `xx', устанавливается значение по умолчанию (750Гц).ESC-
[11;
xx]
устанавливает длительность звукового сигнала в миллисекундах. Опять же при отсутствии или неправильном значении `xx' устанавливается значение по умолчанию (125мс).
Например для установки звукового сигнала в 50Гц и длительностью в одну секунду, вы можете выполнить
"echo -e "\\33[10;50]\\33[11;1000]"
" в bash
(гдк "-e" означает `используются escape-последовательности'. Если вы пользуетесь tcsh
, та же команда выгдядит так "echo "\\033[10;50]\\033[11;1000]"
".
Насколько я знаю, команда setterm
не поддерживает такую настройку, хотя вполне может быть, что будущие версии будут делать это.
Если у вас Linux-1.3.43 или выше, вас могут удовлетворить escape-последовательности, и можно не читать дальше. Если у вас старое ядро или вы хотите настроить визуальный сигнал, то вам понравится оставшаяся часть документа.
4. Основные понятия Termcap и Terminfo
/etc/termcap
- это текстовый файл, описывающий возможности терминала
(term
inal cap
abilities). Различные приложения используют
termcap
для получения информации о том, как двигать курсор по экрану и т.д. tcsh
, bash
, vi
и другие приложения, основанные на curses
, используют базу данных termcap
.
База данных описывает различные типы терминалов. Переменная окружения
TERM
указывает приложениям на соответствующий терминал в termcap
.
Внутри базы данных каждая возможность терминала описывается двухбуквенным кодом и представляет из себя escape-последовательность, которую надо вывести, чтобы добиться желаемого эффекта. Для разделения используется символ двоеточия (":"). Например, звуковой сигнал с кодом "bl" обычно описывается как "bl=ˆG
". Это значит, что для звукового сигнала нужно вывести символ Ctrl-G (ASCII BEL).
В дополнении к bl
поддерживается код vb
Он описывает визуальный сигнал ("visible bell") и обычно отсутствует в файле termcap
для терминала linux
.
Большинство современных приложений и библиотек вместо termcap
используют базу данных terminfo
. Эта база данных описывает каждый вид терминала в отдельном файле из каталога /usr/lib/terminfo
. Чтобы избежать использования каталога с большим количеством файлов, каждый файл находится в подкаталоге, названном по первой букве названия терминала; например, терминал linux
описывается в файле /usr/lib/terminfo/l/linux
. Чтобы создать запись в
terminfo
, вы должны "откомпилировать" описание termcap
(man tic
).
5. Определение визуального сигнала
Вы можете добавить запись vb
в файл termcap, если там ее еще нет. Dennis Henriksen (duke@diku.dk) предложил вставлять в
termcap
для терминала 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
" из предыдущего раздела. Этот метод удобен, если вы не хотите настраивать каждое приложение (впрочем, это все равно описывается ниже). Я использую этот способ на всех машинах, где не могу отключить динамик.
7. Заставляем приложение замолчать
Вот незаконченный список приложений, которые можно заставить использовать визуальный сигнал вместо звукового:
X-сервер: используйте команду "
xset b
", чтобы определить параметры звукового сигнала. Она имеет три числовых аргумента: громкость, частоту и длительность. Кроме того, "xset -b
" вообще выключат звуковой сигнал. Эта настройка оказывает влияние на все приложения, запущенные на данном X-сервере.xterm
: xterm может преобразовывать визуальный и звуковой сигнал из одного в другой. Вxterm
сигнал по умолчанию - звуковой, но вы можете использовать "xset -vb
" или изменить ресурс "xterm*visualBell: true
", чтобы превратить звуковой сигнал в визуальный. Для переключения визуального/звукового сигнала, можно также использовать меню, вызываемое Ctrl-левая_кнопка_мыши. Если вы работаете в основном под X-windows, дальнейшая информация может не понадобиться.tcsh
(6.04 и выше): "set visiblebell
". Команда может быть помещена в.cshrc
или введена вручную. "unset visiblebell
" снова включает звуковой сигнал. Чтобы вообще выключить любые сигналы, используйте "set nobeep
".bash
(любой bash, насколько я знаю): поместите "set bell-style visible
" в˜/.bashrc
. Возможные типы сигналов также "none" или "audible".bash
(С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 screen раздел "НАСТРОЙКА" ("CUSTOMIZATION").
8. Другая сторона проблемы
Есть плохие новости. Не каждое приложение использует termcap
или
terminfo
. Большинство маленьких программ используют символы '\a' (alarm) прямо в исходном тексте на C. Во время выполнения программы этот символ превращается в ASCII BEL. Реальное приложение обычно не падает под эту категорию, но остерегайтесь новичков в C, дающих вам свои программы. Из них хуже всего студенты, изучающие информатику.
Единственный путь заставить эти программы замолчать - это онемение, или использование escape-последовательностей Martin'а Mares'а.
9. Авторские права
Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.
Этот документ является частью проекта Linux HOWTO.
Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.
Все переводы и производные работы, выполненные по документам Linux HOWTO, должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже.
Мы бы хотели распространить эту информацию по всем возможным каналам. Но
при этом сохранить авторские права и быть уведомленными о всех планах
распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь
к координатору проекта Linux HOWTO по электронной почте:
<linux-howto@metalab.unc.edu>
или к координатору русского
перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу
<linux-howto@asplinux.ru>