追加修正2023-07-18

初版  2021-12-07

 

Emacsに馴れているのでWindowsでもキーバインドをEmacsのような運指にしたいと思います。

 

例えばこのような場面:

・ブラウザにURLを入力するとき

・テキストエディタで作文するとき

・ファイル保存でファイル名編集をするとき

 

もともとのWindowsの運指も維持したまま、Emacsのキーバインドでも使えるようにするのが今回のポイントです。

 

例えば秀丸エディタのキーバインドのひとつに「Ctrl-a」があります。これは「すべてを選択」する機能ですが、Emacsの場合「Ctrl-a」は「カーソルを行頭へ移動」です。Emacsと秀丸エディタの運指をいくつか下に列挙してみました。

 

ーーーーーー ーーーーーーーーーー ーーーーーーーーーーー

キーバインド Emacs運指    秀丸エディタ本来の機能 

ーーーーーー ーーーーーーーーーー ーーーーーーーーーーー

Cーa    カーソルを行頭へ移動 すべてを選択

Cーb    カーソルを左へ移動  ー

Cーe    カーソルを行末へ移動 ー

Cーf    カーソルを右へ移動  検索

Cーg    ー          指定行へ移動

Cーk    カーソルより右削除  ー

Cーl    再描画        最後に編集した所

Cーn    カーソルを下行へ移動 新規作成

Cーp    カーソルを上行へ移動 印刷

Cーr    ー          置換

Cーs    検索         上書き保存

Cーv    スクロールダウン   貼り付け

ーーーーーー ーーーーーーーーーー ーーーーーーーーーーー

 

Ctrlキーは現行のまま使えるようにしておきます。

 

キーボード配列で「A」キーの左隣にある「CapsLock」キーをEmacs運指専用の「Ctrl」キーとして使うことによって、Emacsと秀丸エディタの運指を両立させます。両立するキーバインド表を下に示します。

 

ーーーーーーーーーー ーーーーーーーーーー ーーーーーー ーーーーーーーーーーー

キーバインド     Emacs運指    キーバインド 秀丸エディタ本来の機能 

ーーーーーーーーーー ーーーーーーーーーー ーーーーーー ーーーーーーーーーーー

CapsLockーa カーソルを行頭へ移動 ctrlーa すべてを選択

CapsLockーb カーソルを左へ移動  ctrlーb ー

CapsLockーe カーソルを行末へ移動 ctrlーe ー

CapsLockーf カーソルを右へ移動  ctrlーf 検索

CapsLockーg ー          ctrlーg 指定行へ移動

CapsLockーk カーソルより右削除  ctrlーk ー

CapsLockーl 再描画        ctrlーl 最後に編集した所

CapsLockーn カーソルを下行へ移動 ctrlーn 新規作成

CapsLockーp カーソルを上行へ移動 ctrlーp 印刷

CapsLockーr ー          ctrlーr 置換

CapsLockーs 検索         ctrlーs 上書き保存

CapsLockーv スクロールダウン   ctrlーv 貼り付け

ーーーーーーーーーー ーーーーーーーーーー ーーーーーーーーーーーーーーーーーーー

 

小生のパソコン(DELL inspiron 5055)のキーボード配列上にはF13キーはありませんので、CapsLockキーをF13キーとして使うようにキーボードマップを変更しました。指定には、ChgKey.exe というフリーウェアを使わせてもらいました。

 

   ご参考:もともとのスキャンコード

       左Ctrl(LCtrl)のスキャンコードは0x001d

       右Ctrl(RCtrl)のスキャンコードは0xe01d

       CapsLockのスキャンコードは0x003a

       F13のスキャンコードは0x0064

 

ChgKey.exeを管理者モードで起動して、CapsLockキーを押すとスキャンコード0x0064(本来はF13キーのスキャンコード)が返ってくるように改造することができました。

 

ChgKey.exeの使い方の手順は次の通りです。

1/ ChgKey.exeを実行すると画面に現れる下記の絵図でCapsLockキーをクリック。

