追加修正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では管理者ではなく一般ユーザでしか使えないから動かなかったのでした。「管理者権限で実行する」を外してやったら動きました。
参考ブログ
Windows 10でも「Emacs風キーバインド」を使おう【AutoHotKey】
Windows の操作を Emacs のキーバインドで行うための設定 (AutoHotKey版)
おまけ
Emacsライクなキーバインドとは異なる別の話でありAutoHotkey及びChgKey.exeには関係の無い話ですが、キーボード操作がとても快適になる合わせ技として下記を紹介します。
仮名漢字変換機能のON/OFFを無変換キー変換キーに割り当てるとキーボード操作がとても快適になります。この割り当て機能はWindows10に備わっている機能です。この機能を活性化すると、無変換キーを押すと英数入力モードになり変換キーを押すと仮名漢字変換モードになります。
あたかもMacの日本語キーボードにある「英数」「かな」キーみたいになるということです。これはとても使いやすいです。これがあるからMacの日本語キーボードは使いやすいと小生は思っています。下図はMacBook Air (M1)のキーボードです。
ご参考までに下図にMacBook Air (M1)の英語配列キーボードを示します。
Windowsパソコンの日本語キーボードで、「無変換」キーを「英数」キーとして、「変換」キー「かな」キーとして使えるように設定する方法は、Windows 10ではOSの機能として提供されています。その設定方法は、たとえば次のブログが分かりやすかったです。
Windows 10 日本語入力が楽になる!変換/無変換キーで日本語入力がオン/オフに
ご参考:Windows10の更新で21H1にバージョンアップしたら、このIMEオンオフの設定が初期化されてしまいました。どうなってるんだろう、変だなぁーと、最初は原因がわからずとても困りました。