· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/Visual-Bell

시각적 경고에 대한 미니 하우투

시각적 경고에 대한 미니 하우투

Alessandro Rubini, rubini@ipvvis.unipv.it

v2.1 1996년 8월 번역: 이 만 용, geoman@nownuri.nowcom.co.kr
이 문서에서는 termcap의 사용법에 대하여 그리고 필요에 따라 경고를 아예 쓰지 않도록 커널 패치하는 방법을 설명한다.

1. 소개

리눅스 콘솔 드라이버는 BEL 문자( 아스키 코드 7 )가 보내질 때마다 경고음을 울려준다. 기본적인 반응양식이지만 많은 사용자들이 자기 컴퓨터가 삑삑 대는 것을 좋아하지 않고 있기도 하다. 본 미니 하우투 문서는 바로 어떻게 어플리케 이션으로 하여금 BEL 코드를 내보내지 않게 할 수 있는가에 대해 설명하고자 한 다. 커널 패치 방법 또한 설명하겠다. 패치를 하게 되면 termcap이나 다른 설정 화일을 바꿀 필요없이 완전히 경고음을 무력하게 만들 수 있다.

개인적으로 가장 좋은 방법은 하드웨어적 해결책이라고 생각하는데 본인의 컴퓨 터에는 시끄러운 스피커가 아예 달려있지도 않다.

2. 스피커 제거법(spekearectomy)

스피커 제거는 청각적 경고음에 대한 가장 멋진 해결책이다. 몇 가지 주의할 것이 있기는 하지만 삑삑 대는 소리는 없앨 수 있는 가장 쉬운 방법이다.

PC에는 보통 메인보드의 클럭 속도를 낮추는 멍청한 스위치가 달려있기 마련이다. 이 스위치는 멀티태스킹 환경에서는 전혀 필요가 없는 것으로서 소프트웨어적인 루프 지연방법을 사용하던 구식 도스 게임의 속도를 늦추기 위해 있던 것으로 지 금은 전혀 쓰이고 있지 않다. 불행하게도 우리는 프로세서 속도를 높이기 위하여 그 스위치를 사용하지는 못하고 단지 스피커 가능/불가능 토글 스위치로 전환하 여 사용할 수는 있다. 시끄럽지 않은 콘솔을 원하는 사람이라 할 지라도 오랜 컴 파일을 마친 후 여러분에게 삑 하는 소리로 알려주는 것이 좋을 것이다.

스위치의 기능을 바꾸기 위해서는 그냥 메인보드에 달린 것을 빼낸 후 스피커 전 선에 이으면 된다. 이렇게 하기만 하면 된다.

하지만 안타깝게도 랩탑 컴퓨터를 가진 사람들은 좀처럼 하기 어려운 방법이며 그런 별도의 스위치를 가지고 있지도 않다. 그러한 사용자들에게는 소리가 나지 않도록 소프트웨어 설정을 해보는 것이 좋다.

3. 콘솔마다 소리 설정

커널 1.3.43에서 Martin Mares 씨는 console.c에 벨 사운드에 설정을 할 수 있도 록 기능을 추가하였다. 각 콘솔에 대하여 tty 에 대한 이스케이프 문자열을 써줌 으로써 콘솔 경고음에 대한 지속시간, 피치를 바꿀 수 있게 되어 있다.  /.profile 이나  /.login 에다 설정을 해주면 각 콘솔마다 다른 음이나 또는 음 자체를 안나오게 할 수 있다.

이스케이프 문자열은 다음과 같다:

-- ESC-[10;xx] 은 경고음의 헤르쯔를 선택한다. 값은 21 - 32766 사이에서 설 정되어야 하며 다른 값에 대해서는 정의되어 있지 않다.( 최소한 2.0.X 버전 에서는... 하지만 앞으로 어떻게 달라질 지 모르겠다. ) 그냥 ESC-[10] 이라 고만 적고 xx 인수를 생략하면 기본값은 750 Hz가 된다.

-- ESC-[11;xx] chooses the bell duration, in milli-seconds. If you ESC-[11;xx] 는 경고음 지속시간을 밀리초 단위로 설정한다. 만약 2 초 이상 을 설정하면 기본값 125 ms 가 적용된다. 또한 xx 인수가 생략되어 사용되면 (ESC-[11]) 기본값이 사용된다.