2/ 重なって現れる緑色のキーボードの右上にあるScan codeキーをクリック。

3/ F13のスキャンコード0064を入力してOKボタンをクリック。

4/ 最後に「登録」をクリックすることでシステムのレジストリに反映され、再起動をしても永久に有効です。

 

では次にEmacsキーバインドを働かせるための設定の説明に入ります。AutoHotKey というユーティリティをWindowsにインストールしてAutoHotKeyスクリプトでEmacsライクなキーバインドを実現いたします。

 

スクリプトファイル(小生はkeymap.ahkという名前にしました)を作成して下記のフォルダ内に設置します。 Windowsを再起動又はスクリプトをダブルクリックして活性化します。

 

C:\Users\<your_account>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\keymap.ahk

 

小生が作成したスクリプト(keymap.ahk)の中身は下記のテキストですが、Ahk2Exe.exeを利用してコンパイルすることで実行ファイルにすることもできます。

 

-----ここから-----

 

#MaxHotkeysPerInterval 100

is_target()

{

        global

        if (WinActive("ahk_class mintty")) { ; Gnu Pack startup_cygwin.exe

                return 1

        }

        if (WinActive("ahk_class Emacs"))  { ; Gnu Pack startup_emacs.exe

                return 1

        }

        if (WinActive("ahk_class Vim"))    { ; Gnu Pack startup_gvim.exe

                return 1

        }

        return 0

}

; ChangeKeyでCapsLockをF13に変更

; 矢印キー

F13 & p::

    if (is_target()) {

        Send ^p

    } else {

        Send {Blind}{Up}

    }

    return

F13 & n::

    if (is_target()) {

        Send ^n

    } else {

        Send {Blind}{Down}

    }

    return

F13 & b::

    if (is_target()) {

        Send ^b

    } else {

        Send {Blind}{Left}

    }

    return

F13 & f::

    if (is_target()) {

        Send ^f

    } else {

        Send {Blind}{Right}

    }

    return

; Home & End

F13 & a::

    if (is_target()) {

        Send ^a

    } else {

        Send {Blind}{Home}

    }

    return

F13 & e::

    if (is_target()) {

        Send ^e

    } else {

        Send {Blind}{End}

    }

    return

; 削除

F13 & d::

    if (is_target()) {

        Send ^d

    } else {

        Send {Blind}{Delete}

    }

    return

F13 & h::

    if (is_target()) {

        Send ^h

    } else {

        Send {Blind}{Backspace}

    }

    return

F13 & k::

    if (is_target()) {

        Send ^k

    } else {

        Send {ShiftDown}{End}{ShiftUp}{Delete}

    }

    return

; Enter Return

F13 & m::

    if (is_target()) {

        Send ^m

    } else {

        Send {Blind}{Enter}

    }

    return

; Undo

F13 & z::

    if (is_target()) {

        Send ^z

    } else {

        Send ^z

    }

    return

; ファイル操作

F13 & o::

    if (is_target()) {

        Send ^o

    } else {

        Send ^o

    }

    return

F13 & s::

    if (is_target()) {

        Send ^s

    } else {

        Send ^s

    }

    return

; 編集

F13 & \::

    if (is_target()) {

        Send ^\

    } else {

        Send ^a ; Select All

    }

    return

F13 & c::

    if (is_target()) {

        Send ^c

    } else {

        Send ^c ; Copy

    }

    return

F13 & v::

    if (is_target()) {

        Send ^v

    } else {

        Send ^v ; Paste

    }

    return

F13 & x::

    if (is_target()) {

        Send ^x

    } else {

        Send ^x ; Cut

    }

    return

; その他

F13 & g::

    if (is_target()) {

        Send ^g

    } else {

        Send ^g

    }

    return

F13 & i::

    if (is_target()) {

        Send ^i

    } else {

        Send ^i

    }

    return

F13 & j::

    if (is_target()) {

        Send ^j

    } else {

        Send ^j

    }

    return

F13 & l::

    if (is_target()) {

        Send ^l

    } else {

        Send ^l

    }

    return

