(´ワ`)

主に技術系備忘録、たまに日記。

Karabiner-Elementのプラグイン「Vim-emulation」でVivaldiを無視するルールを追加する

前フリ

前回の続きのお話です。
もっといろんなアプリをVim化したいという願望をもっていた僕でしたが、結局KaraBiner-Elementの「Vim-emulation」というプラグインを入れることで落ち着きました。

いろんなアプリをVim化する上でESCキーがアプリと競合して「今どっちのESCキーが反応したの?」とわちゃわちゃするのがとっても嫌だったのですが、Vim-emulationを使用する場合、「ctrl + [」キーのみでインサートモードを解除することで解決しました。(まだ慣れていませんが)

本題

SurfingKeysと競合しあう問題はVim-elementsの設定ファイルをいじることで一部のアプリに対して適用を無視することができます。
Chrome、iTermなど基本的なアプリは標準の設定で無視されています。ありがたい。

僕が普段使っているVivaldiは設定されてないので、自分で入力する必要があります。
しかしながらこの「Vim-emulation」、設定ファイルの行数が何十万行にも渡る巨大なファイルになっているのでこれを見て手入力するのはとても疲れます。(途中までやってしんどかた)

絶対にもっとイケてる方法はあるんやろなあとか思いながら自分でスクリプト書きました。 Python初心者なのでコードの汚さはご愛嬌

import json

add_name_arr = [
    "^com\\.vivaldi\\.Vivaldi$",
]

json_data = {}

with open("~/.config/karabiner/assets/complex_modifications/{設定ファイル.json}", "r") as res:
    json_data = json.load(res)

with open("~/.config/karabiner/assets/complex_modifications/{設定ファイル.json}" "w") as res:
    for i in range(len(json_data['rules'])):
        manipulators_ary = json_data['rules'][i]['manipulators']
        for j in range(len(manipulators_ary)):
            manipulators_obj = manipulators_ary[j]
            # "conditions"キー、"type"、"bundle_identifiers"を追加
            if 'conditions' not in manipulators_obj:
                print("conditions not exists")
                manipulators_obj.update({"conditions": [{"type": "frontmost_application_unless", "bundle_identifiers": []}]})
            bundle_identifiers = manipulators_obj['conditions'][0]["bundle_identifiers"]
            # 追加しようとしている要素がなければ"bundle_identifiers"に追加
            for add_name in add_name_arr:
                # ここをいじればキーを削除するスクリプトに変えれる
                if (add_name not in bundle_identifiers):
                    bundle_identifiers.append(add_name)
    print(json.dumps(json_data, indent = 2))
    # エンコード(書き込みモードなのでそのまま上書き)
    json.dump(json_data, res, indent = 2)

エラーなくvivaldiが追加されたjsonが出力されたら成功です。
add_name内のアドレスを変更することで他のアプリもルールに追加することができます。
設定ファイルはすべてのプラグインにおいて同じフォーマットなので、もしかしたら「Vim-emulation」に限らずとも使用できるかもしれないです。(試してない)

コードの全体は僕のdotfilesにあります

github.com

追記

jsonは正しく出力されると思いますが追加したプラグインが既に有効化されている場合、設定が正しく反映されないのでComplex Modificationsタブから対象のプラグインをRemoveした上で再度有効化してください。