LoginSignup
4
1

More than 1 year has passed since last update.

Obsidianのvimモードで、ctrl+bfpnを使えるようにする

Last updated at Posted at 2021-08-27

背景

話題のメモツール/ナレッジマネジメントツールObsidianでは、Vimのキー設定が選べます。インサートモードでctrl+bfpnなどemacsライク(macOS標準ライク)に動いてほしいのですけれども、そうなりません。

ちなみに、以前のObsidianは「ノーマルモードはvimライク、インサートモードはemacs(macOS)ライクな挙動」でしたが、v0.11.10(2021-03-27)で変更になりました。Vimrc Supportプラグインを用いても、うまく設定できません。

そこで、Karabiner-Elements(以下KE)を使って、「全体としてはVimキー設定で、インサートモードのカーソル移動はemacs(macOS)ライクに」なるようにしました。

※後日記※
Karabiner-Elementsアプリから、ダウンロードしてインストールできるように、登録しました。(2021-09-24)

環境

ここで書いていることは、下記のバージョンで実施しました。

概要

手順詳細

Obsidian Vimキー設定

設定 > エディタ > Vimのキー設定をONにします。

Karabiner-Element(KE)のインストール

Karabiner-Elementsの公式ページからダウンロードしてインストールします。

jsonファイル作成

下記のjsonファイルを~/.config/karabiner/assets/complex_modificationsに保存します。ファイル名は適当で良いです(たとえばobsidian-vim-emacs.json)。

obsidian-vim-emacs.json
{
  "title": "emacs like key for Obsidian.app",
  "rules": [
    {
      "description": "ctrl + bfpnae (only for Obsidian.app)",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "b",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_arrow"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "f",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "right_arrow"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "p",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "up_arrow"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "n",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "down_arrow"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "a",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "home"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "e",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "end"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        }
      ]
    },
    {
      "description": "ctrl + hdk (only for Obsidian.app)",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "h",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "delete_or_backspace"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "d",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "delete_forward"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "k",
            "modifiers": {
              "mandatory": [
                "left_control"
              ],
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "end",
              "modifiers": "left_shift"
            },
            {
              "key_code": "x",
              "modifiers": "left_command"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^md\\.obsidian$"
              ]
            }
          ]
        }
      ]
    }
  ]
}

jsonファイル読込み

Complex modificationsタブ > Add rule > emacs like key for Obsidian.app > Enable Allボタンを押します。

おわりに

設定に関する補足

使えるようにしたキーは、bfpnae(移動)およびhdk(削除)です。

上記の設定は、Obsidianアプリ上だけで有効です。他のアプリでの挙動は変わりません。

bundle_identifiersは、terminalで取得することができます(How to find the Bundle ID of an application on Macを参考にしました)。

$ osascript -e 'id of app "Obsidian"'

md.obsidian

制限

C-k(kill-line)は、emacs(macOS)の動作がスマート(賢く)て、KEで再現するのはむずかしいです。上記jsonでは、shift+endしたのちにcmd+x(cut)で代用しました。このため「行末でC-kすると行削除になってしまう」「行中でC-k C-kすると、行が削除され、クリップボードには行頭からカーソルまでのテキストが入っている」など、emacsの人の期待動作とは異なりますのでご注意ください。

shift+endしたのちにbackspace_or_deleteという手もあるのですが、さらに期待動作と離れていきます(行末でC-kするとbackspaseになる)。

また、shift+endだと論理行末まで行ってしまうので、表示行末までにしたいかたは、shift+command+右矢印に変えたほうがいいかもしれません。

ちなみに

Obsidianの、Vimモードのインサートモードでの挙動が、emacs(macOS)ライクでなくなった(v0.11.10(2021-03-27)以降)ことが、仕様なのかバグなのかいまいちわからないところがあるのですが、とりあえずの応急処置をしました。

C-kの挙動をKEで再現することはむずかしいので、せめてオプションで「インサートモードでemacs(macOS)ライクな挙動」を選べるようにならないか、開発者に問い合わせしてみようと思っています。

追記:公式フォーラムで聞いてみましたが、バグではないようです...

後日記

Karabiner-Elementsのアプリからダウンロードできるように、サイトに登録しました。

Karabiner-Elements complex_modifications rules - Application Specific

にあるObsidian.app, emacs like key at vim-insert mode_rev02です。

リソース

KEのルールのインポートについて、公式ドキュメントはこちら:
Use more complex rules

KEの設定jsonの書き方について、公式ドキュメントのサンプルはこちら:
Typical complex_modifications examples

KEの設定jsonのコレクションはこちら:
Karabiner-Elements complex_modifications rules

KEの設定の具体的ステップはこの記事を参考にさせていただきました:
USキーボードの左右Commandキーで仮想化Windowsの英数/かな入力を切り替える

Obsidian|べんりな使いかたとコツ(目次) - Qiita

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1