F13 & q::

    if (is_target()) {

        Send ^q

    } else {

        Send ^q

    }

    return

F13 & t::

    if (is_target()) {

        Send ^t

    } else {

        Send ^t

    }

    return

F13 & u::

    if (is_target()) {

        Send ^u

    } else {

        Send ^u

    }

    return

F13 & w::

    if (is_target()) {

        Send ^w

    } else {

        Send ^w

    }

    return

F13 & y::

    if (is_target()) {

        Send ^y

    } else {

        Send ^y

    }

    return

 

-----ここまで-----

 

以上のAutoHotKeyスクリプト又はそれをコンパイルした実行ファイルを機能させることにより、下記のとおりキーバインドが追加されます。そして、CapsLock+[下記以外]はそのままCtrl+[下記以外]のキーとしてWindows OSへ渡されます。

 

CapsLock+C コピー

CapsLock+V 貼り付け

CapsLock+X 切り抜き

CapsLock+F カーソルを右へ

CapsLock+B カーソルを左へ

CapsLock+P カーソルを上へ

CapsLock+N カーソルを下へ

CapsLock+A カーソルを行頭へ

CapsLock+E カーソルを行末へ

CapsLock+D カーソルの右側の一文字を削除

CapsLock+H カーソルの左側の一文字を削除

CapsLock+K カーソルの右から行末まで削除

CapsLock+M 改行

CapsLock+¥ 全てを選択

Shift+CapsLock+F 選択肢ながらカーソルを右へ

Shift+CapsLock+B 選択肢ながらカーソルを左へ

Shift+CapsLock+P 選択肢ながらカーソルを上へ

Shift+CapsLock+N 選択肢ながらカーソルを下へ

Shift+CapsLock+A 選択肢ながらカーソルを行頭へ

Shift+CapsLock+E 選択肢ながらカーソルを行末へ

 

小生が作成したスクリプト(keymap.ahk)の先頭の1行は、秀丸エディタでCapsLock+Nしたままテキストを流して閲覧中に警告が出たので、MaxHotkeysPerIntervalを100にしておきました。MaxHotkeysPerIntervalというのは、バグったスクリプトを実行してしまってWindows OSを無限ループにはめてしまったときの安全弁だそうです。安全弁の内部規定値は70くらいみたいでそれを超えると警告ダイアログがポップアップして止まれるようになっていました。

 

#MaxHotkeysPerInterval 100

 

100にしてみたところ、秀丸エディタでCapsLock+Nしたままテキストを流して閲覧しても警告は出なくなりましたが、値を大きくしておけばいいというものではないと思いますので当面この値で様子を見ようと思います。

 

Is_targetという関数を定義してあります。これはGNU Package用です。小生はWindows環境でunixのソフトウェアツールス(emacs, vi, cc, grep, perl, ...)を利用したかったのでgnupack_devel-13.05-2015.07.19を入れてあります。ちなみにもっと新しい版もリリースされているのですがうまく動かないので2015年版を使い続けてます。

 

GNU Packageのうち下記のアプリはWindows OSのデスクトップにWindowsのウィンドウを開いてくるので、Windowsアプリのひとつとして動きます。

 

ターミナル(startup_cygwin.exe)

Emacs(startup_emacs.exe)

Vi(startup_gvim.exe)

 

これらはUnixのアプリですからキーバインドはunixの世界にいたときのままになっていて、EmacsはEmacsのキーバインドだしviはviのキーバインドですから、AutoHotkeyでキーバインドを変換する必要がありません。下記のアプリについてはAutoHotkeyの処置の対象外にするための関数が is_target です。

 

なんでEmacsライクなキーバインドにこだわるのかといえば、身についている感じがして使いやすい感じがするからです。勘違いなだけなのかもしれませんがよくわかりません。Windows 3.1とかWindows 95の時代に、Sun Microsystems社のワークステーションで数年間emacs浸けだったときがあって、何をするにもemacsから外へ出ない日々でしたからかもしれません。その後Sun SPARCワークステーションになり仕事は完了したんですが、癖がついたというか、PC-9801/NSとか買って386BSD98のフロッピーディスク回覧に加えてもらったりして、emacsを引きづって暮らしたことも関係するかもしれません。Emacsライクなキーバインドでハッピーなのかそうではないのか、わかりませんが、とりあえずEmacsライクなキーバインドにしておきますよ。


