自分仕様のキーリマップを設定する

いつの頃からか、かな入力中に意図せず英数入力に変化してしまう、という現象が発生していた。日に何度も起こる。入力のリズムが途切れて、不快である。OSX 10.9.2にアップデートしても状況変わらず。ならば徹底的に調べてみようと思い立って、試行錯誤していると...かな入力中にescキーを押すと、その後は確実に英数入力になってしまう。

その瞬間に気付いた!(あー、これって自分のせいだよね)KeyRemap4MacBookで、「Escape to EISUU+Escape」を有効にしていたのであった。

この設定によって、escキーを押すと、英数キーとescキーを押したことになる。なぜこんな設定が必要なのかというと、これはもう単純にviエディタのモード切替の利便性を狙っている。escキーを押してコマンドモードに戻った時に、かな入力の状態だとガックリするので。ターミナルでvi使う時は、外せない設定なのであった。

「Escape to EISUU+Escape」を無効にすると、かな入力中に意図せず英数入力になってしまう現象はピタリと収まった。でもvi使う時はだけは有効にしておきたい。それ以外では不要な設定。こんな自分勝手な欲求を満たすことができるのか?と調べていたら、最近のKeyRemap4MacBookの進化は素晴らしい!もはやキー入力のことなら、どんなわがままな設定でもできそうな感じ!

設定手順

private.xmlを開く

  • Finderに表示されたprivate.xmlをテキストエディット.app(Xcode.appでもOK)で開く。
  • private.xmlを以下のとおり編集して、保存しておく。
ターミナルを使っている時だけ「Escape to EISUU+Escape」にする設定
  • ターミナル環境のviなので、ターミナル.appに対する入力の時だけ「Escape to EISUU+Escape」を有効にしてみた。
<?xml version="1.0"?>
<root>
	<!-- Terminal, Vim Setting -->
	<item>
		<name>esc to esc and EISUU(only Terminal)</name>
		<identifier>private.terminal.esc_and_eisuu</identifier>
		<only>TERMINAL</only>
		<inputsource_only>JAPANESE</inputsource_only>
		<autogen>
			__KeyToKey__
			KeyCode::ESCAPE,
			KeyCode::ESCAPE, KeyCode::JIS_EISUU
		</autogen>
	</item>
</root>
private.xmlをリロードする
  • KeyRemap4MacBookのPreferences... >> Change Key >> ReloadXML ボタンを押す。
  • private.xmlの設定が、新たなリマップ項目として追加されるので、有効にしておく。


以上の設定をしておくと...

  • ターミナルで入力している時だけ、
  • 日本語入力モードになっている時だけ、
  • escキーを押すと、escキーと英数キーを押した扱いになるのだ!
      • 但し、ターミナルで日本語入力中にescキーで日本語変換をキャンセルした時は、意図せず英数入力になってしまうという副作用は残る。

設定の意味

<?xml version="1.0"?>
<root>
	<!-- Terminal, Vim Setting -->
	<item>								<!-- 1つのリマップ設定は1つのitemタグとして束ねられ、以下の属性を保持する -->
		<name>esc to esc and EISUU(only Terminal)</name>	<!-- remapping項目に表示される名称(必須) -->
		<identifier>private.terminal.esc_and_eisuu</identifier>	<!-- KeyRemap4MacBookが個々の設定を識別するための重複しないIDキー(必須) -->
		<only>TERMINAL</only>					<!-- リマップをターミナルに限定する(指定しなければ常にリマップする) -->
		<inputsource_only>JAPANESE</inputsource_only>		<!-- リマップを日本語入力モードに限定する(指定しなければ常にリマップする) -->
		<autogen>						<!-- 実際のリマップの設定 -->
			__KeyToKey__
			KeyCode::ESCAPE,
			KeyCode::ESCAPE, KeyCode::JIS_EISUU
		</autogen>
	</item>
</root>
  • autogenタグの内容には、様々なリマップの構文がある。
  • 例えば、__KeyToKey__構文は、指定したキー操作を、別のキー操作に置き換える。
  • よって、上記xmlでは、escキーの単独操作を、escキー、英数キーの連続操作に置き換えているのだ。

