以下の内容はhttps://swfz.hatenablog.com/entry/2025/02/23/235927より取得しました。


Obsidianのコマンドパレットや補完でVimキーバインドで移動したい

Ctrl+PCtrl+Shift+Pで出てくるコマンドパレット

選択肢の移動をVimキーバインドで行えれば、ターミナルやエディタの設定と同じなのでやりやすい

VS Codeだと設定自体が存在するので設定すればよいだけだが、Obsidianではそこまで詳細に設定できる項目がない

今までは矢印キーを押してたがやはりなんとかしたい!と思い調べてみた

同じことを考えている人はいるみたいでいくつかコードが載っていた

参考

自分の環境で色々試しながらコードは少し変えた

あと、前提としてObsidian自体のホットキー設定と競合してしまうので事前にCtrl+k,Ctrl+jの設定は削除している

スタートアップ用のコードの一部

いつものごとく下記記事の手法でTemplaterのスクリプト経由でスタートアップ時に読ませるコードを記述した

ObsidianのTemplaterスクリプトをObsidian起動時に実行する

/* コマンドパレットとサジェストでVimキーバインドで上下移動するための処理 Ctrl+{j,k} */
document.addEventListener('keydown',(e) => {
  function isSelectable() {
    const isCommandPalette = document.activeElement && document.activeElement.hasClass('prompt-input');
    const isSuggest = app.workspace.editorSuggest.currentSuggest;

    return isCommandPalette || isSuggest;
  }

  function pressedBindKey(e) {
    const platform = navigator.userAgentData.platform;
    if ( platform === 'Windows' ) {
      return e.ctrlKey && !e.shiftKey && !e.metaKey;
    }
    if ( platform === 'macOS' ) {
      return e.ctrlKey && !e.shiftKey && !e.metaKey;
    }
    return false;
  }
 
  if (e.code == "KeyJ" && pressedBindKey(e) && isSelectable()) {
    e.preventDefault();
    document.dispatchEvent(new KeyboardEvent("keydown",{"key":"ArrowDown","code":"ArrowDown"}))
  }
  if (e.code == "KeyK" && pressedBindKey(e) && isSelectable()){
    e.preventDefault();
    document.dispatchEvent(new KeyboardEvent("keydown",{"key":"ArrowUp","code":"ArrowUp"}))
  }
});

仕事用PCはWindows、プライベートPCはMacを使っているのでどちらでも使えるようにした

ただ、最後の方に記載しているが現状Macでこの方法ではうまくいかない点があってこれはもう色々調べた結果いったん諦めた

OS情報取得

pressedBindKey関数の中身

キー押下時のイベントデータを見てOS情報を取得して分岐

OS情報はnavigator.userAgent.platformから取得

MacのKeyEventのデータ

  • Cmd

    • ctrlKey: false
    • metaKey: true
    • shiftKey: false
  • Ctrl

    • ctrlKey: true
    • metaKey: false
    • shiftKey: false
  • キー押下時のイベント情報

最初はMacのときはCmd+J,Cmd+Kで移動、WinのときはCtrl+J,Ctrl+Kで移動するように条件を書いていた

が、使っていたらMacでもこの手の移動はCtrlのほうがしっくり来る感じだったので最終的には条件が一緒になってしまった

今の状態だとOSごとに差異がないのでまとめてしまっても良いがまた気が変わる可能性もあるので分岐は残したままにした

動作対象時の絞り込み

コマンドパレットやサジェストを開いているときのみ動作させる絞り込み

isSelectable関数の中身

コマンドパレットかどうか

activeElementがprompt-inputクラスを持っているようなのでそれを条件にした

サジェストかどうか

app.workspace.editorSuggest.currentSuggestでサジェストを開いているかの判断に使った

サジェストされていないときはnullが返ってくる

後述のプラグインでも補完の設定を行えるがこちらはObsidianが用意しているデフォルトのサジェストの話

主に次のようなケース

  • [[]] と入力してLinkを入力しようとするときに出てくるパターン
  • / と入力してコマンド実行するためのリストが出てくるパターン

補完プラグイン側の設定

自分は補完のプラグインとしてvarious-componentsを使っているが、ドキュメント見に行ったらプラグイン側で設定を行えたので設定するだけでよかった

こちらは普通に入力しているときにも出てくるリストや、frontmatterでキーにあったサジェストが出てくるパターンのとき

Home - Various Complements

UP: Mod k|ArrowUp
Down: Mod j|ArrowDown

これだけ!

ModはMacだとCmd、WinだとCtrl

気が利いている…

⚙️ Update internal links on save - Various Complements

MacだとCtrl+kで移動できない

デフォルトのサジェストを開いている際にCtrl+kで移動しようとすると、なぜか現在のカーソルから行末までの文字列が消えてしまう、改行コードも消えているっぽい

obsidian.vimrcを使っているのでそれかな?と思い色々設定を試してみたが解決できず

プラグインを削除して試してみても再現したのでobsidian.vimrcプラグインが原因というわけではなさそうというところまではわかったがそれ以上はわからなかった

で、vimrcの設定で何もしないという処理を上書きできないかと下記で色々試してみたがうまくいかず

inoremoap <C-k> hoge

本来だったらhogeの箇所を<Nop>にすることで何もしないというマップにできるようだがObsidianではできなかった

かといって他のキーを割り当てると割り当てたキーが入力されてしまう、そして修飾キーは入力できなそう

色々試していたらなぜかCtrl+Alt+Kで上に移動はできることがわかった…

なのでいったんMacではCtrl+Alt+Kで上移動、Ctrl+Jで下移動するようにしている…

おわり

一部うまくいかない部分は残っているものの、以前より体験はよくできたのでよかった

解決できていない部分は時間に余裕あるときもう一度調べて解決したい…

Macはよくわからんキーバインドが効いてくることが多くてちょっと使いづらい…




以上の内容はhttps://swfz.hatenablog.com/entry/2025/02/23/235927より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14