Ctrl+PやCtrl+Shift+Pで出てくるコマンドパレット
選択肢の移動をVimキーバインドで行えれば、ターミナルやエディタの設定と同じなのでやりやすい
VS Codeだと設定自体が存在するので設定すればよいだけだが、Obsidianではそこまで詳細に設定できる項目がない
今までは矢印キーを押してたがやはりなんとかしたい!と思い調べてみた
同じことを考えている人はいるみたいでいくつかコードが載っていた
参考
- Ctrl-J / Ctrl-K Hotkey for navigation within command palette and quick switcher - Feature requests - Obsidian Forum
- Obsidian command palette remap Ctrl+P / Ctrl+J
- obsidian-command-palette-keys/main.ts at master · danihodovic/obsidian-command-palette-keys
自分の環境で色々試しながらコードは少し変えた
あと、前提として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でキーにあったサジェストが出てくるパターンのとき
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はよくわからんキーバインドが効いてくることが多くてちょっと使いづらい…