XKB Configuration
X 윈도우 키보드 설정 매뉴얼.
http://www.charvolant.org/~doug/xkb/html/index.html
한글 키보드 레이아웃을 구성하기 위해 찾아본 문서를 번역합니다. 중요하지 않은 것 같은 부분은 대강 번역하거나 생략했으니 이 문서로 충분하지 않다고 생각하면 위의 원문 링크를 참조하세요.
1. 기본 ¶XKB 설정은 여러 개의 컴포넌트로 나뉘어 있어서 이것들을 조합해서 키보드 설정을 만들 수 있다. 몇 가지 복잡한 포함 관계와 부가 규칙을 이용하면 특수 키보드와 국가별 특성을 반영할 수 있다. 기본 컴포넌트는 다음과 같다.
1.1. Modifier Keys ¶modifier key는 shift, ctrl, alt 처럼 다른 키의 의미를 바꿔주는 것이다. 이것들은 서로 조합할 수도 있다. 그래서 이게 XKB를 복잡하게 만든다. 기본적으로 XKB는 여덟 개의 modifier key를 지원한다. Control, Shift, Lock과 Mod1-Mod5이 그것이다. Alt 같은 키는 Mod1-Mod5 중 하나에 매핑할 수 있다.
기본적인 modifier key도 쓸만하지만 추상화 레벨를 하나 더 추가할 수 있다면 편리할 것이다. 그래서 virtual modifier key라는 레벨이 존재하며 이를 통해 modifier key를 실재 키 이름이 아닌 키의 역할 이름으로 사용할 수 있다. 이 레는 물리적 키보드와 입력하려는 문자와의 관계를 독립적으로 만든다. types와 compat 컴포넌트가 이 문제를 다룬다.
1.2. 레벨과 그룹 ¶modifier 키를 누르면 키 조합을 바꿀 수 있다. 이론상으로는 무한대로 조합 가능하지만 너무 자유롭게 하면 컴포넌트를 조합하기 어려워진다. 그래서 XKB는 레벨과 그룹이라는 두 가지 조합 원칙을 제시한다.
레벨은 쉬프트 키와 같은 키를 눌렀을 때의 상태를 의미한다. 예를 들어 A키를 누르면 a가 입력되는데 shift 키를 누른 상태에서는 A가 입력되는 것은 shift 키로 레벨이 변했기 때문이다. 대부분의 경우 두 개의 레벨만으로 충분하다. 그 이상에 대해서는 나중에 다시 다룰 것이다.
그룹은 레벨에 비해 좀 애매한 개념이다. 그룹은 키보드 전체의 문자셋을 바꾼다. 주로 다중 언어를 지원하기 위해 사용한다. 그룹 변경 키는 레벨처럼 명확하지 않고 정하기 나름이다.
Figure 1: Levels and Groups on a Single Key
각 그룹 내에도 여러 레벨이 존재할 수 있다.
1.3. Key Codes ¶XKB의 최하부 레이어는 키 코드이다. 원시 키 코드는 특정 키보드가 키를 눌렀는지 뗐는지를 알려주는 숫자 코드이다. X 시스템은 키를 누를 때와 뗄 때 모두 이벤트를 발생시키며 두 가지 경우 모두 키 코드는 어느 키를 누르거나 뗐는지를 알려 준다.
하드웨어 설계자는 어떤 숫자 코드를 쓰든지 상관 없다. keycodes 컴포넌트는 XKB가 심볼 이름을 다양한 키 코드에 매핑할 수 있게 해준다. 심볼 이름은 symbols 컴포넌트에서 비슷한 키보드 레이아웃을 찾는데 사용할 수 있다.
1.4. Key Symbols ¶키 심볼은 키를 누를 때 입력되는 실제 문자나 기호이다. symbol map은 symbolic key code를 적당한 symbol과 매핑시킨다. symbol map은 modifier key도 지정한다. 각 심볼은 X 프로토콜에서 정의한 이름을 갖고 있으며 XKB도 몇 가지 예외를 추가한다. 실제 심볼 이름은 /usr/X11R6/include/X11/keysymdefh에서 볼 수 있다. 그룹과 레벨은 키의 의미를 바꾸기 때문에 symbol map에는 한 키에 대해 그룹과 레벨에 따라 여러 심볼이 매핑될 수 있다.
2. XKB 설정 선택하기 ¶쉽게 생각할 수 있는 방법은 이미 있는 XKB 설정을 이용해서 원하는 특별한 동작을 할 수 있도록 컴포넌트를 조합하는 것이다. 여기서는 /etc/X11/XF86Config-4에 x 설정이 있다고 가정하고 진행할 것이다. 만약 다른 X 구현을 사용한다면 그에 맞는 설정 파일을 찾아야 한다.
먼저 설정 파일의 정의에 어떻게 접근할 것인가를 알아야 한다. 설정 파일들은 그 컴포넌트 이름으로 된 디렉토리 아래에 있다. 그 디렉토리 아래에는 또 다른 서브 디렉토리가 있고 설정 파일이 있다. 설정 파일은 xfree86'과 같은 이름이며 서브 디렉토리는 sgi/iris와 같은 이름이다. 각 파일은 여러 개의 설정을 담는다. 예를 들어 xfree86 keycodes 파일에는 xfree86, basic, 102, jp106, jp109usb, abnt2 등의 설정이 담겨 있다. 이 중에 하나가 기본값으로 지정되어 있으며 기본값을 바꿀 수도 있다. xfree86(pc102)'''와 같이 괄호로 둘러싸면 그 안의 내용을 포함시킬 수 있다.
기본 컴포넌트를 확장할 수도 있다. 몇 가지 추가적인 연산자로 기본 컴포넌트의 의미를 바꾸거나 확장할 수 있다. us(pc101)+ctrl(swapcaps)와 같이 + 연산자를 쓰면 뒤에 있는 컴포넌트가 앞의 컴포넌트를 override한다. 이 의미는 101키의 US 키보드에서 ctrl만 cap과 바꾸도록 하라는 것이다. | 연산자는 기능을 추가하는데 사용된다.
2.1. 쉬운 방법 ¶기본 컴포넌트와 그 확장을 직접 조합하는 것보다 XKB가 제공하는 rules를 쓰는 것이 쉽다. XF86Config-4에 보면 다음과 같은 설정이 있을 것이다.
Section "InputDevice"
Identifier "Keyboard0" Driver "keyboard" Option "XkbRules" "xfree86" Option "XkbModel" "pc104" Option "XkbLayout" "us" Option "XkbVariant" "basic" Option "XkbOptions" "grp:menu_toggle" EndSection 2.2. 다소 원시적인 방법 ¶keymap 컴포넌트는 rules보다 간단하게 기본적인 세팅을 하고 싶을 때 사용한다. 다음과 같이 설정할 수 있다.
Section "InputDevice"
Identifier "Keyboard0" Driver "keyboard" Option "XkbKeymap" "be" EndSection 2.3. 어려운 방법 ¶어려운 방법은 다섯 개의 핵심 컴포넌트를 직접 지정하는 것이다. 그렇게 하면 어떤 세밀한 옵션도 조정 가능하며 키보드 설정 전체를 조정할 수 있다. 다음과 같이 다섯 개의 컴포넌트를 모두 지정한다.
Section "InputDevice"
Identifier "Keyboard0" Driver "keyboard" Option "XkbKeycodes" "xfree86" Option "XkbTypes" "default" Option "XkbCompat" "basic+pc+iso9995+norepeat" Option "XkbSymbols" "en_US(pc104)+dk+ctrl(swapcaps)+group(switch)" Option "XkbGeometry" "pc(pc104)" EndSection
3. XKB 설정 파일 ¶XKB 설정 파일을 만지는 건 노가다성 삽질이다. 대부분의 경우는 그럴 필요가 없으며 완벽하게 설정된 패키지들이 있다. 이 섹션을 보기 전에 #3-1을 먼저 보도록 하라. 그러나, 자신만의 설정을 만들고 싶을 수도 있고 어떤 것을 선택해야할지 알려면 또 어느 정도 이해해야 한다.
핵심 파일은 keycodes, types, compats, symbols, geometry 서브 디렉토리에 있는 컴포넌트들이다. keymap, rules, semantics는 이 핵심 컴포넌트를 묶어주는 역할을 한다.
3.1. 기본 ¶XKB 설정들은 모두 비슷한 구조이다. 하나의 설정 파일이 여러 개의 설정을 담고 있다. 각각의 설정은 다음과 같은 문법으로 이루어진다. 옵션들, 타입과 이름에 이어서 중괄호로 묶인 정보가 오고 세미콜론으로 종료된다. 예를 들면 다음과 같다.
default xkb_keycodes "xfree86" {
include "xfree86(basic)" <BKSL> = 51; <LSGT> = 94; }; include문은 다른 설정을 포함하기 위해 사용한다. include는 override로 작동하며 단순히 추가만 하고 싶을 때는 augment을 사용한다. 여기서 xfree86은 파일명이고 basic은 그 안의 설정 이름이다. 이 파일은 같은 디렉토리에 있는 것을 가정한다.
그리고 상속도 가능하다. 컨텍스트와 그루핑은 중괄호로 둘러 싼다. 부모 컨텍스트의 정보들은 자동으로 상속되며 오버라이드 할 수 있다.
Table 1: Variant Options
3.2. Key Codes ¶키 코드는 키보드 스캔 코드를 심볼릭 형태로 바꾸는 매핑이며 XKB와 키보드가 처음 만나는 곳이다. 그 다음은 키보드에 따라 다르며 어떤 심볼을 사용하느냐에 따라서도 다르다.
다음 에제를 보라.
xkb_keycodes "basic" {
minimum= 8; maximum= 255; <TLDE> = 49; <AE01> = 10; <AE02> = 11; ... indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; ... alias <AE00> = <TLDE>; }; |