Finderの設定はこちら。
最近、vimに夢中になりつつあるのですが、vimを使っていると移動操作←↓↑→をhjklで実現したくなります。
Adobe Readerをhjklで使いたかった理由
最初Adobe Readerでhjklを使いたいと思いました。なぜAdobe Readerなのかは、おそらくMacただ一つの見開きで表示できるPDFビューアーだからです。
そこでMacだとキーバインドの変更はキーボードカスタマイズツールKarabiner(旧KeyRemap4MacBook)で実現できそうなことがわかりました。
『Vim以外でVimする: Mac編』やKarabinerマニュアルや『設定の追加の方法』などをなんとなく見て、多すぎるデフォルトの設定をさわったりしてみたのですが、まずAdobe Readerに設定が施せるのかわかりません。プロプライエタリなソフトなので根本的に無理な場合もあるのかもと思いました。(今考えてみると、たぶんKarabinerはプロプライエタリなソフトにこそ力を発揮するソフトですね。)
そこでダメモトでGoogle Group Karabiner-jpへ質問してみました。
で、なんとKarabinerの作者の方からAdobe Reader用のprivate.xml
をいただきました。(コードの下にGitHubのリンクもあります。)
Adobe Reader用の設定
<?xml version="1.0"?>
<root>
<item>
<name>Use "hjkl" keys as arrow keys in Adobe Reader.</name>
<identifier>private.hjkl_arrow_adobe_reader</identifier>
<only>ADOBE</only>
<uielementrole_not>AXTextField, AXTextArea</uielementrole_not>
<modifier_only>
ModifierFlag::NONE,
ModifierFlag::SHIFT_L | ModifierFlag::NONE,
ModifierFlag::SHIFT_R | ModifierFlag::NONE,
</modifier_only>
<autogen>__KeyToKey__ KeyCode::H, KeyCode::CURSOR_LEFT</autogen>
<autogen>__KeyToKey__ KeyCode::J, KeyCode::CURSOR_DOWN</autogen>
<autogen>__KeyToKey__ KeyCode::K, KeyCode::CURSOR_UP</autogen>
<autogen>__KeyToKey__ KeyCode::L, KeyCode::CURSOR_RIGHT</autogen>
</item>
</root>
https://github.com/tekezo/Files/blob/master/Karabiner/private.hjkl_arrow_adobe_reader/private.xml
で、実際に~/Library/Application Support/Karabiner/private.xml
へ保存し、GUIで[Reload XML](キャプチャ)を試してみると動く。(詳細はわかりやすいGUIキャプチャ画面付きの『設定の追加の方法』を参照してください。)とにかくうれしい。
補足:Adobe Acrobat Reader DCも、あとで見るKarabinerのEventViewerがApplication Bundle Identifierの値が同じなので、この設定で動作します。
遅ればせながら調べてみると、『MacのPreview.appでvimキーバインドを使って移動』の記事もありました。
そして、この記事を書いている間に、ドキュメントを調べる内にできることがだんだん掴めてきました。
シンタックス1
使われているシンタックスはBasic syntaxなどにあるように、次のようになっています。
<name>:[Reload XML]
のボタンをおした時にKarabinerのPreference Panceにチェックリストの説明として表示されます。
<identifier>:設定IDです。ユニークなもので、private.
プリフィックスをつけることが推奨されています。
<only>:設定するアプリを指定します。今回はAdobe ReaderとKindleの<item>をそれぞれ作成していますが、<only>ADOBE, KINDLE</only>
と複数指定することもできます。指定できる名前はシンタックス2で説明している<appname>で定義されているIDです。
<uielementrole_not>:設定しないUI element roleを指定します。今回の設定ではテキストフィールド(AXTextField)とテキストエリア(AXTextArea)を除外しています。
<modifier_only>:今回の設定ではモディファイア(AltやCtrlなどキーの振る舞いを変更するキー)が押されていないときか、
シフトキーが押されていたときだけ<autogen>で設定されたキーバインドを有効にしています。
<autogen>:キーに割り振る振る舞いを定義します。
Kindleの設定
電子書籍管理はCalibreを使っているのですが、Kindle for Macの辞書機能は捨てがたいものがあります。
最初アプリの指定方法が、いただいたprivate.xml
には<appdef>
が存在しておらず、途方にくれたのですが、Filter: Specify applicationに回答がありました。(Adobe Readerの場合はすでに/Applications/Karabiner.app/Contents/Resources/appdef.xml
でADOBE
として定義されているのでprivate.xml
で改めて<appdef>
を定義する必要がなかったのでした。)
Filter: Specify applicationにあるようにKarabinerのEventViewerを起動して、Application Bundle Identifierにてアプリが特定できれば(キャプチャ)、下記の<appdef>
を追加するだけです。あとはAdobe Reader用の設定を少し修正するだけでした。(<?xml version="1.0"?>
と
<root></root>
の間に貼り付けてください。)
<appdef>
<appname>KINDLE</appname>
<equal>com.amazon.Kindle</equal>
</appdef>
<item>
<name>Use "hjkl" keys as arrow keys in Amazon Kindle</name>
<identifier>private.hjkl_arrow_amazon_kindle</identifier>
<only>KINDLE</only>
<uielementrole_not>AXTextField, AXTextArea</uielementrole_not>
<modifier_only>
ModifierFlag::NONE,
ModifierFlag::SHIFT_L | ModifierFlag::NONE,
ModifierFlag::SHIFT_R | ModifierFlag::NONE,
</modifier_only>
<autogen>__KeyToKey__ KeyCode::H, KeyCode::CURSOR_LEFT</autogen>
<autogen>__KeyToKey__ KeyCode::J, KeyCode::CURSOR_DOWN</autogen>
<autogen>__KeyToKey__ KeyCode::K, KeyCode::CURSOR_UP</autogen>
<autogen>__KeyToKey__ KeyCode::L, KeyCode::CURSOR_RIGHT</autogen>
</item>
シンタックス2
<appdef>:デバイスを定義します。
<appname>:ユニークなID。/Applications/Karabiner.app/Contents/Resources/appdef.xml
に定義済みのものと被らないようにしましょう。
<equal>:KarabinerのEventViewerを起動してApplication Bundle Identifieに表示されるIDです。
その他動作対象のフィルター方法
Karabinerが動作する対象をフィルターする方法は、アプリ名で指定する方法(Filter: Specify application)の他には次のものもあります。
- Filter: Specify window name (window title)(ウィンドウ名で指定する方法)
- Filter: Specify ui element role
- Filter: Specify device(デバイスメーカー名で指定する方法)
- Filter: Specify input source
Finderの設定
Finderの設定はデフォルトで入っています。『hjklキーでFinderを操作する』を参照してください。更に設定を追加する場合は標準設定を変更する方法(How to modify prepared settings)もありますし、Filter: Specify ui element roleにFinder用のhjklの設定があるのでそれを元に編集することもできると思います。
おまけ(Adobe Reader+Kindle+Calibre+の設定)
Calibreは電子書籍管理アプリで独自のビューアーもついているのですが、ビューアーは標準でvimライクに操作できるのですが、管理アプリは使えません。Adobe ReaderもKindleも同じ設定なので、一緒にまとめました。(あとCtrl+NとCtrl+Pで↓↑の設定の浮気をしています。)
<root><appdef><appname>KINDLE</appname><equal>com.amazon.Kindle</equal></appdef><appdef><appname>CALIBRE</appname><equal>net.kovidgoyal.calibre</equal></appdef><item><name>Use "hjkl" keys as arrow keys and "Crtl+N" and "Ctrl+P" as up/down in Adobe Reader, Kindle, Calibre</name><identifier>private.hjkl_and_ctrln_and_ctrlp_arrow_adobereader_kindle_calibre</identifier><only>ADOBE, KINDLE, CALIBRE</only><uielementrole_not>AXTextField, AXTextArea</uielementrole_not><autogen>__KeyToKey__ KeyCode::H, ModifierFlag::NONE, KeyCode::CURSOR_LEFT</autogen><autogen>__KeyToKey__ KeyCode::J, ModifierFlag::NONE, KeyCode::CURSOR_DOWN</autogen><autogen>__KeyToKey__ KeyCode::K, ModifierFlag::NONE, KeyCode::CURSOR_UP</autogen><autogen>__KeyToKey__ KeyCode::L, ModifierFlag::NONE, KeyCode::CURSOR_RIGHT</autogen><autogen>__KeyToKey__ KeyCode::N, ModifierFlag::CONTROL_L, KeyCode::PAGEDOWN</autogen><autogen>__KeyToKey__ KeyCode::N, ModifierFlag::CONTROL_R, KeyCode::PAGEDOWN</autogen><autogen>__KeyToKey__ KeyCode::P, ModifierFlag::CONTROL_L, KeyCode::PAGEUP</autogen><autogen>__KeyToKey__ KeyCode::P, ModifierFlag::CONTROL_R, KeyCode::PAGEUP</autogen></item></root>