## 概要
`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の押しっぱなし問題]]を避けるためです。