The 42 Of Spaghetti

メモを交えて所有物を淡々と記録するログ

Karabiner:強力なmac用KeyRemapソフトでマウスの動作をカスタマイズ

OS X上でのキーボードの配列を変更したり、特定のショートカットをもっと柔軟に作りたくなることがあります。それを実現してくれるのがこのKarabinerです。
マウスの動作もカスタマイズできるめちゃくちゃ強力なソフトですが、その分ちょっと設定に慣れるまでに時間がかかるのと、ハマった部分があるのでメモをしておきます。


ソフトは以下のサイトからDownloadしてください。インストール方法はサイトに書いてある通りですが、ごく標準的な方法です。
Karabiner - OS X用のソフトウェア

ホイールやbutton4,5の変更方法は、以下の参考ページを参照していただいたほうがわかりやすいです。

参考にしたページ

kainokikaede.hatenablog.com
マウスのホイール方向反転を変更する。qiita.com
マウスをキーボードで代用するためのKalabiner設定。
iPhoneアプリ開発日記 by Clover Tecnology: Macで効率良く作業を行うには「5ボタンマウス」
5ボタンマウスで、button4とbutton5を設定する。

もうすこしカスタマイズ

以上のページにお世話になり、もっと自分好みに変更した結果がこちら。

マウスのキー 機能
右クリック 右クリック
左クリック 左クリック
左クリック押しっぱなし misson controlが立ち上がる
ホイール スクロール
ホイールクリック ホイールクリック
ホイール左 仮想desktopを一つ左に移動
ホイール右 仮想desktopを一つ右に移動
button4 ブラウザの"戻る" ⌘+[
button5 ブラウザの"進む" ⌘+]

このとき、下部4つの機能は自分で書く必要がありそうだったので、機能定義ファイルのprivate.xmlは下記のようになります。

あと、これはJISキーボード用です。
vendorname/vendorid, productname/productidを自分のマウス用に変更すれば流用できると思います。

ちなみにハマった点はgoogle chromeの1password拡張のキーボードショートカットとかぶっていたこと。なかなかマヌケな理由でした。気づけよ!

