[[📒Productivityを上げるために大切な100のこと]] No50. 🥇
---
これを読んでいる方ならショートカットキーが[[プロダクティビティ]]向上に有効であることは言うまでもないだろう。キーボードに関するネタは本シリーズでもいくつか紹介している。
- [[📗頻繁に使う遠いキーの位置を近づける]]
- [[📗良いキーボードを使う]]
そして恐らく.. 優秀な貴方は場面場面に適したツールを使いこなしているだろう。そうなると新たな問題が発生しているはずだ。
## [[コンテキストスイッチ]]の切り替えコスト
ショートカットキーの割り当てはツールによって当然変わる。そして、沢山ツールを使っている人ほど『今、何のツールを使っているから、〇〇の機能を実行するためには△△のキーを押さなくては』という[[コンテキストスイッチ]]の切り替えコストが増加しているだろう。
これは[[📗できる限りステートレスな操作を採用する]]方針にも反するため、無視できない問題なのである。
## キーバインドを共通化
どうすればいいか? 簡単だ。==すべてのツールで同じキーバインド==を実現してしまえばいい。
もちろんツールによって機能は異なるが、ある程度抽象化すれば同じ括りにできるはずだ。以前に紹介した[[📗抽象的な操作を指先で覚える]]のツールを横断したバージョンだと思えばいい。
以下は私が共通キーバインドをまとめているシートだ。最近更新していないため若干古い情報もある[^1]が雰囲気を伝えるには十分だろう。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://ssl.gstatic.com/docs/spreadsheets/spreadsheets_2023q4.ico" />
<span class="link-card-v2-site-name">Google Docs</span>
</div>
<div class="link-card-v2-title">
共通キーバインド
</div>
<img class="link-card-v2-image" src="https://lh7-us.googleusercontent.com/docs/AHkbwyLynW4aCYdZJX2oxb4vZTVL0WVUoxFxN9EVm9z2Kacsrz-ViUfK6zh06tynByqHpGusTt5D7aTSfS6E6CGi7GqHOZoyhpu11-hobzukOCXef5p2NL0=w1200-h630-p" />
<a href="https://docs.google.com/spreadsheets/d/11KZFwz_KJWeN-zRGRV74pCubN0_k3yDaDDr7tErHPrY"></a>
</div>
戦略にもいくつか設計がある。以下が一例だ。
| 連続実行するか | よく使うか | キーの戦略 |
| -------------- | ---------- | ------------------------------------------ |
| する | する | `Ctrl`など押しやすい[[修飾キー]]と同時押し[^2] |
| しない | する | [[Leaderキー]]のような2キーバインド |
| する | しない | `Ctrl + Alt`のような2[[修飾キー]]同時押し |
突き詰めると、**どの操作がどの操作と一緒に使われることが多いか**なども考慮して設計することもある。この辺は別の機会があれば詳しく紹介したい。
## ツールごとにキーバインドを切り替える
戦略が決まれば、あとはそれをどう実現するかだ。ほとんどのツールにはショートカットキーを設定する機能があるのでそれを使えばいい。キー設定は[[JSON]]や[[XML]]などのファイルとして保存されていることが多いので、[[GitHub]]でバージョン管理などしておくといいだろう。
**他の人のPCが使えなくなる**ことを懸念に思う人もいるかもしれない。でも考えてみて欲しい。自分のPCを使っている時間とそうではない時間の比を。ほとんど自分のPCを使っている人なら大してデメリットにはならないはずだ。
ではショートカットキーを設定できないツールの場合、もしくは[[Leaderキー]]のような一部キー設定ができない場合はどうすればいいだろうか。[[Windows]]を使っている私の場合は[[AutoHotkey]]でそれを実現している[^3]。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://www.autohotkey.com/favicon.ico" />
<span class="link-card-v2-site-name">www.autohotkey.com</span>
</div>
<div class="link-card-v2-title">
AutoHotkey
</div>
<div class="link-card-v2-content">
Free keyboard macro program. Supports hotkeys for keyboard, mouse, and joystick. Can expand abbreviations as you ...
</div>
<a href="https://www.autohotkey.com/"></a>
</div>
[[AutoHotkey]]には実行中のプロセス名や起動中のウィンドウ情報を取得し、条件に応じて異なるキーマップを設定する機能がある。以下は一例だ。
```autohotkey:Obsidianでは<C-j>fを<C-S-p>に割り当て
;[NORMAL ]: fキー(コンビネーションの場合は$)(ObsidianでCtrl+jのあとならファイルを開く)
;[EDIT ]: 一番上に移動
;[RANGE ]: 選択範囲を一番上に移動
;[MOUSE ]: 右下のエリアにフォーカスを移してNORMALモードに
;[SPECIAL]: 縦にフルスクリーン
;[DEBUG ]: ステップオーバー (F10)
$f::
if (mode(_MODE.NORMAL)) {
if (isActiveProcess("Obsidian") && isSecondKeyAfterCtrlJ()) {
send ^+p
return
}
if (isSecondKey()) {
send {$}
} else {
send f
}
} else if (mode(_MODE.EDIT)) {
send ^{Home}
} else if (mode(_MODE.RANGE)) {
send +^{Home}
} else if (mode(_MODE.MOUSE)) {
ActivateWindow("RightDown")
setMode(_Mode.NORMAL)
FlashWindow()
} else if (mode(_MODE.SPECIAL)) {
send #+{UP}
} else if (mode(_MODE.DEBUG)) {
send {F10}
}
return
```
[[Obsidian]]では[[Leaderキー]]のような2キーバインドが設定できない。そのため、[[AutoHotkey]]を使って実現している。詳しくは[[📗VimやIDEのような2キーバインド(leaderキー)設定をしたい]] を参照。
**ツールが対応していないなら、==送信するキーイベントをハックしてやればいい==のだ**。
## まとめ
[[📗できる限りステートレスな操作を採用する]]ようにして[[コンテキストスイッチ]]の切り替えコストを減らすことは、[[プロダクティビティ]]を考える上で非常に大事だ。実現まで時間と手間を要するかもしれない。ただ、[[思考の速度でパソコンを使う技術]]を習得するのであれば、[[共通キーバインド戦略]]を採用することは避けられないだろう。
最後に私が[[AutoHotkey]]で実行しているスクリプト、[[🦉Spinal reflex bindings template]]のリポジトリを紹介させてもらい、幕引きとさせてもらおう。
<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">
GitHub - tadashi-aikawa/spinal-reflex-bindings-template: This repository is the Autohotkey KeyCustomized Project which is applicable to only mine.
</div>
<div class="link-card-v2-content">
This repository is the Autohotkey KeyCustomized Project which is applicable to only mine. - tadashi-aikawa/spin ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/14a20bf1141ec5459a1bf11c9c794729ba4677ec9deb61dd0383587bd4bf4cc6/tadashi-aikawa/spinal-reflex-bindings-template" />
<a href="https://github.com/tadashi-aikawa/spinal-reflex-bindings-template"></a>
</div>
> Don't Think! Feel.
[^1]: たとえば[[Obsidian]]が存在しない
[^2]: 私の場合、[[AutoHotkey]]を使って[[Vim]]のようなモードを実現しているのでそれを使うことも多い
[^3]: 正しくは[[AutoHotkey]]を使うために[[Windows]]を使っているとなるが..