시작하기 앞서

KeyMap4MacBook(윈도우용 키보드를 맥에서 사용하는 방법 - KeyRemap4MacBook 어떤 키보드도 내 입맛대로)를 사용함에 있어 필요한 개인 사용자화 설정 공식홈페이지 메뉴얼 private.xml Reference Manual을 부분 번역하고 필요한 부분에 추가적으로 설명을 더 한 것으로, beta 기능 및 고급 사용자화 기능이라 판단되는 부분은 제외하였다.

생략된 내용

  • Specify window name (window title)
  • Specify ui element role
  • Input source
  • Launch app / Open URL / Execute shell commands
  • Include external XML
  • String replacement
  • New virtual modifier definition

은 원문 페이지를 참고하기 바란다.

기본 구조

<?xml version="1.0"?>
<root>
  <item>
    <name>Swap Space and Tab</name>
    <identifier>private.swap_space_and_tab</identifier>
    <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
    <autogen>__KeyToKey__ KeyCode::TAB, KeyCode::SPACE</autogen>
  </item>

  <item>
    <name>Change Right Command Key to Escape</name>
    <identifier>private.right_command_to_escape</identifier>
    <autogen>__KeyToKey__ KeyCode::COMMAND_R, KeyCode::ESCAPE</autogen>
  </item>
</root>

위 2개의 세팅을 private.xml에 추가하면 아래와 같이 옵션 목록에 추가가 된다.
xml_basic

Examples of <autogen>

KeyRemap4MacBook Prefs 하단에 보면 “Samples for KeyRemap4MacBook Developer” 란에서 <autogen> 에 관련된 많은 예제를 볼 수 있으며, smaples.xml파일을 통해서 기본적인 XML을 살펴볼 수 있으므로 참고하기 바란다.

또한 기본적으로 제공되는 세팅들은 checkbox.xml 내부에 기술되어 있으므로 참고하기 바란다.

기초 문법

<item> 태그를 통해 새로운 세팅을 추가할 수 있다.

<?xml version="1.0"?>
<root>

  <item>
    <name>Name of Setting</name>
    <appendix>Optional Description of Setting</appendix>
    <identifier>Unique Identifier of Setting</identifier>
    <autogen>Behavior Definition</autogen>
    <autogen>Behavior Definition</autogen>
  </item>

  <item>...</item>

  <item>...</item>

</root>

<name>, <identifier>, <autogen><item> 태그 내부에 존재해야 한다.

  • <name>, <appendix>
    Preference 에서 확인 할 수 있는 내용
  • <identifier>
    설정을 식별하는 데 사용되는 이름으로 고유한 이름으로 작성해야 한다. 추천하는 방법은 접두사로 ‘private.’을 붙이는 방법이다. 이 방법은 사용자가 정의한 identifier와 기본적으로 제공되는 옵션들의 명칭이 충돌하는 것을 막아준다.
  • <autogen>
    설정의 동작에 대한 정의. 실질적으로 동작하는 부분에 대한 내용이다.
    예) __KeyToKey__, __PointingButtonToKey__
    

KeyCode, ConsumerKeyCode, PointingButton 리스트

KeyToKey 문법

기본

space 키를 tab 키로 변환하는 예제

<autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>

Modifier+Key to Key

왼쪽 control + space 키를 tab 키로 변환하는 예제

<autogen>
  __KeyToKey__
  KeyCode::SPACE, ModifierFlag::CONTROL_L,
  KeyCode::TAB
</autogen>

Modifier+Key to Modifier+Key

왼쪽 control + space 키를 왼쪽 control + tab 키로 변환하는 예제

<autogen>
  __KeyToKey__
  KeyCode::SPACE, ModifierFlag::CONTROL_L,
  KeyCode::TAB,   ModifierFlag::CONTROL_L
</autogen>

다중 옵션 키 (Multiple modifiers)

여러개의 키를 modifier로 사용하고자 할 경우 | 키(shift + enter 위의 역슬래쉬 \ 또는 원화 키)를 사용하면 된다.

아래 예제는 왼쪽 control 키 + fn + space 키를 tab키로 변환하는 예제이다.

