X 윈도우 키보드 설정 매뉴얼. http://www.charvolant.org/~doug/xkb/html/index.html 한글 키보드 레이아웃을 구성하기 위해 찾아본 문서를 번역합니다. 중요하지 않은 것 같은 부분은 대강 번역하거나 생략했으니 이 문서로 충분하지 않다고 생각하면 위의 원문 링크를 참조하세요. [[TableOfContents]] == 기본 == XKB 설정은 여러 개의 컴포넌트로 나뉘어 있어서 이것들을 조합해서 키보드 설정을 만들 수 있다. 몇 가지 복잡한 포함 관계와 부가 규칙을 이용하면 특수 키보드와 국가별 특성을 반영할 수 있다. 기본 컴포넌트는 다음과 같다. * '''key codes''' 키보드 스캔코드를 심볼릭 코드로 바꾼 것 * '''key symbols''' key codes를 '''A'''와 같은 심볼로 바꾼 것 * '''compatibility map''' 특수 목적 키의 동작에 대한 정의 * '''type''' 쉬프트 조합에 대한 정의 * '''geometry''' 키보드의 실제 레이아웃에 대한 설명 이외에 rules, semantics, keymaps 등은 위의 기본 컴포넌트들을 조합하는데 쓰인다. === 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 컴포넌트가 이 문제를 다룬다. === 레벨과 그룹 === modifier 키를 누르면 키 조합을 바꿀 수 있다. 이론상으로는 무한대로 조합 가능하지만 너무 자유롭게 하면 컴포넌트를 조합하기 어려워진다. 그래서 XKB는 레벨과 그룹이라는 두 가지 조합 원칙을 제시한다. 레벨은 쉬프트 키와 같은 키를 눌렀을 때의 상태를 의미한다. 예를 들어 A키를 누르면 a가 입력되는데 shift 키를 누른 상태에서는 A가 입력되는 것은 shift 키로 레벨이 변했기 때문이다. 대부분의 경우 두 개의 레벨만으로 충분하다. 그 이상에 대해서는 나중에 다시 다룰 것이다. 그룹은 레벨에 비해 좀 애매한 개념이다. 그룹은 키보드 전체의 문자셋을 바꾼다. 주로 다중 언어를 지원하기 위해 사용한다. 그룹 변경 키는 레벨처럼 명확하지 않고 정하기 나름이다. http://www.charvolant.org/~doug/xkb/html/img2.png Figure 1: Levels and Groups on a Single Key 각 그룹 내에도 여러 레벨이 존재할 수 있다. === Key Codes === XKB의 최하부 레이어는 키 코드이다. 원시 키 코드는 특정 키보드가 키를 눌렀는지 뗐는지를 알려주는 숫자 코드이다. X 시스템은 키를 누를 때와 뗄 때 모두 이벤트를 발생시키며 두 가지 경우 모두 키 코드는 어느 키를 누르거나 뗐는지를 알려 준다. 하드웨어 설계자는 어떤 숫자 코드를 쓰든지 상관 없다. '''keycodes''' 컴포넌트는 XKB가 심볼 이름을 다양한 키 코드에 매핑할 수 있게 해준다. 심볼 이름은 symbols 컴포넌트에서 비슷한 키보드 레이아웃을 찾는데 사용할 수 있다. === Key Symbols === 키 심볼은 키를 누를 때 입력되는 실제 문자나 기호이다. symbol map은 symbolic key code를 적당한 symbol과 매핑시킨다. symbol map은 modifier key도 지정한다. 각 심볼은 X 프로토콜에서 정의한 이름을 갖고 있으며 XKB도 몇 가지 예외를 추가한다. 실제 심볼 이름은 /usr/X11R6/include/X11/keysymdefh에서 볼 수 있다. 그룹과 레벨은 키의 의미를 바꾸기 때문에 symbol map에는 한 키에 대해 그룹과 레벨에 따라 여러 심볼이 매핑될 수 있다. == 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과 바꾸도록 하라는 것이다. | 연산자는 기능을 추가하는데 사용된다. === 쉬운 방법 === 기본 컴포넌트와 그 확장을 직접 조합하는 것보다 XKB가 제공하는 '''rules'''를 쓰는 것이 쉽다. XF86Config-4에 보면 다음과 같은 설정이 있을 것이다. {{{#!vim xf86conf Section "InputDevice" Identifier "Keyboard0" Driver "keyboard" Option "XkbRules" "xfree86" Option "XkbModel" "pc104" Option "XkbLayout" "us" Option "XkbVariant" "basic" Option "XkbOptions" "grp:menu_toggle" EndSection }}} /usr/X11R6/lib/X11/xkb/rules/xfree86.lst 파일에 보면 다양한 구성 요소에 대한 설명이 있다. 간단히 설명하면 * '''XkbRules''' 설정 rule의 집합을 정의한다. XFree86에서는 xfree86이 되어야 한다. 다른 것으로는 sgi나 sun이 있다. * '''XkbModel''' 키보드 타입. pc104는 일반적인 104키 키보드 * '''XkbLayout''' 키보드 레이아웃. 주로 국가별 키보드 레이아웃을 위한 것이지만 드보락과 같은 자판을 지원하기 위해서도 사용한다. * '''XkbVariant''' 일반적인 레이아웃의 작은 차이를 기술한다. 이건 보통 basic으로 설정한다. * '''XkbOption''' 기타 옵션. 그룹 변경 키 등을 정의한다. === 다소 원시적인 방법 === '''keymap''' 컴포넌트는 '''rules'''보다 간단하게 기본적인 세팅을 하고 싶을 때 사용한다. 다음과 같이 설정할 수 있다. {{{#!vim xf86conf Section "InputDevice" Identifier "Keyboard0" Driver "keyboard" Option "XkbKeymap" "be" EndSection }}} === 어려운 방법 === 어려운 방법은 다섯 개의 핵심 컴포넌트를 직접 지정하는 것이다. 그렇게 하면 어떤 세밀한 옵션도 조정 가능하며 키보드 설정 전체를 조정할 수 있다. 다음과 같이 다섯 개의 컴포넌트를 모두 지정한다. {{{#!vim xf86conf 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 }}} * '''xfree86''' 표준 XFree86 키보드를 사용한다. * '''default''' 레벨에 대한 기본 설정값을 사용한다. * '''basic+pc+iso9995+norepeat''' 호환성을 위한 지정. 그룹과 레벨 컨트롤 * '''en_US(pc104)+dk+ctrl(swapcaps)+group(switch)''' 키보드의 심볼 레이아웃 * '''pc(pc104)''' bog-standard 104-key PC keyboard를 쓴다는 의미 == XKB 설정 파일 == XKB 설정 파일을 만지는 건 노가다성 삽질이다. 대부분의 경우는 그럴 필요가 없으며 완벽하게 설정된 패키지들이 있다. 이 섹션을 보기 전에 #3-1을 먼저 보도록 하라. 그러나, 자신만의 설정을 만들고 싶을 수도 있고 어떤 것을 선택해야할지 알려면 또 어느 정도 이해해야 한다. 핵심 파일은 keycodes, types, compats, symbols, geometry 서브 디렉토리에 있는 컴포넌트들이다. keymap, rules, semantics는 이 핵심 컴포넌트를 묶어주는 역할을 한다. === 기본 === XKB 설정들은 모두 비슷한 구조이다. 하나의 설정 파일이 여러 개의 설정을 담고 있다. 각각의 설정은 다음과 같은 문법으로 이루어진다. 옵션들, 타입과 이름에 이어서 중괄호로 묶인 정보가 오고 세미콜론으로 종료된다. 예를 들면 다음과 같다. {{{#!vim xkb default xkb_keycodes "xfree86" { include "xfree86(basic)" = 51; = 94; }; }}} default는 옵션, xkb_keycodes는 타입, "xfree86"은 이름이고 중괄호 안이 내용이다. include문은 다른 설정을 포함하기 위해 사용한다. include는 override로 작동하며 단순히 추가만 하고 싶을 때는 augment을 사용한다. 여기서 xfree86은 파일명이고 basic은 그 안의 설정 이름이다. 이 파일은 같은 디렉토리에 있는 것을 가정한다. 그리고 상속도 가능하다. 컨텍스트와 그루핑은 중괄호로 둘러 싼다. 부모 컨텍스트의 정보들은 자동으로 상속되며 오버라이드 할 수 있다. Table 1: Variant Options || default || 해당 설정을 파일의 기본값으로 한다. || || partial || 이 설정은 일부분이며 다른 파일에 포함되어 사용한다는 것을 표시한다. || || hidden || 설정 파일 내에서만 사용되며 공통 부분을 포함시킬 때 유용하다. || || alphanumeric_keys || #4-3 || || modifier_keys || #4-3 || || keypad_keys || #4-3 || || function_keys || #4-3 || || alternate_group || #4-3 || === Key Codes === 키 코드는 키보드 스캔 코드를 심볼릭 형태로 바꾸는 매핑이며 XKB와 키보드가 처음 만나는 곳이다. 그 다음은 키보드에 따라 다르며 어떤 심볼을 사용하느냐에 따라서도 다르다. 다음 에제를 보라. {{{#!vim xkb xkb_keycodes "basic" { minimum= 8; maximum= 255; = 49; = 10; = 11; ... indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; ... alias = ; }; }}} 선언부는 #4-1을 바탕으로 이해할 수 있을 것이다. maximum과 minimum은 키코드 최대 최소값이다. = 49는 키코드 49를 심볼 TLDE에 매핑시킨다는 뜻이다. 이 심볼은 '''symbols''' 컴포넌트에서 정의된다. 그리고 이에 대한 컨벤션은 다음과 같다. http://www.charvolant.org/~doug/xkb/html/img3.png Figure 2: Key Code Naming Conventions indicator는 키보드 LED를 지정하는 것이다. === Symbols === === Types === === Compatibility Maps === === Geometry === === Directory Files === === Grouping Component === == XKB 프로그램들 == == 키보드 예제. Happy Hacking Keyboard Lite == CompleteMe