AutoHotkeyをインストールすると同時にインストールされるコンパイラを使うとAutoHotkeyのスクリプト(keymap.ahk)を実行ファイルにすることができます。この実行ファイルがあれば、AutoHotkeyをインストールしていないWindowsでも機能させることができます。

 

keymap.ahk をコンパイルして AutoHotkey_my_emacs_like_binding.exe にしたあとZIP圧縮してDropboxに置きました。

 

AutoHotkey_my_emacs_like_binding.zipをダウンロード

 

下の図は、Windows 10 Home環境で稼働させている「秀丸エディタ」で、キーボードから Alt+F を押してファイルメニューが出たところです。

この状態で、

 Ctrl+N は新規作成

 Ctrl+P は印刷

です。

下の図は、CapsLockを押したままnを4回打って(いわゆるCapsLock+N)、メニュー項目の「名前を付けて保存」のところまでハイライトを移動させたところです。  

 

 

キーボードのCtrlキーCapsLockキーとを入れ替えてしまうトリックでは、この便利さを得ることは不可能なのです。

 

小生は AutoHotkey_my_emacs_like_binding.exe をWindows10 Homeの「スタートアップ」フォルダに入れてあるので、Windows起動時に自動的に活性化されます。ところが、Windows Home 版ではなくて例えば会社支給の Enterprise 版のWindows PCを使っている場合は、起動時にうまく自動活性化されないことがあります。たまたま小生はそういう場面に遭遇しました。

 

どういうわけか分かりませんが AutoHotkey_my_emacs_like_binding.exe のプロパティの「管理者権限で実行する」が指定されていたからでした。会社支給のPCでは管理者ではなく一般ユーザでしか使えないから動かなかったのでした。「管理者権限で実行する」を外してやったら動きました。

 

参考ブログ

 

Windows10で矢印キーショートカットをMac風にする

Windows 10でも「Emacs風キーバインド」を使おう【AutoHotKey】

Windows の操作を Emacs のキーバインドで行うための設定 (AutoHotKey版)

AutoHotkeyJpキーリスト

AutoHotkey公式文書(コマンド)

AutoHotkeyでEmacsキーバインド

AutoHotkeyでキーボードをカスタマイズする1

AutoHotkeyでキーボードをカスタマイズする2

emacs.ahk

 

おまけ

 

Emacsライクなキーバインドとは異なる別の話でありAutoHotkey及びChgKey.exeには関係の無い話ですが、キーボード操作がとても快適になる合わせ技として下記を紹介します。

仮名漢字変換機能のON/OFFを無変換キー変換キーに割り当てるとキーボード操作がとても快適になります。この割り当て機能はWindows10に備わっている機能です。この機能を活性化すると、無変換キーを押すと英数入力モードになり変換キーを押すと仮名漢字変換モードになります。

 

あたかもMacの日本語キーボードにある「英数」「かな」キーみたいになるということです。これはとても使いやすいです。これがあるからMacの日本語キーボードは使いやすいと小生は思っています。下図はMacBook Air (M1)のキーボードです。

 

 

ご参考までに下図にMacBook Air (M1)の英語配列キーボードを示します。

 

 

Windowsパソコンの日本語キーボードで、「無変換」キーを「英数」キーとして、「変換」キー「かな」キーとして使えるように設定する方法は、Windows 10ではOSの機能として提供されています。その設定方法は、たとえば次のブログが分かりやすかったです。

 

Windows 10 日本語入力が楽になる!変換/無変換キーで日本語入力がオン/オフに

 

ご参考:Windows10の更新で21H1にバージョンアップしたら、このIMEオンオフの設定が初期化されてしまいました。どうなってるんだろう、変だなぁーと、最初は原因がわからずとても困りました。