キーボードですが、普段ほとんど使わないような記号が打ちやすい場所にあったり、逆に、多様している記号が面倒な所にあったりしますよね。
ということで今回は、Mac のキーボードを、Karabiner、KeyRemap など第三者アプリケーションを使わずにカスタマイズする方法を紹介します。
(※コントロールキーの入れ替えなどはできません。)
というのも、キーボードレイアウトというのはただのXMLファイルなので、それを書いてしまえば良いのです。(直接書くのが面倒な人は Ukelele などを使いましょう。)
レイアウト用 XML の仕様はこちらになります。
https://developer.apple.com/library/mac/technotes/tn2056/_index.html
(真剣に読まなくて大丈夫です。)
自分としては、日本語はもちろん、ドイツ語(ä、ß)やプログラミング(\ 、`)、数学(÷、∫)などに使う記号をスムーズに打ちたいものです。
もともとドイツ語用キーボードをカスタマイズしてたんですが、最近USキーボードに乗り換えたので作り直す、といった背景です。
もちろん、皆さんが普段使っているレイアウト(JIS など)でも同じことですので、効率よく入力したい記号を再配置してみてはいかがでしょうか。
(参考:キーボードの言語の識別方法 https://support.apple.com/HT201794)
すでにこちら(Dropbox)に作ってしまってますので、これをベースに書き換えるか Ukelele で開いて編集するかしちゃってください。
もしくはそのまま使っても構いません(US レイアウトの方)。
(追記:もっといじった黒い森 アドヴァンスもあります。)
インストール方法
ZIPを解凍したものを「~/Library/Keyboard Layouts」に移動してください。
(「黒い森 アドヴァンス」の方はアイコンがあるので、ZIPを解凍したフォルダに入っている両ファイル。)
(Finder を開いて、メニューバーから「移動」→「フォルダへ移動…」もしくは⇧⌘G。
「~/Library/Keyboard Layouts」と入力、エンター。
そこにファイルを移動します。)
あとは、システム環境設定→キーボード→入力ソース→日本語→英字のレイアウトのドロップダウンメニューから「黒い森のキーボード」(もしくは「黒い森 アドヴァンス」)を選択するだけです。
基本
基本的に、キーボードというのは以下の画像のように、一つひとつのキーにキーコードという番号がふられています。
(自分調べなので、間違いがありましたら容赦無くご指摘ください。)
ISO というのが国際標準化機構の規定したもので、イギリス、ドイツをはじめ、世界のほとんどで使われているレイアウトで、僕の慣れ親しんでいるものです。
ANSI となっているのが、いわゆるUSキーボード、これは米国国家規格協会の作成したものですが、他にも韓国、台湾、タイなどで使われているようです。違いとしては、
- 10(左上)が50に入れ替わっている。
- 左 Shift の右側にあったキーが消えている。
- 42と36(右)が入れ替わり、形も変わっている。
JIS がお馴染みの日本工業規格に沿ったキーボードで、当然といえば当然ですが、日本でしか使われていません。KitKat ではありませんが、Mac など海外製品に関してもこれだけ安定のガラパゴス、流石です(苦笑)。こちらの特徴は、
- 10と51の長さが反転。
- 50が右側に移動。
- 2行目(48~51)が左に半分ズレる。
- 左の Shift は International 風、Return (36) は English 風。
- Space の右端に「かな」キーが追加され、 残りのキーがごちゃごちゃする。
このキーコードに対して、「0番キーを押したら a と出力して」などと文字を割り当てて行く訳です。
ファイルの内容の説明
XMLヘッダですが、Ukelele で開く場合、<?XML…の部分を<?xml…に変更しないと開けません。逆に、編集し終わったらまた大文字に戻さないと認識されないことがあります。
<?XML version=“1.1” encoding=“UTF-8”?>
<!DOCTYPE keyboard SYSTEM “file://localhost/System/Library/DTDs/KeyboardLayout.dtd“>
<keyboard group=“0” id=“16382” name=“黒い森のキーボード” maxout=“1”>
name がレイアウトの名前です。id は他のレイアウトのものと重ならなければ何でも良いので適当に(重なっても自動的に他のをアサインしてくれます)。
Modifier
文字を割り当てて行くと書きましたが、ただ単純に「番号→文字」という訳にも行きません。「Shift を押した状態で0番キーを押したら (aではなく) A と出力して」もらわないと困るからです。
また、僕の場合ですが、「alt/option を押した状態で0番キーを押したら ä と出力して」くれるととても助かります。
この「状態」を操作してくれるのが「Modifier」で、それぞれ Index 番号が与えられます。例えば以下(20-22行目)は、
<keyMapSelect mapIndex=“1”>
<modifier keys=“anyShift caps?”/>
</keyMapSelect>
「Index 1番の Modifier となるのは、anyShift (左右問わずシフトが押されている場合)、また、caps? (Caps Lockは問わない)。」
という意味になります。
124行目以降を見ると、
<keyMap index=“1”>
<key code=“0” action=“A”/>
<key code=“1” action=“S”/>
<key code=“2” action=“D”/>
「Index 1番の場合、0番キーはA、1番キーはS、2番キーはD」などとなっているのがわかります。
これを表に直すと、最終的に、以下のようになりました。
今回は Index 0 と 1 に関しては U.S. レイアウトからできるだけ外れないようにしました。
青く塗りつぶしているところについてのみ、0 と 1 を反転しました( ‘ より ” の方を圧倒的に使うのと、- と + を隣り合わせにしたいので)。
Index 2 は alt を押している場合、Index 3 は alt+Shift を押している場合と設定し、こちらはかなり自由に配置しました。
ドイツ語で使う記号も目立ちますが、矢印なんかは皆さんもよく使いませんでしょうか。
f (←) は左側、j (→) は右側、g (↓) は ground、h (↑) は height と覚えます。
日本語入力に際する注意
かなり自由に、例えば3番キーで?(富士山)などといった設定でもできるわけですが、Macの日本語入力を使う場合、設定できない箇所があります。
赤で囲っている、42番と44番キー、JIS規定ではそれぞれ円記号、スラッシュ記号となっているキーですが、こちらのキーの出力記号は、レイアウトではなく環境設定の「”/”キーで入力する文字」「”¥(円記号)”キーで入力する文字」が優先されます。
また、円記号とバックスラッシュに関してはやはり動作が不透明なので trial & error 方式でやるしかありません。(Unicode のバックスラッシュが JIS では 円記号になっているため)
alt+Shift の赤で囲ってあるキーも日本語入力時にはショートカットとなるので使えなくなります。
Dead Key States
オレンジ色で塗りつぶしているキーですが、Dead Key State と言って、使ったことがあるかわかりませんが、「`」の後に「a」と押すと「à」と入力されるやつです。
「黒い森のキーボード」では以下のデッドキーを実装しています。
- Acute Accent (`)
- Circumflex Accent (^)
- Tilde (˜)
- Grave Accent (´)
- Diaeresis (¨)
- Greek (α…)
特に最後の Greek(ギリシャ語)は使い甲斐があると思います。U.S. レイアウトでは、alt+p で π、alt+m で μ など限られたギリシャ文字は入力できますが、デッドキーにしたので、alt+4 を押してから、p で π、m で μ、v で ω、Shift+v で Ω といった具合により柔軟な入力が可能になります。
表に直すと下のようになります(ISO になってますが ANSI でも同じです)。
他のアクセント群に関しても同様に設定行っていきます。
デッドキーの仕組みとしては、
先ほどの124行目以降を見てみますと、
<keyMap index=“1”>
<key code=“0” action=“A”/>
<key code=“1” action=“S”/>
<key code=“2” action=“D”/>
・・・
<key code=“10” action=“Grave Accent (`)”/>
<key code=“11” action=“B”/>
<key code=“12” output=“Q”/>
action となっている所と output となっている所があるのがわかるかと思います。これは本来outputが正しくて、action となているのは
515行目~
<action id=“Grave Accent (`)”>
<when state=“none” next=“Grave Accent (`)”/>
</action>
751行目~
<action id=“A”>
<when state=“none” output=“A”/>
<when state=“Acute Accent (´)” output=“Á”/>
<when state=“Circumflex Accent (ˆ)” output=“”/>
<when state=“Diaeresis (¨)” output=“Ä”/>
<when state=“Grave Accent (`)” output=“À”/>
<when state=“Greek” output=“Α”/>
<when state=“Tilde (˜)” output=“Ô/>
</action>
などとするためです。
index 1 の Modifier で key 10 押すと action “Grave Accent (`)” が実行され、
action “Grave Accent (`)” は state が none(なし)の場合、next(次の) state を Grave Accent (`) に変更します。
アクションとステートの名前を同じにしちゃってますが、別々のものなので、名前が違っても構いません。
この状態から index 1 で key 0 を押すと action “A” が実行され、
action “A” は現在の State によって output を場合分けする、ということです。
State が none (なし)の場合は A になりますが、Grave Accent (`) に変更されているので、output (出力) は À というわけです。
以上です!
皆さんも是非ともキーボード入力の効率化を図ってみてください。