## 概要
`Ctrl+J`を押したあとに`O`を押したらコマンドを実行する...といった[[Vim]]や[[JetBrains IDE]]、[[VSCode]]のような[[2キーバインド]]設定をしたい。
## ソリューション
### [[Leader Hotkeys for Obsidian]]を使う
もし動くなら[[Leader Hotkeys for Obsidian]]プラグインを使うのが一番楽だと思います。私は以下の理由で当時見送りました。(今はどうか分からない)
- 対応しているコマンドが少ない
- Previewモードで動作しない
### [[Karabiner-Elements]]を使う ([[macOS]]ユーザー向け)
[[Karabiner-Elements]]の設定で[[2キーバインド]]を実現できます。
> [!attention]
> 私は[[karabiner.ts]]を使っているので[[Karabiner-Elements]]の設定方法は把握していません。
[[karabiner.ts]]で設定を書いている場合は以下のように設定できます。
```ts
modifierLayer("command", "j").leaderMode().manipulators([{
e: toKey("f13", "command"), // [AQS] recent serarch
h: toKey("f17"), // [AQS] backlink search
}]);
```
[[karabiner.ts]]を用いた設定例として、私の[[macOS]]用カスタマイズプロジェクトも参考にしてください。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
toki/karabiner/README.md at 3e6791ca79fc0bf7704a9c331f0c701ff661dc5c · tadashi-aikawa/toki
</div>
<div class="link-card-v2-content">
macOSのセットアップ/カスタマイズプロジェクト 誓いの時は来た! 今 わたしは あなた(Windows)を超える!! - tadashi-aikawa/toki ...
</div>
<img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/977129105/89cc86a4-ebae-4927-8d0e-a1707375fb45" />
<a href="https://github.com/tadashi-aikawa/toki/blob/3e6791ca79fc0bf7704a9c331f0c701ff661dc5c/karabiner/README.md"></a>
</div>
### [[AutoHotkey]]を使う ([[Windows]]ユーザー向け)
[[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の押しっぱなし問題]]を避けるためです。