<autogen>
  __KeyToKey__
  KeyCode::SPACE, ModifierFlag::CONTROL_L | ModifierFlag::FN,
  KeyCode::TAB
</autogen>

ModifierFlag::NONE

특정 키를 누를때만 (일종의 토글키처럼) 동작하도록 하고자 할 때 사용하는 옵션으로 아래 예제는 fn키와 함께 space바를 누를 때만 tab으로 변환되도록 하는 예제이다.

<autogen>
  __KeyToKey__
  KeyCode::SPACE, ModifierFlag::FN | ModifierFlag::NONE,
  KeyCode::TAB
</autogen>

쉽게 말해 영구적으로 키 리매핑이 아니라 특정 토글키와 함께 누를 때만 리매핑 되도록 하는 방식을 의미한다.

Change to multiple keys

다중키 적용은 , 로 구분된다. 아래는 space 키를 눌렀을 경우 tab, return 키가 다중으로 눌리도록 변환하는 예제이다.

<autogen>
  __KeyToKey__
  KeyCode::SPACE,
  KeyCode::TAB, KeyCode::RETURN
</autogen>

<autogen> 의 우선순위

기본적으로 <autogen>은 첫줄의 내용만 반영된다.

<autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
<autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::RETURN</autogen>

위와 같이 작성한 경우 space 키는 tab으로만 변환된고 return으로는 변환되지 않는다.

만약 shift+space 를 tab으로 바꾸고 space 키를 return키로 바꾸고자 할 경우 아래의 순서로 작성해야 한다.

<!-- shift+space to tab -->
<autogen>__KeyToKey__ KeyCode::SPACE, ModifierFlag::SHIFT_L, KeyCode::TAB</autogen>

<!-- space to return -->
<autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::RETURN</autogen>

만약 순서를 바꿔서 작성할 경우

<!-- KeyRemap4MacBook always changes space key to return key even if you're pressing shift modifier. -->
<autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::RETURN</autogen>

<!-- *** This autogen is never applied. *** -->
<autogen>__KeyToKey__ KeyCode::SPACE, ModifierFlag::SHIFT_L, KeyCode::TAB</autogen>

shift + space 가 아닌 shift + return 이 tab으로 변경된다.

특정 동작을 위한 identifier prefix

아래의 identifier prefix 는 특정한 동작을 위해 사용된다.

  • notsave.
    ‘mode’ 설정을 위한 prefix.
    • 해당 설정은 사용가능한 경우에도 저장되지 않는다.
    • 해당 설정의 우선순위는 일반 설정보다 높다.
    • 해당 설정은 환경설정(preference)에서 설정할 수 없다.
  • passthrough.
    v9.3.14. 에서 해당 기능은 삭제.
    Option::IGNORE_PASSTHROUGH로 대체.

동작 어플리케이션 한정

특정한 어플리케이션에서만 설정이 동작하도록 설정할 수 있다. <only><not><item> 태그 내부에 사용하여 가능하다.

아래 예제는 Safari 에서만 space 키가 tab 키로 변환되도록 한 예제이다.

<?xml version="1.0"?>
<root>
  <item>
    <name>Swap Space and Tab</name>
    <identifier>private.app_safari_swap_space_and_tab</identifier>
    <only>SAFARI</only>
    <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
    <autogen>__KeyToKey__ KeyCode::TAB, KeyCode::SPACE</autogen>
  </item>
</root>

특정 어플리케이션 식별 방법

  1. EventViwer를 실행한다. eventviewer-menu
  2. ‘App’ 탭을 선택하면 현재 활성화 되있는 (창이 선택되어 있는) 어플리케이션의 bundle identifier로 업데이트 된다. eventviewer_app

    설정하고자 하는 어플리케이션으로 창을 전환했다 돌아온 다음 eventviewer 에 업데이트된 내용을 ‘copy to pasteboard’ 버튼을 눌러 저장한다.

