AutoHotKey v2 を使って WindowsでmacOSのEmacs風キーバインドを設定する

macOSからWindowsにPCを切り替えた時に一番苦労したのがキーバインドだったので、慣れ親しんだmacOSのEmacs風キーバインドをAutoHotKeyで設定するための備忘録になります。

https://www.autohotkey.com/

AutoHotkey（AHK）は、Windows上で動作するOSSのスクリプト言語およびユーティリティソフトウェアです。ユーザーは、キーボードやマウスの操作を自動化し、ホットキーやホットストリングを設定することで、作業効率を向上させることができます。具体的な機能として、キー操作のカスタマイズ、マクロの作成、特定の文字列入力時の自動変換などが挙げられます。これらの機能により、日常のPC操作を効率化し、生産性を高めることが可能になります。

:::note warn
ゲームをプレイされる方
一部のゲームではAHKが起動しているとプレイできないゲームがあるようなので、ゲームの起動が失敗した際にAHKを落としてみてください
:::

## 設定方法
v1.1はdeprecatedになっているので、v2.0を使用します。

以下が作成した設定ファイル（スクリプト）になります。AltキーをOptionキーのようにも使いたかったので、一部Emacsとは関係ない設定も混ざっています。

また、set_ignore_applications()で除外したいアプリケーションを指定しています。
対象アプリケーションの情報を調べるには **Windows Spy** を利用します。

1. タスクトレイにあるAutoHotKeyのアイコンを右クリックをし、Window Spyを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/def8483a-98ea-29b2-0cd3-e2c32f4dd19f.png)

2. 対象のアプリケーションをマウスでフォーカス（Activeに）して情報を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/38aee5d1-04ff-d5b7-db71-bd083cd52c2e.png)

## 設定スクリプト

```
set_ignore_applications() {
  GroupAdd "IgnoreApplications", "ahk_class CASCADIA_HOSTING_WINDOW_CLASS" ; Windows Terminalを除外
  GroupAdd "IgnoreApplications", "ahk_exe Code.exe" ; Visual Studio Codeを除外
  GroupAdd "IgnoreApplications", "ahk_exe Cursor.exe" ; Cursor AI Editorを除外
}

main() {
  ListLines 0 ; スクリプト実行中のライン表示を無効化

  SetControlDelay 0 ; コントロールへのコマンド送信の遅延を最小化
  SetKeyDelay -1 ; キー入力の遅延を無効化
  SetWinDelay 0 ; ウィンドウ関連コマンドの遅延を無効化
  SendMode "Input" ; キー入力モードを設定

  set_ignore_applications() ; 除外するアプリケーションを設定
}

main()
#UseHook ; フックを使用するように設定

;; <ctrl>+F1でスクリプトを一時停止/再開
#SuspendExempt
^F1::Suspend
#SuspendExempt False

#HotIf not WinActive("ahk_group IgnoreApplications") ; 除外したアプリケーションではホットキーを無効化

;
; <ctrl>b - カーソルを左に移動
;
^b:: Send "{Left}"

;
; <shift><ctrl>b - カーソルを左に移動（文字を選択）
;
+^b:: Send "+{Left}"

; <ctrl+f> - カーソルを右に移動
^f::Send "{Right}"

; <shift+ctrl+f> - カーソルを右に移動（文字を選択）
+^f::Send "+{Right}"

; <ctrl+p> - カーソルを上に移動
^p::Send "{Up}"

; <shift+ctrl+p> - カーソルを上に移動（文字を選択）
+^p::Send "+{Up}"

; <ctrl+n> - カーソルを下に移動
^n::Send "{Down}"

; <shift+ctrl+n> - カーソルを下に移動（文字を選択）
+^n::Send "+{Down}"

; <ctrl+d> - カーソル右の文字を削除
^d::Send "{Del}"

; <ctrl+h> - カーソル左の文字を削除（Backspace）
^h::Send "{BS}"

; <ctrl+a> - 現在の行の先頭にカーソルを移動
^a::Send "{Home}"

; <shift+ctrl+a> - 現在の行の先頭までカーソルを移動（文字を選択）
+^a::Send "+{Home}"

; <ctrl+e> - 現在の行の末尾にカーソルを移動
^e::Send "{End}"

; <shift+ctrl+e> - 現在の行の末尾までカーソルを移動（文字を選択）
+^e::Send "+{End}"

; <shift+alt+f> - カーソルを単語単位で右に移動（文字を選択）
+!f::Send "+^{Right}"

; <ctrl+k> - カーソルから行末まで削除
^k::
{
    Send "{ShiftDown}{End}{ShiftUp}"
    Sleep 50 ; 遅延
    Send "{Del}"
    Return
}

; <ctrl+u> - カーソルから行頭まで削除
^u::
{
    Send "{ShiftDown}{Home}{ShiftUp}"
    Sleep 50 ; 遅延
    Send "{Del}"
    Return
}

; <ctrl+m> - 改行を挿入（Enter）
^m::Send "{Enter}"

; <alt+f> - 検索ダイアログを開く
!f::Send "^f"

; <alt+a> - すべてのテキストを選択
!a::Send "^a"

; <alt+c> - 選択したテキストをコピー
!c::Send "^c"

; <alt+x> - 選択したテキストをカット
!x::Send "^x"

; <alt+v> - クリップボードのテキストを貼り付け
!v::Send "^v"

; <alt+s> - 現在のドキュメントまたはファイルを保存
!s::Send "^s"

; <alt+n> - 新しいウィンドウを開く
!n::Send "^n"

; <alt+t> - 新しいタブを開く
!t::Send "^t"

; <alt+w> - 現在のタブを閉じる
!w::Send "^w"

; <alt+r> - 現在のページまたはドキュメントを再読み込み
!r::Send "^r"

; <alt+l> - ブラウザのURLバーにフォーカス
!l::Send "^l"
```

## 参考
https://qiita.com/asublue/items/0e3fad2667545793466d

https://www.autohotkey.com/docs/v2/