<?xml version="1.0"?>
<root>
  <devicevendordef>
    <vendorname>BUFFALO</vendorname>
    <vendorid>0x12cf</vendorid>
  </devicevendordef>

  <deviceproductdef>
    <productname>BSMBB27S</productname>
    <productid>0x255b</productid>
  </deviceproductdef>
       <item>
        <name>MiddleClick+CursorMove to ScrollWheel</name>
        <identifier>private.remap.pointing_relative_middleclick_to_scroll</identifier>
        <autogen>
        	__PointingRelativeToScroll__ 
        	PointingButton::MIDDLE
	</autogen>
      </item>
      
        <item>
          <name>Button4 to Command+] (Forward)</name>
          <identifier>private.remap.pointing_button4_to_command_bracket_right</identifier>
          <device_only>DeviceVendor::BUFFALO, DeviceProduct::BSMBB27S</device_only>
          <autogen>__KeyToKey__ PointingButton::BUTTON4, KeyCode::JIS_BRACKET_RIGHT, ModifierFlag::COMMAND_L</autogen>
        </item>
        <item>
          <name>Button5 to Command+[ (Back)</name>
          <identifier>private.remap.pointing_button5_to_command_bracket_left</identifier>
          <device_only>DeviceVendor::BUFFALO, DeviceProduct::BSMBB27S</device_only>          
          <autogen>__KeyToKey__ PointingButton::BUTTON5, KeyCode::JIS_BRACKET_LEFT, ModifierFlag::COMMAND_L</autogen>
        </item>
        
        <item>
            <name>Scroll Left to Move Window Left</name>
            <identifier>private.remap.pointing_wheel_left_to_window_left</identifier>
            <device_only>DeviceVendor::BUFFALO, DeviceProduct::BSMBB27S</device_only>
            <autogen>__ScrollWheelToKey__ ScrollWheel::LEFT, KeyCode::CURSOR_LEFT, ModifierFlag::CONTROL_L</autogen>
        </item>
        
        <item>
            <name>Scroll Right to Move Window Right</name>
            <identifier>private.remap.pointing_wheel_right_to_window_right</identifier>
            <device_only>DeviceVendor::BUFFALO, DeviceProduct::BSMBB27S</device_only>
            <autogen>__ScrollWheelToKey__ ScrollWheel::RIGHT, KeyCode::CURSOR_RIGHT, ModifierFlag::CONTROL_L</autogen>
        </item>
</root>

ざっくりすぎる説明

基本的には、初めのほうにかいてあるとおり、vendorとproductnameをきちんと定義して、あとはで囲まれる中でdevice_onlyを指定して(=マウスのみこの制御に変更する)で、autogenに変更するキーを割り当てればいけます。
nameは機能のon/off時に説明として表示される文章です。
そしてidentifierはユニークであればよいので、自分でカスタマイズ=privateと解釈し、private.remap.〜とわかりやすい識別子にしておけばよいんじゃないかなあ。private.remap.pointing_wheel_right_to_window_rightというのを例に取ると、これは他のものを参考に適当につけています(なので、.でいくつ連ねることができるのかとか、そういうのを一切考えていないです。ダメだったらエラーだすだろうし、という安易な考えです)。

どう機能を見つけるか

構文や定数を全部理解するのはとても大変なので、xmlベースですし、あたりをつけつつサンプルからコピペをすることにします。
例えば「ホイール左で仮想desktopをひとつ左に動く」というのは、「ホイールを左に動かされたらControl+←」という置き換えにすればよいことはわかりますので、各々の方法を探してコピーするわけです。ただ、イベントランチャでホイールの左クリックを監視して見ても、これはマウスポインタのxが増減しているくらいしかわからず、検出方法(というか記述方法)がよくわかりません。

そこで、Karabinerの設定(changekeyの欄です)はサンプルを含め相当なボリュームがあるので、ここにその例もあるに違いない、と探すことにします。
例えばスクロールホイールはScrollWheelと表示されていることが多いので、機能からこの文字列を検索することにします。今回はズルをして、目当ての機能を含む説明文から文字をカットして、それで検索していますが、実際は"ScrollWheel left"とかで検索して、ひとつひとつ見ていっていました。

その状態が以下のもの。
f:id:takafuu:20150919224237j:plain:w300

これはホイールを左に倒すとボリュームがさがる、という機能でしょう。実際ためしてみるとそうでした。
なので、次はnameで指定されているであろう、”ScrollWheel(Left) to Volume Down"のautogenを見ることにします。
そしてボリュームではなく、ショートカットをContorolと←に割り当てたい。

サンプル設定ファイルを探す

サンプル設定ファイルは公式ドキュメントで
/Applications/Karabiner.app/Contents/Resources/include/checkbox/以下にあるよ、とかいてあるので、ここを開きます。
finderでも開けますが、面倒なのでterminalを開いて移動。

cd /Applications/Karabiner.app/Contents/Resources/include/checkbox/

つぎに、このディレクトリ以下の全てのxmlファイルから、"ScrollWheel(Left)"が含まれる行を探します*1

find . -type f -name "*.xml" -print | xargs grep "ScrollWheel(Left)"

実行結果は以下のとおり。

./samples.xml:        <appendix>ScrollWheel(Left) to Volume Down</appendix> 

sample.xml内に記述があるようです。
このファイルを開きます。

open ./samples.xml

これでXcodeが入っていればXcodeが開きます。
それで該当箇所を検索して見る(ver 10.9.0で2076行あたりです)と以下の様な記述があります。

      <item>
        <identifier>remap.samples_ScrollWheelToKey2</identifier>
        <name>Standard (2)</name>
        <appendix>ScrollWheel(Left) to Volume Down</appendix>
        <appendix>ScrollWheel(Right) to Volume Up</appendix>
        <appendix>ScrollWheel(Down) to Left Click</appendix>
        <appendix>ScrollWheel(Up) to Right Click</appendix>
        <autogen>__ScrollWheelToKey__ ScrollWheel::LEFT,  ConsumerKeyCode::VOLUME_DOWN</autogen>
        <autogen>__ScrollWheelToKey__ ScrollWheel::RIGHT, ConsumerKeyCode::VOLUME_UP</autogen>
        <autogen>__ScrollWheelToKey__ ScrollWheel::DOWN,  PointingButton::LEFT</autogen>
        <autogen>__ScrollWheelToKey__ ScrollWheel::UP,    PointingButton::RIGHT</autogen>
      </item>

appendixという見なれないものがありますが、機能の付加的な説明だろうと読み流し、autogenの中身に注目。
__ScrollWheelToKey__ ScrollWheel::LEFTがホイールの左ということなので、これを参考にします。キーを2つにするのも同様にサンプルから学びます*2

できたのがこれ。

        <item>
            <name>Scroll Left to Move Window Left</name>
            <identifier>private.remap.pointing_wheel_left_to_window_left</identifier>
            <device_only>DeviceVendor::BUFFALO, DeviceProduct::BSMBB27S</device_only>
            <autogen>__ScrollWheelToKey__ ScrollWheel::LEFT, KeyCode::CURSOR_LEFT, ModifierFlag::CONTROL_L</autogen>
        </item>

同様にホイール右のも作って、private.xmlに書いてリロード、checkboxにcheckを入れて完了です。
と、慣れるといろいろできるのでとても便利!

*1:ちなみに、前述のように移動せずとも、findのディレクトリ指定を変えれば一行で済みます

*2:マニュアルにざっと目を通すと、キーの指定は結構色々なルールが有るようなので、ことによってはしっかりとそのルールを把握しておく必要もありそうです

広告を非表示にする