private.xml 에 추가하기

  1. <appdef>를 통해 해당 어플리케이션에 대한 정의를 <root> 태그 내부에 추가한다. (<item> 태그 내부가 아님에 주의.)

    <appname><only> 태그 내부에서 사용할 이름이며 <equal> 이 앞에서 eventviwer를 통해 알아낸 어플리케이션의 bundle identifier이다.
    아래 예제는 앱스토어 어플을 사용하기 위해 APPSTORE로 정의하는 예제이다.
    <?xml version="1.0"?>
    <root>
    <appdef>
     <appname>APPSTORE</appname>
     <equal>com.apple.appstore</equal>
    </appdef>
    </root>
    
  2. 위와 같이 정의한 다음에는 <only>APPSTORE</only>처럼 사용이 가능하다.

    <?xml version="1.0"?>
    <root>
    <appdef>
     <appname>APPSTORE</appname>
     <equal>com.apple.appstore</equal>
    </appdef>
    
    <item>
     <name>Space to Tab in App Store.app</name>
     <identifier>private.appdef</identifier>
     <only>APPSTORE</only>
     <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
    </item>
    </root>
    

기본적으로 제공되는 어플리케이션 정의

KeyRemap4MacBook 은 기본적으로 다양한 어플리케이션 정의를 제공한다. 링크에 나와있는 어플리케이션들은 <appdef> 를 통한 정의없이 바로 사용이 가능하다.

또한, 기본적으로 제공되는 정의된 어플리케이션에 대해서도 재정의가 가능하다.

특정 장치 한정

특정한 장치에서만 동작하도록 설정이 가능하다. 이때 사용되는 태그는 <device_only> 또는 <device_not> 이며 <item> 내부에 작성되어야 한다.

다음 예제는 Magic Mouse 에서만 scroll wheel 기능일 off 시키는 예제이다.

<?xml version="1.0"?>
<root>
  <item>
    <name>Disable ScrollWheel on Magic Mouse</name>
    <identifier>private.dropscrollwheel_0x05ac_0x030d</identifier>
    <device_only>DeviceVendor::APPLE_COMPUTER,DeviceProduct::MAGIC_MOUSE</device_only>
    <autogen>__DropScrollWheel__</autogen>
  </item>
</root>

설정 방법

원하는 장치의 Vendor ID와 Product ID 식별

  1. EventViewer를 실행한다. eventviewer_menu
  2. Device탭을 선택하면 현재 연결된 장치의 정보들을 볼 수 있고 원하는 정보를 클릭하여 copy to pasteboard를 눌러 저장한다. eventviewer_device

Private 추가하기

  1. 어플리케이션때와 마찬가지로 장치에 대한 이름을 정의해주어야 한다. <devicevendordef><deviceproductdef> 태그를 통해 정의해준다. 마찬가지로 <root> 내부에 들어가야 함에 주의.

    <!--example-->
    <?xml version="1.0"?>
    <root>
    <devicevendordef>
     <vendorname>HEWLETT_PACKARD</vendorname>
     <vendorid>0x03f0</vendorid>
    </devicevendordef>
    
    <deviceproductdef>
     <productname>MY_HP_KEYBOARD</productname>
     <productid>0x0224</productid>
    </deviceproductdef>
    </root>
    
  2. 정의를 한 다음에는 vendorname 과 productname 을 <device_only> 또는 <device_not> 에서 다음과 같이 사용할 수 있다.

    <?xml version="1.0"?>
    <root>
    <devicevendordef>
     <vendorname>HEWLETT_PACKARD</vendorname>
     <vendorid>0x03f0</vendorid>
    </devicevendordef>
    
    <deviceproductdef>
     <productname>MY_HP_KEYBOARD</productname>
     <productid>0x0224</productid>
    </deviceproductdef>
    
    <item>
     <name>Space to Tab in MY_HP_KEYBOARD</name>
     <identifier>private.deviceproductdef</identifier>
     <device_only>DeviceVendor::HEWLETT_PACKARD, DeviceProduct::MY_HP_KEYBOARD</device_only>
     <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
    </item>
    </root>
    

기본적으로 제공되는 장치 정의

