このスクリプト MyEmacsKeymap.ahk
は、Windows の操作に Emacs キーバインドを割り当てた AutHotkey スクリプトで、私が Windows を快適に操作するために個人的に使用しているものです。
このスクリプトは以下のサイトで公開されているものを参考に、自分用に編集したものです。
- WindowsでEmacs風キーバインド
- Windows の操作を emacs のキーバインドで行うための設定(AutoHotKey版)
個人的に「これだけあればまあ快適かな」と思える範囲でカバーしています。
バッファとファイル | 選択、削除、コピー・ペースト | ||
---|---|---|---|
C-x C-f | find-file | C-SPC | set-mark-command |
C-x C-s | save-buffer | C-x h | mark-whole-buffer |
C-x C-w | write-file | C-x C-p | mark-page |
C-x k | kill-buffer | C-d | delete-char |
C-x C-c | kill-emacs | C-b | delete-backward-char |
カーソル移動 | C-k | kill-line | |
C-f | forward-char | C-w | kill-region |
C-b | backward-char | M-w | kill-ring-save |
C-n | next-line | C-y | yank |
C-p | previous-line | 検索 | |
M-f | forward-char x 5 [*1] | C-s | isearch-forward [*2] |
M-b | backward-char x 5 [*1] | C-r | isearch-forward [*2] |
M-n | next-line x 5 [*1] | アンドゥ、キャンセル | |
M-p | previous-line x 5 [*1] | C-/ | undo |
C-a | move-beginning-of-line | C-x u | undo |
C-e | move-end-of-line | C-g | keyboard-quit |
C-v | scroll-down | その他 | |
M-v | scroll-up | C-m | new-line |
M-< | beginning-of-buffer | C-i | indent-for-tab-command |
M-> | end-of-buffer | C-j | new-line |
言語入力システム切替 | C-o | open-line | |
C-x C-j | toggle-input-method | C-t | transpose-chars |
C-\ | toggle-input-method | ||
Microsoft Excel、Google スプレッドシート[*3] | |||
C-c a | 選択されたセルを活性化しカーソルを最後に移す (Append) (F2 ) |
||
C-c i | 選択されたセルを活性化しカーソルを最初に移す (Insert) (F2 + Home ) |
||
C-q プレフィックス: 一時的に Emacs キーバインディングを無効化[*4] | |||
C-q C-a | (すべて選択) [*5] | C-q C-n | (新規ウィンドウ) [*6] |
C-q C-p | (印刷) | ||
C-M キー: 管理用キー | |||
C-M-q | スクリプト実行の停止と再開の切替 | ||
C-M-z | フォーカスされているアプリケーションでキーバインドが有効化されるかどうかの確認 |
*1. 単語単位ではなく5回分移動します。例えば M-f
、M-b
はカーソルを5回移動します。M-n
、M-p
は Emacs のキーバインドには存在しませんが、Web ブラウジングをするときなどに、ページ単位だと進みすぎるが1回のスクロールでは遅すぎるといった場合に便利です。
*2. 検索はインクリメンタルではありません。後方検索もなしです。
*3. 操作対象が Google スプレッドシートかどうかの判断は m_IsGoogleSheets()
関数の IfWinActive
で行っています。私の場合、大雑把に FireFox か Google Chrome であれば true
としていますが、より適切な判断をしたい場合はスクリプトを編集してください。
*4. C-q
でツールを一時的に無効にするのは、かつて使用していた XKeymacs に慣らったものです。私は XKaymecs を長年使用していたため、印刷する時に C-q C-p
と打つのが体に染み付いています。
*5. 私の場合、Microsoft Paint では C-x h
や C-x C-p
が効かないため替わりにこれを使用することがあります。
*6. 私の場合、Web ブラウザでこれを使用することがあります。
AutoHotkey (http://ahkscript.org) を起動して、このスクリプト MyEmacsKeymap.ahk
をロードします。AutoHotkey を新規インストールした場合、次の手順で使うことができます。
- インストールディレクトリに
AutoHotkey.ahk
の名前で空のファイルを作成し、次の行を追加します:
#include %A_ScriptDir%\MyEmacsKeymap.ahk
-
MyEmacsKeymap.ahk
を同ディレクトリにコピーします。 -
AutHotkey.exe
を実行します。
補足: AutoHotkey をスクリプトファイルを指定せずに実行した場合、プログラムは最初に AutoHotkey の実行ファイルが置かれているディレクトリの AutoHotkey.ahk
を探します。このディレクトリは A_ScriptDir
ビルトイン変数に保持されており、%A_ScriptDir%
で参照できます。
- AutoHotkey Biginner Tutorial
- AutoHotkey Wiki (日本語) - 使用方法
環境によってはキーを押し続けたときにキーが slip してしまうかもしれません。例えば C-f
を押し続けたときに、f
が単独で出力されたり、オリジナルのキーマップで判定されて検索ボックスが表示されたりします。この現象は、Windows コントロールパネルでキーボードの「表示の間隔(Repeat Rate)」を遅くすることで抑制することが可能です。
ちなみに、AutoHotkey の SendMode
の指定を変更することで現象を抑制できないか試したのですが、私が試した範囲では完全な対策にはなりませんでした。
m_IsEnabled
関数の m_IgnoreList
に、除外したいアプリケーションの ahk_class
を追加してください。各アプリケーションにおける ahk_class
の値は AutoHotkey 付属の Window Spy (AU3_Spy.exe
) を使用して特定することができます。
デフォルトでは、Emacs
、Vim
(GVim)、mintty
(Cygwin Terminal) が操作対象から除外されています。
m_IsEnabled() {
global
;; List of applications to be ignored by this script
;; (Add applications as needed)
;; Emacs - NTEmacs
;; Vim - GVim
;; mintty - Cygwin
m_IgnoreList := ["Emacs", "Vim", "mintty"]
for index, element in m_IgnoreList
{
IfWinActive ahk_class %element%
Return 0
}
C-M-q
がスクリプト実行の停止と再開を制御するスイッチとして働きます。これはタスクバーの AutoHotkey アイコンで右クリックメニューから "Suspend Hotkeys" を選択するのと同じ働きをします。
個人的には、これはそういうものだと割り切って使用しています。ニーズに合わせてスクリプトは自由に編集してください。