## 概要 `Ctrl+J`を押したあとに`O`を押したらコマンドを実行する...といった[[Vim]]や[[JetBrains IDE]]、[[VSCode]]のような[[2キーバインド]]設定をしたい。 ## ソリューション ### [[Leader Hotkeys for Obsidian]]を使う もし動くなら[[Leader Hotkeys for Obsidian]]プラグインを使うのが一番楽だと思います。私は以下の理由で当時見送りました。(今はどうか分からない) - 対応しているコマンドが少ない - Previewモードで動作しない ### [[AutoHotkey]]を使う [[Windows]]で[[AutoHotkey]]を使っている方なら一番確実な方法です。ここでは`Ctrl+J`,`O`にコマンドを割り当てるコード例を紹介します。 #### `Ctrl+J`を押したあとであるかの判定コード `isSecondKeyAfterCtrlJ`を作ります。 ```autohotkey ;【概要】現在押下されているキーがCtrl+jの後に押されたものかを返します。 ;【引数】なし ;【戻値】true: 押されている isSecondKeyAfterCtrlJ() { return (A_PriorHotKey = "$^j") } ``` #### プロセスがアクティブかを判定するコード `isActiveProcess`を作ります。 ```autohotkey ;【概要】指定されたプロセスがアクティブであるか ;【引数】name: プロセス名 ;【戻値】true / false isActiveProcess(name) { WinGet, ahk_process, ProcessName, A return ahk_process == name } ``` #### [[Obsidian]]がアクティブならキーをリマップするコード [[Obsidian]]がアクティブなときは`Ctrl + j`を無効化します。[[Leaderキー]]を[[Obsidian]]がキャッチして意図せぬ動作になるのを防ぐためです。 ```autohotkey $^j:: if (isActiveProcess("Obsidian.exe")) { // DO NOTHING } else { Send, ^j } return ``` 先ほど作成した`isSecondKeyAfterCtrlJ`と`isActiveProcess`を使ってリマップします。このとき、リマップするキーは`F13`~`F24`がオススメです。 ```autohotkey $f:: if (isActiveProcess("Obsidian.exe") && isSecondKeyAfterCtrlJ()) { Send, {F13} } else { Send, f } ``` あとは、[[Obsidian]]で`F13`キーに割り当てたい機能を割り当てればOKです。参考までに、私の場合は[[🦉Another Quick Switcher]]の[[Header floating search in file]]を割り当てています。 > [!hint] `F13`~`F24`がオススメな理由 > [[AutoHotkeyの押しっぱなし問題]]を避けるためです。