キー配列を最適化してプログラミングの生産性を倍にしよう! OSX限定
現代のキーボードの配列はアルファベットを中心にしたQWERTYが主流です。これは1882年に完成されたそうです1。もちろんコンピュータが生まれる以前です。
一方プログラミングではアルファベット以外の記号を頻繁に打鍵します。例えばRubyでは _ = - + : [ { ( . ? ‘ “などの記号の使用頻度はとても高いです。ところがUSキーボードを使っている場合、上記のうち : [ { . ? ‘ “ は良いですが、_ = - + ( が最上段に位置していてタッチタイピングしづらいです。
これはプログラムの生産性に大きく影響しそうです。なぜならこれらのキー入力が出現するたびに、目視でその位置を確認するか当て推量で外すかして、それによって入力のリズムが崩れてしまうからです。
つまりこれらのキーの配列をホームポジションで所掌できる範囲内に収めることができれば、プログラムの生産性は飛躍的に向上すると思われます2。
きっと…
そんなわけで、ここでは自分が取っているキー配列とその実現方法を書きます。環境はMac OS X Tiger + Apple keyboard(US)です。なおMacVimとTextMateとTerminalでこれらのキーバインドを使えるようになることが前提となっています。
まだTigerかよ!というツッコミは無視して..
USキーボードを使う
USキーボードはJISに比べて美しく使いやすいです。しかしCtrlキーが最下段で使いづらいという点と、IMEの切換えが不便という欠点があります。以下によりこれを解決・緩和します。
- Caps LockキーにCtrlキーを割り当てる これは、[システム環境設定->キーボードとマウス->キーボード->修飾キー]と辿って設定変更できます。
- IMEのon/offをCtrl+Jに割り当てる これは同じく、[キーボードとマウス->キーボードショートカット]と辿って入力メニューにおける[前の入力ソースを選択する]のショートカットをCtrl+Jにすることで変更できます。
_と;を入れ替える
Rubyではアンダースコアを頻繁に打つ一方で、セミコロンはほとんど使わないのでこれらを入れ替えます。
HOMEディレクトリ下にあるDefaultKeybindig.dictに以下を追記します。ファイルがなければ作成します。
~/Library/KeyBindings/DefaultKeybinding.dict
{
/* customize single stroke key */
";" = ("insertText:", "_");
"_" = ("insertText:", ";");
}
これで右小指をそのまま打つだけでアンダースコアが打てるようになるので、Rubyでコードを書く場合は非常に便利です。
KeyRemap4MacBookを使う
Macにおけるキー配列の変更になくてはならないツールです。
- シフトキーをスペースキーに割り当てる
[Remap Space Key]の[Space to Shift_L (+ When you type Space only, send Space)]にチェックを入れます。
これによって、スペースキーがシフトキーのModifierとしての役割をします。つまりスペースを押しながら、アルファベットを押せば大文字になります。一方でスペースキーを単独で押したときは、元通りにスペースを入力します。これに慣れるとアルファベットの位置に応じて、左シフトを押したり右シフトを押したりしていた煩わしさが何だったのかと感じるようになります。
- =(equal) -(minus) +(plus) ( (round bracket)の移動
これらのキーの設定は以下の通りです。
1. Ctrl+;で=
2. Ctrl+'で-
3. Ctrl+Shift+'で+
4. Ctrl+Shift+iで(
5. Ctrl+Shift+oで)
KeyRemap4MacBookではちょっと手数を要しますが、未定義のキーバインドを定義することができます3。上記のキーについてはこれを利用します。なおこれらの設定は上記のDefaultKeybinding.dictでもできますが、MacVimではそれが反映されなかったためこちらを利用します。
詳細は本家に譲りますが概略をここに書いておきます。基本はソースを取得し定義ファイルを書き換えて再ビルドします。なおSnow Leopard向けヴァージョンではソースのビルドをすることなく、設定の変更ができるようになっているようです。
まずソースを取得してその中のfiles/prefpane/checkbox.xmlの最後に、以下の項目を追加します4。
<item>
<name>My Custom Keys</name>
<list>
<item>
<name>Remap Ctrl+Semicolon to Equal</name>
<sysctl>remap.ctrlsemicolon2equal</sysctl>
<autogen>--KeyToKey-- KeyCode::SEMICOLON, VK_CONTROL, KeyCode::EQUAL</autogen>
</item>
<item>
<name>Remap Ctrl+Shift+Quote to Plus</name>
<sysctl>remap.ctrlshiftquote2plus</sysctl>
<autogen>--KeyToKey-- KeyCode::QUOTE, VK_CONTROL | ModifierFlag::SHIFT_L, KeyCode::KEYPAD_PLUS</autogen>
</item>
<item>
<name>Remap Ctrl+Quote to Minus</name>
<sysctl>remap.ctrlquote2minus</sysctl>
<autogen>--KeyToKey-- KeyCode::QUOTE, VK_CONTROL, KeyCode::MINUS</autogen>
</item>
<item>
<name>Remap Ctrl+Shift+i_and_o to RoundBracket</name>
<sysctl>remap.ctrlshiftsquarebracket2roundbracket</sysctl>
<autogen>--KeyToKey-- KeyCode::I, VK_CONTROL | ModifierFlag::SHIFT_L, KeyCode::KEY_9, ModifierFlag::SHIFT_L</autogen>
<autogen>--KeyToKey-- KeyCode::O, VK_CONTROL | ModifierFlag::SHIFT_L, KeyCode::KEY_0, ModifierFlag::SHIFT_L</autogen>
</item>
</list>
</item>
- My Custom Keysはグルーピングの名前です
- 各itemにはname, sysctl, autogenの項目があってautogenでキーの割り当てを定義します
- 修飾キーがある場合はKeyCodeの後にカンマで区切って書きます
- 修飾キーが複数ある場合は | で繋ぎます
- KeyCodeの定義名は src/core/kext/keycode.hppで定義されています
- 1つのitemに複数のautogenを定義できます
- itemのname項目はパネルにおける各表題名になります
- itemのsysctlはよくわかりませんが内部関数名か何かになると思います
- VK_CONTROLとModifierFlag::CONTROL_Lの使い分けはよくわかりません
本家の[設定の追加方法]の手順に従ってビルド・パッケージ化して、アプリケーションを再インストールします。
自分は定義ファイルを何度も書き換えてビルドを繰り返していたので、以下のようなRubyスクリプトを用意してバッチ処理していました。
keyremap_pkg.rb
#!/opt/local/bin/ruby1.9
#-*-encoding: utf-8-*-
# Build KeyRemap4MacBook pkg
def keyremap_pkg
root = Dir.pwd
Dir.chdir(root+"/src/core/kext")
if system("make") && system("make reload")
Dir.chdir(root+ "/files/prefpane")
if system("make install")
Dir.chdir(root)
system("make")
system("open #{Dir["KeyRemap4MacBook*.pkg"][0]}")
end
end
end
keyremap_pkg
このファイルをダウンロードしたソースのルートに配置し、以下を実行すればパッケージのインストール手前まで完了します。
sudo ruby keyremap_pkg.rb
パッケージのインストール後に再起動が必要になります。
以上により次のようなキー配列が得られます。
1. ;で_
2. CapsLock+;で=
3. CapsLock+'で-
4. CapsLock+Space+'で+
5. CapsLock+Space+iで(
6. CapsLock+Space+oで)
その結果、Rubyで良く使う _ = - + : [ { ( . ? ‘ “のキーはタッチタイプできるエリア内に収まりました。
これで明日からは生産性が倍になりますね!
きっと…
なお実はアンダースコアとセミコロンの入れ替えもKeyRemap4MacBookで実現したかったのですが、2つのキーを入れ替えるという方法がわからなかったので、DefaultKeybinding.dictのほうでこれを実現しました。分かる方がいましたら教えてください。
(追記:2010-11-28)iTermではCapsLock+Space+’が動きません。一方でどこで設定されているのか、iTermに限らずCapsLock+Space+;で+が入力できるようになっています。そのため自分の環境ではRemap Ctrl+Shift+Quote to Plusの設定は不要かも知れません。
(追記:2010-11-29)Ctrl+Shift+[はTextMate上のkeybindとconflictしていたため、round bracketの設定先をCtrl+Shift+iおよびoに変えました。
[関連記事]
blog comments powered by Disqus