Karabiner-Elementsで色々出来る事が分かったので これを使ってVim以外の場所でもVimの様な動作を出来る設定を Karabiner-Elementsで作りました。
やりたいこと
やりたいことはEvernoteとかでものを書く時に Evernoteのアプリ上でVimっぽい操作をしたい、ということ。
Vimっぽい操作、というのは単にHで左、 とかだけではなくてノーマルモードやビジュアルモードと言った モード変換やYYでコピー、Pでペースト とか一通りの事が出来る様にする、というもの。
以前、Karabiner(KeyRemap4Macbook)の時も作って使っていました。
これはKarabinerの本体の設定にも組み込まれてます。
また、WindowsでもAutoHotkeyを使って再現したものを今は使っています。
こちらはAutoHotkeyが入って無くてもレポジトリにあるexeファイルを走らせればそれだけでも使えます。
その前にはyamyを使って作ってたりしました。
モードの設定とかがあるのでちょっと複雑で書くことも沢山になりますが、
Karabinerでset_variable
という機能で状態を変化させる事が出来る様になったことと、
KE-complex_modificationsを使ってJSONファイルを簡潔な記述で作れる様になったので
Karabiner-Elementsでも作ってみました。
Vim emulationのインストール
インストール(インポート)は以下のページから出来ます。
Vim emulationのImport
を押せばKarabiner-ElementsでImport出来ます。
出来たら追加されたVim emulationをEnable
してください。
有効になるアプリ
ターミナル、Vim、Emacs、ブラウザ、Remote Desktop、Virtual Machine に関するアプリの上では無効になります。
それ以外では有効になります。 とりあえずテキストエディットとか立ち上げて試して見ると分かりやすいと思います。
使い方
使い方は基本的なVi(Vim)の動作と同じです。
ちょっと違うところとしては基本的に最初はインサートモード、つまりMacの普通の状態です。
ESCか⌃-[を押すとノーマルモードに入ります。
ノーマルモードではHで左に動いたりWでワードジャンプ、 YYでラインコピー、 Pでペースト、等が出来ます。
Vを押せばビジュアルモードに入って移動するとその間のテキストを選択して、 Yでコピー、Dを押せば切り取りとかが出来ます。
その他全ての現在有効な機能については以下を参照:
KE-complex_modifications/vim_emu.md at master · rcmdnk/KE-complex_modifications
検索やちょっとしたコマンドモードのショートカットキーもあるので Vimで出来るかなりの事が再現できてると思います。
3l
と打った時に右に3つ動く、と言ったことも出来ます。
(ただし1-9まで。)
作り方
pqrs-org/KE-complex_modifications をフォークしてERB形式で元ファイルを書いて scripts/erb2json.rbで変換する形でJSONファイルを作っています。
rcmdnk/KE-complex_modifications/erb2json.rb が改造したスクリプトですが vim_emu専用コマンドも作って ERBファイルの方でなるべく簡潔に書ける様にしています。
特に移動コマンドに関してはノーマルモードとビジュアルモードで 同じ様な動作をしたりするのでその辺を簡単に書ける様にしたり。
これのおかげで元ファイルはコメントとか余計なのを含めても500行以下で済みました。 出来上がったJSONファイルは20万行近く(5MB程)あります。。。
手元の環境ではこれだけの設定を読み込んでも特に動作に問題は無いようなので 大丈夫かな、と。
嫌なら簡単に元の設定ファイル毎消すのも今回のKarabiner-Elementsであれば簡単なので それ程気にしなくてもよいかな、と。
Karabinerの時には設定を公式本体に組み込んでしまうと、それが原因で動作がもっさりすることがあったりしたのであれでしたが。
今後出来そうなこと
ESCをノーマルモード入りに使ってますが、 アプリによってはESCが重要だったりするかもしれないので 他のキーにしたい場合もあるかもしれません。
そういった時に選べる様にここだけ切り離した方が良いかな?とも。
まあ、~.config/karabiner/karabiner.jsonを直接編集(escape
で探して)すればすぐに変更出来ますが。
(ただ、vim_emuのせいで非常に大きくなってるのでちょっと注意。。。)
後はKarabiner-Elements本体の方で、
repeat
という新しい機能をつけて
"to": [
{ "repeat": 5,
"action": [
{
"key_code": "a",
"repeat": 10
},
{
"key_code": "b",
"repeat": 10
}
]
}
],
みたいな感じで各キーの繰り返しや、to
全体の繰り返しとか出来る様になったら
かなりvim_emuの記述を減らす事が出来るので
ちょっとできそうなものか見てできそうならプルリクエスト作ったりしたいと思います。
同様にアプリの定義とか、今は全ての設定それぞれに同じ事を繰り返し各必要がありますが、 JSONファイルの中でエイリアス的な設定をしてそれを呼べる様に出来たら また大分書き込みが減るかな、と。 変更したい時もJSONファイルの編集で簡単に出来ますし。 (いまだと何百箇所となおさないといけないので。) アプリだけでなく特定のコマンドとかも。
KE-complex_modificationsを使うことで作業としてはその辺簡単に出来てますが、 実際吐き出されるJSONが大きいのでなんとか出来れば嬉しいな、というところです。
その他もし何かあれば rcmdnk/KE-complex_modifications の方にIssuesとか投げて貰えればうれしいです。