rubini@linux.it
,bokkie@nl.linux.org
Dit document is auteursrechtelijk beschermd (c) door Alessandro Rubini.
Dit document wordt gedistribueerd onder de voorwaarden van de GNU Free Documentation License. Als het goed is heb je hiervan een kopie ontvangen. Zo niet, dan is het beschikbaar vanaf http://www.fsf.org/licenses/fdl.html.
De Linux console driver laat de hoorbare beep klinken wanneer een BEL teken wordt uitgevoerd (ASCII-code 7). Alhoewel dit de juiste keuze is voor het standaard functioneren, houden veel gebruikers er niet van als hun computer deze beep laat horen. Deze mini-Howto is bedoeld om uit te leggen hoe aan applicaties te laten weten de BEL-code niet uit te voeren. Hierin wordt ook uitgelegd hoe de kernel en het X Window Systeem te instrueren het beepen te voorkomen wanneer een BEL wordt uitgevoerd. Houd in de gaten dat het meeste van dit document refereert naar de tekstconsole,aangezien het configureren van de X-server een eenvoudige vergaarbak is voor iedere gebruiker die in een grafische omgeving werkt.
Naar mijn mening is de beste manier om een lawaaiige computer het zwijgen op te leggen door er hardwarematig iets aan te veranderen, in mijn eigen computer zit zelfs geen luidspreker.
Speakerectomy is verreweg de briljantste oplossing voor het probleem met de hoorbare beep. Zoals de naam impliceert, bestaat het uit het verwijderen van de beeps door het verwijderen van de beeper. De bewerking is rechttoe rechtaan en je hebt zelfs geen verdoving nodig, maar als je dat wilt is er plaats voor enig raffinement.
PC's worden gewoonlijk uitgerust met een dwaze switch om de CPU klok te vertragen. Als je in een multitasking omgeving werkt, wordt de switch nooit gebruikt, aangezien je de computer zelfs niet hoeft te vertragen om spellen gebaseerd op software loops te draaien. Helaas kunnen we de switch niet gebruiken om de processor snelheid te verhogen, maar we kunnen het wel gebruiken om de luidspreker te activeren/deactiveren. Soms is de speaker wel handig zelfs al vind je een zwijgzame getallenkraker wel prettig, bijvoorbeeld om het einde van een langdurige compilatie te signaleren. Om de functionaliteit van de switch te veranderen, ontkoppel je het gewoon van het moederbord en verbind je de draden in serie met de luidspreker.
Bezitters van laptop boxen, hebben helaas niet zo eenvoudig toegang tot de luidspreker, noch hebben zij een vrije switch voor gebruik van een andere taak. De voorkeursoplossing voor die gebruikers is het configureren van de software om het beepen te voorkomen, zoals hieronder wordt beschreven.
Sinds Linux 1.3.43 voegde Martin Mares de mogelijkheid toe de toon en
duur van de beep te configureren door het wijzigen van console.c
.
Iedere console kan zo worden geconfigureerd dat het voorziet in een
andere duur en/of toon van het beepgeluid;
de taak wordt bewerkstelligd door het gebruik van escape sequences
voor het console device. Je kunt je eigen ~/.profile
of
~/.login
bestand configureren om een ander beepgeluid
(of zonodig zonder enige beep) geassocieerd met een console te selecteren.
De escape sequences werken als volgt:
[10;
xx]
selecteert de beepfrequency in Hertz. De waarde
zou moeten liggen in het bereik, 21-32766, anders is het resultaat
ongedefinieerd. Als het `xx' argument ontbreekt, is de standaardwaarde
(750Hz) van toepassing, zoals in `ESC-[10]
.[11;
xx]
selecteert de duur van de beep in milliseconden.
Als je meer dan 2 seconden opgeeft, geldt de standaardwaarde (125ms).
Wederom, als het `xx' argument ontbreekt (ESC-[11]
) zal de
standaardwaarde worden gebruikt.Om bijvoorbeeld een 50Hz toon voor de duur van één seconde
te selecteren, gebruik je
"echo -e "\\33[10;50]\\33[11;1000]"
" met bash
(waar "-e"
betekent `ga uit van Escape sequences'. Als je gebruik maakt van tcsh
luidt de opdracht hiervoor "echo "\\033[10;50]\\033[11;1000]"
".
Alhoewel ik niet bekend ben met een versie van de opdracht setterm
die een dergelijke configuratie ondersteunt, zou het goed kunnen dat een
toekomstige versie een opdrachtregeloptie ondersteunt voor het
configuren van het beepgeluid.
Als je Linux-1.3.43 of nieuwer draait, ben je wellicht tevreden met de escape sequences en hoef je niet verder te lezen. Als je een oudere kernel hebt, of je wilt de visuele beep, dan zal je in je schik zijn met de rest van het document.
Het bestand /etc/termcap
is een tekstbestand waarin de
term
inal cap
aciteiten worden opgesomd.
Verscheidene applicaties maken gebruik van de termcap
informatie om de cursor op het scherm te verplaatsen en het doen
van andere op het scherm geöriënteerde taken.
tcsh
, bash
, vi
en alle op de curses
library
gebaseerde applicaties maken gebruik van de termcap
database.
De database beschrijft verscheidene typen terminals.
De omgevingsvariabele TERM
selecteert tijdens de uitvoering
het juiste functioneren, door het benoemen van een
termcap
veld dat door applicaties moet worden gebruikt.
In de database verschijnt iedere capaciteit van de terminal als een uit twee letters bestaande code en een representatie van de feitelijke escape sequence welke wordt gebruikt om het gewenste effect te krijgen. Het scheidingsteken tussen de verschillende capaciteiten is de dubbele punt (":"). Als een voorbeeld, verschijnt de hoorbare beep, met code "bl", gewoonlijk als "tt/bl=^G/". Deze sequence geeft aan dat het beepgeluid wordt verkregen door het afdrukken van het control-G teken, de ASCII bell.
In aanvulling op bl
wordt de vb
herkend.
Het wordt gebruikt als representatie van de "visuele bel".
vb
ontbreekt gewoonlijk in het linux
record van
het termcap
bestand.
De meeste moderne applicaties en library's maken gebruik van de
terminfo
database in plaats van
termcap
. Deze database gebruikt een bestand per type terminal en
komt voor in /usr/lib/terminfo
; ter voorkoming van zeer grote
directory's wordt de beschrijving van ieder type terminal opgeslagen in
een directory met de naam gelijk aan de eerste letter van de naam van
het type terminal; het linux
record is daarom te vinden in de
directory /usr/lib/terminfo/l/linux
. Om een
terminfo
record te bouwen ``compileer'' je de termcap
beschrijving;
refereer naar het programma tic
en de manual page hiervan.
Je kunt het veld vb
in je eigen termcap bestand plaatsen, als het nog
niet voor je is gedefinieerd. Dennis Henriksen
(duke@diku.dk) deed de suggestie de volgende regel in het linux
record van termcap
te plaatsen (merk op dat het record in oude
distributies console
wordt genoemd):
:vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\
De laatste backslash wordt gebruikt op de newline in de database te
escapen. Dennis' code doet het volgende (in zijn eigen woorden):
Als je de visuele beep op je console wilt forceren dan kun je het
"bl
" veld in termcap
gebruiken en het met dezelfde string
definiëren als eerder aangegeven voor "vb
".
Deze benadering is handig als je iedere applicatie niet aan wilt passen
(wat hoe dan ook hierna wordt beschreven).
Ik gebruik deze optie op alle computers waar ik Linux op draai en
waar ik de speaker niet kan ontkoppelen.
Dit is een onvolledige lijst met applicaties die kunnen worden geïnstrueerd
het veld vb
te gebruiken voor het huidige type terminal
(door gebruik van of de informatie in termcapr
of die in
terminfo
):
xset b
" voor
het selecteren van het functioneren van de beep.
Aan de opdracht kunnen drie numerieke argumenten worden
opgegeven: volume, toon en duur. "xset -b
" deactiveert
de beep in alle opzichten. Het configureren van de X-server heeft
effect op alle applicaties die op het display worden uitgevoerd.xterm
: xterm kan iedere beep converteren naar een visuele
beep of hoorbaar signaal. Als je de hoorbare beep gebruikt,
zijn de instellingen van "xset
" van toepassing.
De bel in xterm
is standaard hoorbaar, maar je kunt de
opdrachtregeloptie "-vb
" gebruiken en de
"xterm*visualBell: true
" bron om het om te zetten naar een
visuele flits. Je kunt tijdens de uitvoering schakelen tussen een
visueel/hoorbaar signaal door gebruik te maken van het menu,
dat kan worden aangeroepen met de control-linker-muisknop.
Als je X draait zal je de volgende informatie zeer waarschijnlijk
niet nodig hebben.tcsh
(6.04 en later): "set visiblebell
". De instructie
kan worden geplaatst in .cshrc
of kan interactief worden
aangeroepen. Gebruik voor het resetten van de hoorbare beep
"unset visiblebell
". Gebruik voor het deactiveren van
enige bekendmaking in plaats daarvan "set nobeep
".bash
(iedere bash, zover als ik weet): plaats
"set bell-style
visible
" in ~/.bashrc
. Mogelijke belstijlen zijn ook
"none" en "audible".bash
(met readline
, als tevens andere op readline
gebaseerde applicaties): plaats "set prefer-visible-bell
" in
~/.inputrc
.nvi
en elvis
: plaats "set flash
" in
~/.exrc
of ":set flash
" interactief (merk
de dubbele punt op). Gebruik noflash
in plaats van
flash?
om de visuele beep te deactiveren.emacs
: plaats "(setq visible-bell t)
" in
~/.emacs
. Het wordt gedeactiveerd door "(setq visible-bell
nil)
".less
: gebruik "-q
" op de opdrachtregel om de visuele beep
te gebruiken, gebruik
"-Q
" voor het deactiveren van enige bekendmaking.
Standaardopties kunnen worden geplaatst in de omgevingsvariabele
"LESS
".screen
: gebruik de opdracht CtrlA-CtrlG. Het verandert het
functioneren van alle virtuele schermen.
Raadpleeg de man page onder "CUSTOMIZATION" voor het instellen
van de standaardwaarde.Het slechte nieuws is dat niet iedere applicatie gebruik maakt van
termcap
of terminfo
. In de meeste kleine programma's wordt
gebruik gemaakt van de 'backslash-a' (alarm)
tekens in de C-broncode. De "alarm" code wordt een letterlijke ASCII-BEL
in de strings zoals opgeslagen in het uitvoerbare bestand. Echte applicaties
behoren niet tot deze categorie, maar wees voorzichtig met C-beginnelingen
die je hun eigen programma's geven. Studenten in de computerwetenschap
zijn het ergste van iedereen, dat verzeker ik je.
De enige manier om van deze programma's zwijgzame applicaties te maken is speakerectomy, of het gebruik van de escape sequences door Martin Mares.