이스케이프 문자를 출력하기 위해서, 예를 들어 다음과 같이 해보자( 50Hz, 1초 ) echo -e "\33[10;50]\33[11;1000]" 배쉬에서 -e 는 이스케이프 문자열을 이해하도록 하는 스위치이다. tcsh 의 경우에는 echo " 33[10;50] 33[11;1000]" 라고 해주면 같은 효과를 낸 다.

최신 setterm 명령이 경고음 설정을 지원하는지에 대해서는 잘 모르겠다. 내가 아는 버전에서는 지원이 되고 있지 않다.

If you run Linux-1.3.43 or newer, you may be satisfied with the escape 여러분이 커널 1.3.43 이상을 사용하고 있고 이스케이프 문자열로 충분히 원하는 결과를 얻는다면 더 이상 읽을 필요가 없다. 하지만 본인이 386 컴퓨터에서 돌리 고 있는 것처럼 오래 된 커널을 사용하거나 경고음이 필요한 경우에는 계속 읽어 보기 바란다.

4. Termcap에 대한 기본적인 개념

/etc/termcap 은 사용 가능한 터미널 유형을 적어놓은 텍스트 화일이다. 몇몇 프로그램은 화면에서 커서를 움직이거나 스크린에 관련된 일을 하기 위하여 termcap 의 정보를 사용한다. tcsh, bash, vi 그리고 모든 curses 기반의 프로그 램들이 모두 termcap 데이터베이스를 사용한다.

데이터베이스에는 다양한 터미널 유형이 표현되어 있고 응용 프로그램들은 term- cap에서의 올바른 유형을 찾아내기 위하여 환경변수 TERMCAP을 사용한다. 각 기능은 2 문자 코드를 사용하여 원하는 효과를 줄 수 있도록 되어 있다. 각 기능의 구분자는 콜론(:)문자이다. 예를 들어 경고음에 대해서는 bl 이라는 코 드를 사용하는데 보통 bl=^G 로 표현되어 있어서 응응프로그램으로 하여금 아스키 BELL 문자인 <컨트롤>+G 문자를 사용하도록 지시한다.

bl 기능 말고도 vb 즉 "visible bell"이라는 기능이 있는데 /etc/termcap 의 리눅스 콘솔에는 보통 빠져있다.

5. 화면표시 경고 정의하기

여러분이 갖고 있는 termcap 에다 vb 설정을 넣을 수 있다. Dennis Henriksen (duke@diku.dk) 씨는 termcap 의 console 에다 다음 줄을 삽입 할 것을 제안하였다.

       :vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\
맨뒤에 붙은 백슬래쉬 문자는 줄바꿈을 escape 시키기 위해 필요한 것이다. Dennis 의 코드는 그의 말을 빌리면 다음과 같은 행동을 한다고 한다.

-- 현재의 커서 위치를 기억한다.( 안전하게 하기 위해서 )

-- 정상적인 색과 반전색으로 배경색을 여러분 바꾼다.

-- 커서의 현재 위치를 복원한다.

termcap 을 고칠 때 주의할 것이 있다:

-- 여러분의 TERM 변수를 살펴보라: 예전에는 console 이 쓰였으니 여러분의 배 포판과 커널 버전에 따라 다르다. 이제는 linux 라고 바뀌었다.

-- 이미 vb 필드가 있는지 알아보라. 배포판 제작자들이 문서를 읽고 이미 그렇 게 해둔 경우도 있을 것이다.

-- 어떤 프로그램들은 termcap 과 terminfo 데이터베이스를 사용하지 않는다. 따라서 vb 설정과 무관하다. terminfo 는 termcap 보다 강력하지만 더 어렵다.

6. 프로그램에게 Visual Bell 에 대해 지시하기

현재의 터미널 타입에 대하여 어플리케이션에게 지시하는 방법에 대하여 목록을 작성해둔 것이다. 앞으로도 많이 추가될 것이다.

tcsh

(6.04 와 이후 ): "set visiblebell". .cshrc 넣거나 직접 입력할 수 있다. 청각적 경고음을 재설정하기 위해서는 unset visiblebell 이라고 해주 면 된다. 불가능으로 설정하기 위해서는 set nobeep 이라고 해준다. issue "set nobeep".

