Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
180 lines (155 sloc) 9.02 KB

AutoHotkey を使って Windows で Emacs キーバインド

このスクリプト MyEmacsKeymap.ahk は、Windows の操作に Emacs キーバインドを割り当てた AutHotkey スクリプトで、私が Windows を快適に操作するために個人的に使用しているものです。

このスクリプトは以下のサイトで公開されているものを参考に、自分用に編集したものです。

設定済みのキーバインド

個人的に「これだけあればまあ快適かな」と思える範囲でカバーしています。

バッファとファイル選択、削除、コピー・ペースト
C-x C-ffind-fileC-SPCset-mark-command
C-x C-ssave-bufferC-x hmark-whole-buffer
C-x C-wwrite-fileC-x C-pmark-page
C-x kkill-bufferC-ddelete-char
C-x C-ckill-emacsC-bdelete-backward-char
カーソル移動C-kkill-line
C-fforward-charC-wkill-region
C-bbackward-charM-wkill-ring-save
C-nnext-lineC-yyank
C-pprevious-line検索
M-fforward-char x 5 [*1]C-sisearch-forward [*2]
M-bbackward-char x 5 [*1]C-risearch-forward [*2]
M-nnext-line x 5 [*1]アンドゥ、キャンセル
M-pprevious-line x 5 [*1]C-/undo
C-amove-beginning-of-lineC-x uundo
C-emove-end-of-lineC-gkeyboard-quit
C-vscroll-downその他
M-vscroll-upC-mnew-line
M-<beginning-of-bufferC-iindent-for-tab-command
M->end-of-bufferC-jnew-line
言語入力システム切替C-oopen-line
C-x C-jtoggle-input-methodC-ttranspose-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-fM-b はカーソルを5回移動します。M-nM-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 hC-x C-p が効かないため替わりにこれを使用することがあります。
*6. 私の場合、Web ブラウザでこれを使用することがあります。

使い方

AutoHotkey (http://ahkscript.org) を起動して、このスクリプト MyEmacsKeymap.ahk をロードします。AutoHotkey を新規インストールした場合、次の手順で使うことができます。

  1. インストールディレクトリに AutoHotkey.ahk の名前で空のファイルを作成し、次の行を追加します:
#include %A_ScriptDir%\MyEmacsKeymap.ahk
  1. MyEmacsKeymap.ahk を同ディレクトリにコピーします。

  2. AutHotkey.exe を実行します。

補足: AutoHotkey をスクリプトファイルを指定せずに実行した場合、プログラムは最初に AutoHotkey の実行ファイルが置かれているディレクトリの AutoHotkey.ahk を探します。このディレクトリは A_ScriptDir ビルトイン変数に保持されており、%A_ScriptDir% で参照できます。

使用上の注意

キーを押し続けた時にキーが slip する

環境によってはキーを押し続けたときにキーが slip してしまうかもしれません。例えば C-f を押し続けたときに、f が単独で出力されたり、オリジナルのキーマップで判定されて検索ボックスが表示されたりします。この現象は、Windows コントロールパネルでキーボードの「表示の間隔(Repeat Rate)」を遅くすることで抑制することが可能です。

ちなみに、AutoHotkey の SendMode の指定を変更することで現象を抑制できないか試したのですが、私が試した範囲では完全な対策にはなりませんでした。

特定のアプリケーションを操作対象から除外したい

m_IsEnabled 関数の m_IgnoreList に、除外したいアプリケーションの ahk_class を追加してください。各アプリケーションにおける ahk_class の値は AutoHotkey 付属の Window Spy (AU3_Spy.exe) を使用して特定することができます。

デフォルトでは、EmacsVim (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" を選択するのと同じ働きをします。

一部のアプリケーションで期待通りに動作しないキーがある

個人的には、これはそういうものだと割り切って使用しています。ニーズに合わせてスクリプトは自由に編集してください。

You can’t perform that action at this time.