기본적으로 재공되는 Vendor ID 와 Product ID 정의를 통해 어플리케이션과 마찬가지로 바로 사용 가능하다.

역시나 기존 정의를 재정의 하는 것도 가능하다.

동일한 Vendor ID를 가지는 여러 장치들을 식별하는 방법

이때는 Location ID를 통해 구별 가능하다. 예를 들어 USB 장치의 경우 USB port에 따라 값이 바뀌며 장치를 제거했다가 다시 연결할 경우 해당 값은 변동된다. 반대로 Bluetooth의 경우 Location ID는 Bluetooth address에 따라 결정되므로 고정된 값을 가진다.

eventviewer_locationID

아래와 같은 방법을 통해 로케이션 아이디를 정의하고 사용가능하다.

<?xml version="1.0"?>
<root>
  <devicevendordef>
    <vendorname>HEWLETT_PACKARD</vendorname>
    <vendorid>0x03f0</vendorid>
  </devicevendordef>

  <deviceproductdef>
    <productname>MY_HP_KEYBOARD</productname>
    <productid>0x0224</productid>
  </deviceproductdef>

<!-- location ID 정의 부분 -->
  <devicelocationdef>
    <locationname>MY_HP_KEYBOARD_PRIMARY</locationname>
    <locationid>0xfa120000</locationid>
  </devicelocationdef>
  <!----------------------->


  <item>
    <name>Space to Tab in MY_HP_KEYBOARD</name>
    <identifier>private.deviceproductdef</identifier>
    <device_only>
      DeviceVendor::HEWLETT_PACKARD,
      DeviceProduct::MY_HP_KEYBOARD,
      <!-- location ID 추가 된 부분 -->
      DeviceLocation::MY_HP_KEYBOARD_PRIMARY,
      <!---------------------------->

    </device_only>
    <autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>
  </item>

</root>

예를 들면 윈도우용 블루투스 키보드를 사용하고자 할 경우 기본적인 방법으로 키를 리맵하게 되면 다시 맥용 키보드를 사용할 때는 옵션을 해제하거나 프로그램을 종료 시켜야 하는 번거로움이 있지만 이 방법을 통해 각 장치별로 개별 설정이 가능하다.

새로운 KeyCode 정의

<symbol_map> 태그를 사용하여 새로운 KeyCode를 정의가능하다. 아래는 시스템 키값이 ‘0x32’ 인 키를 ‘MY_LANGUAGE_KEY’ 로 정의하는 예제.

<?xml version="1.0"?>
<root>
  <symbol_map type="KeyCode" name="MY_LANGUAGE_KEY" value="0x32" />

  <item>
    <name>Change KeyCode::MY_LANGUAGE_KEY to tab.</name>
    <identifier>private.my_language_key_to_tab</identifier>
    <autogen>__KeyToKey__ KeyCode::MY_LANGUAGE_KEY, KeyCode::TAB</autogen>
  </item>
</root>

KeyCode::RawValue::실제 시스템 원래값(raw key value)을 통해 정의없이 바로 사용하는 방법

위 처럼 정의없이 실제값을 KeyCode::RawValue::를 통해 사용하는 방법도 가능하다. 예제 참고.

<?xml version="1.0"?>
<root>
  <item>
    <name>Change right option key to tab key</name>
    <identifier>private.right_option_key_to_tab_key</identifier>
    <!-- change right option key (0x3d) to tab key (0x30) -->
    <autogen>__KeyToKey__ KeyCode::RawValue::0x3d, KeyCode::RawValue::0x30</autogen>
  </item>
</root>

기본적으로 제공되는 옵션들을 편집하는 방법

  1. github repository에서 소스코드를 다운받는다.

  2. 기본 옵션들은 아래 파일들에 각각 정의되어 있다.

  3. XML 파일을 설치한다. 아래의 명령어를 터미널 상에서 실행한다.

    $ cd src/core/server/Resources
    $ make install
    

    (수정을 위해 관리자 비밀번호를 묻는다.)

  4. 설치 후 환경설정의 ReloadXML 버튼을 통해 새로고침을 하여 적용하면 된다.reload_xml

관련글

신고