いろいろなリマップ設定

  • リマップの設定は__KeyToKey__構文が基本なのだと思うが、それ以外にも様々な設定がある。
  • しかし、マニュアルページですべての設定が語られている訳ではない。
  • それでは、さらなる未知のxmlの設定方法をどうやって知るべきか?
  • いろいろ調べてみたが、いちばん参考になりそうなのは、KeyRemap4MacBook自体の中にあるxmlの設定ファイルを覗いてみることだと思った。
  • FinderでKeyRemap4MacBookを選択して、パッケージの内容を表示すると、以下の階層にすべてのリマップ設定が保存されている。
  • なかでも、/Applications/KeyRemap4MacBook.app/Contents/Resources/include/checkbox/samples.xmlには、役立ちそうな実例が多数保存されている。
  • そして、samples.xmlの内容は、KeyRemap4MacBookのPreferences... >> Change Key >> remappingで実際に有効・無効に設定できる!
  • samples.xmlの中に気になる設定を見つけたら、実際にそのリマップを有効にして試してみると、リマップの動作が体感できるのだ!

設定のヒント

__KeyToKey__以外の構文
  • 例えば、どんなリマップ構文があるのか調べてみたかったら、以下のコマンドでリマップ構文のリストを出力できる。
$ grep __ /Applications/KeyRemap4MacBook.app/Contents/Resources/include/checkbox/samples.xml|cut -d_ -f3|sort -u
$ grep __ ~/Downloads/KeyRemap4MacBook/src/core/server/Resources/include/checkbox/samples.xml|cut -d_ -f3|sort -u
DoublePressModifier
DropKeyAfterRemap
DropPointingRelativeCursorMove
DropScrollWheel
FlipPointingRelative
FlipScrollWheel
ForceNumLockOn
HoldingKeyToKey
IgnoreMultipleSameKeyPress
KeyOverlaidModifier
KeyOverlaidModifierWithRepeat
KeyToKey
PassThrough
PointingRelativeToKey
PointingRelativeToScroll
ScrollWheelToKey
ScrollWheelToScrollWheel
SetKeyboardType
ShowStatusMessage
SimultaneousKeyPresses
StripModifierFromScrollWheel
onlyタグで指定できるアプリケーションは?
  • 上記xmlを見ると、以下のように定義されている。
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>EMACS</appname>
    <equal>org.gnu.Emacs</equal>
    <equal>org.gnu.AquamacsEmacs</equal>
    <equal>org.gnu.Aquamacs</equal>
    <equal>org.pqrs.unknownapp.conkeror</equal>
  </appdef>

  <appdef>
    <appname>VI</appname>
    <prefix>org.vim.</prefix>
  </appdef>

...中略...

  <appdef>
    <appname>TERMINAL</appname>
    <equal>com.apple.Terminal</equal>
    <equal>iTerm</equal>
    <equal>net.sourceforge.iTerm</equal>
    <equal>com.googlecode.iterm2</equal>
  </appdef>
  • なるほど、appnameタグが、onlyタグで指定するアプリケーション名称になる。
  • もし、appdef.xmlの中に指定したいアプリケーションが定義されていなければ、private.xmlに自分で追記すれば良いのだ。
onlyタグはコンマで区切って指定できる
  • 例えば、ターミナルのviだけでなく、MacVimなどのアプリケーションでもescキー, 英数キーの連続操作にしたい時は、
  • onlyタグで以下のようにコンマで区切ってアプリケーション名を指定すれば、複数アプリ限定のリマップになるようだ。
<?xml version="1.0"?>
<root>
	<!-- Terminal, Vim Setting -->
	<item>
		<name>esc to esc and EISUU(only Terminal)</name>
		<identifier>private.terminal.esc_and_eisuu</identifier>
		<only>TERMINAL, VI</only>	<!-- コンマで区切って指定 -->
		<inputsource_only>JAPANESE</inputsource_only>
		<autogen>
			__KeyToKey__
			KeyCode::ESCAPE,
			KeyCode::ESCAPE, KeyCode::JIS_EISUU
		</autogen>
	</item>
</root>

参考ページ