bash

( 본인이 아는 한 모든 버전에서 ): "set bell-style visible"이라는 문 자열을  /.bashrc 에 넣으면 된다. 그 외에도 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 환경변수에 넣어주면 된다.

screen

: CtrlA-CtrlG 명령을 해준다. 모든 가상 스크린에서 작동하게 될 것 이다. 기본설정을 위해서 CUMSTOMIZATION 에 대해서는 맨페이지를 보기 바란 다.

xterm

: xterm 은 각 경고음에 대하여 시각적 신호 또는 청각적 신호로 바꿀 수 있다. 기본설정은 청각적인다. 하지만 명령행에서 -vb 를 사용하거나 리 소스 세팅에서 "xterm*visualBell: true"를 사용하면 된다. Ctrl키와 마우스 버튼 1 번을 누르면 시각적/청각적 신호에 대해 설정 변화를 줄 수 있다.

다른 X 용 어플리케이션

: 여러분은 명령행에서 -f volume 옵션을 줌으로써 X 서버의 볼륨을 조절할 수 있다. 여기서 volume 값은 0 에서 100 까지의 값 이다. X 서버에 어떻게 명령행 옵션을 줄 것인지에 대해서는 X 문서 또는 X 전문가에게 물어보기 바란다.

7. 청각적 경고음 불가능케 하기

여러분이 콘솔에 대하여 시각적 경고를 사용하려고 한다면 termcap 에서 bl 설정부분을 위에서 vb 에 사용하도록 권장한 문자열로 바꿔주면 된다. 이렇게 해주면 각 어플리케이션을 일일이 설정할 필요가 없어진다. 본인은 리눅스를 사용하는 곳에서는 어디나 이렇게 사용하고 있다.

하지만 하드웨어적으로 경고음을 발생시키는 어플리케이션들에는 무력하다.

8. 간편한 설정

콘솔 각각에 대하여 청각적/시각적 경고 설정을 다르게 하려면 리눅스 콘솔에 대하여 2 개의 다른 터미널 유형을 사용하면 될 것이다. 예를 들어 하나는 console 나머지 하나는 console-vb 라고 이름짓도록 해보자. console 은 원래의 설정이고 console-vb 는 시각적 경고 설정을 bl 에 해둔 것 이다. 이렇게 해서 콘솔의 유형에 따라 다른 설정을 가질 수 있다.

-- tcsh 의 경우: 시각적 경고에 대해서는 "setenv TERM console-vb", 청각적 경고음에 대해서는 "setenv TERM console"

-- bash 의 경우: 시각적인 경우 "TERM=console-vb; export TERM", 청각적인 경우 에는 "TERM=console; export TERM"

<알아둘 것> termcap 형식에서는 한 터미널 유형을 설정할 때 다른 것을 사용할 수 있도록 해주고 있다. 따라서 그 차이부분만을 기술해주고 사용한다. 자세한 내용은 맨 페이지를 참고하기 바란다.

9. 다른 해결책들

안타까운 사실은 모든 어플리케이션이 termcap 인식의 소프트웨어는 아니라는 것이다. 대부분의 작은 프로그램들은 C 소스 코드에다가 'backslash-a'를 사용하 는 경우가 많다. 이 부분은 실행화일에서 ASCII BEL 문자로 된다. 대부분의 커 다란 프로그램에서는 이런 문제가 없겠지만서도 C 초보자들은 주의해두기 바란다. 특히나 컴퓨터 관련 과 초보 학생 프로그래머들이 가장 심하다.

이런 프로그램에 대해서 유일한 해결책은 스피커 제거법 또는 Martin Mares 에 의해 제시된 이스케이프 문자열 사용법이다.

예전에 개인적인 패치를 만든 적이 있다. 하지만 이스케이프 문자열로 가능하므로 더 이상 사용하지 않는다. 커널 버전 1.3.42 에 대해서 톤 설정을 하기 위하여 개인적인 패치를 다시 만들었으나 이미 1.3.43 이 나와있다는 것을 발견하고야 말았다. :-)




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-08-10 11:52:30
Processing time 0.0040 sec