⌨️

Windows 10 × Mac用US配列キーボードで、Emacsキーバインドの使える快適なタイピング体験を実現する

2022/09/04に公開

ふだん仕事ではMacを使いつつ、趣味ではWindows 10を使っているという身。ディスプレイ、キーボード、マウスなどはすべて共通化しています。

キーボードには、Mac用のキーボード「REALFORCE TKL SA for Mac」シリーズのUS配列バージョンを使っています:
https://www.realforce.co.jp/products/R2TLSA-US3M-BK/

このキーボードにはMac用でありながらWindowsでも使いやすくするために「Win Mode」なる機能があるのですが、

  • Macで標準で使えるEmacsキーバインドをWindowsでも使いたい!
  • Aの左隣にあるキー(Caps Lock)をCtrlに置き換えたい!(Macでもそうしてる)
  • ホームポジションを崩さずにIMEを切り替えたい!(MacではCtrl + Spaceキーで文字を切り替えている)
  • コピー・貼り付け・全選択など一般的なショートカットを、Commandキーを使ってMacと同じような感覚で使いたい!
  • でもFPSゲームをやるときは左手の小指でCtrlキーを押したい!(ショートカットキーのためにCommandキーにCtrlを割り当てるとできなくなってしまう)

などなど、体内から沸き起こる様々な欲望を一気に叶えてくれるわけではもちろんありません。

どうにか全部叶えられないものか、いろいろな方法を試してどうにか行きついた方法をこの記事にメモしておきます。

要約としては、

  • Ctrl2capで、Caps Lockに左Ctrlキーを割り当てる
  • keyhac x Fakeymacs、
    • 左Ctrl + 各種キーでEmacsキーバインドを使えるようにする
    • 左Ctrl + SpaceでIMEを切り替えられるようにする
  • PowerToysで、
    • 左Commandキーに右Ctrlキーを割り当てる
    • 右CommandキーにWinキーを割り当てる

という感じです。

Ctrl2cap

まずは、Caps Lockに左Ctrlを割り当てる部分。

後述のPowerToysで設定することもできるのですが、Caps Lockキーが特殊なせいで、思ったようには動作してくれません。

調べた感じ、

  • レジストリエディタで書き換える
  • 「Change Key」や「KeySwap for XP」を使う

といった手段が紹介されていましたが、前者は面倒くさくて、後者はいずれも実績のあるソフトですがやりたいことに比べて機能が多い・かなり古い個人開発のフリーソフトで積極的に使いたいという気にはなりませんでした。

そこで見つけたのがこのツール。

https://docs.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap

公開日が「2006年11月1日」と、これもだいぶ古いソフトですが、Microsoft公式サイトで紹介されている・やりたいことと一致する最低限の機能を持つという点で、これを採用しました。

書いてあるとおりに、コマンドプロンプトかPowershellでインストールのためのコマンドを実行して、再起動すれば完了です。

コマンドプロンプトかPowershellを管理者権限で起動する必要がある点に注意です。

keyhac x Fakeymacs

次に、Pythonでカスタマイズできるのが特徴的なキーカスタマイズツール「keyhac」と、WindowsでEmacsのキーバインドを使えるようにするためのkeyhac設定「Fakeymacs」を導入します。

具体的な手順については、https://github.com/smzht/fakeymacs の「使い方」に沿って進めていくのがわかりやすいでしょう。

手順のうち、

  1. Keyhac をインストールする
  2. Keyhac を自動起動するようにする
  3. Fakeymacs をダウンロードする
  4. 必要なファイルを Keyhac のフォルダに複写する
  5. コンフィグレーションパラメータをカスタマイズする
  6. keyhac.exe を起動する

をやっていきます。これ以外はスキップして大丈夫です。

また、「6. コンフィグレーションパラメータをカスタマイズする」では、以下のような設定になるよう編集してください:

# 左右どちらの Ctrlキーを使うかを指定する("L": 左、"R": 右)
fc.side_of_ctrl_key = "L"

# IME をトグルで切り替えるキーを指定する(複数指定可)
fc.toggle_input_method_key = []
fc.toggle_input_method_key += ["C-Space"]

これで、

  • 左Ctrl + 各種キーでEmacsキーバインドを使えるようにする
  • 左Ctrl + SpaceでIMEを切り替えられるようにする

が完了です。

ただし、いろいろなアプリケーションで使うコピー・貼り付け・全選択などCtrlを使うショートカットよりもEmacsキーバインドが優先されてしまい、非常に困ります。

PowerToys

そこで、PowerToysのKeyboard Managerを使ってCommandキーに右Ctrlを割り当てます。

PowerToysは、Microsoftがオープンソースで公開しているユーティリティソフトで、キーマッピング機能の「Keyboard Manager」などWindowsを使いやすくするための便利機能がいろいろ搭載されています。

https://docs.microsoft.com/ja-jp/windows/powertoys/install

これをインストールして、Keyboard Managerで

  • 左Commandキーに右Ctrlキーを割り当てる
  • 右CommandキーにWinキーを割り当てる

という設定を行います。画面上は以下のようになります:

Keyboard Managerの設定画面

これで、Commandキーを使えばMacを使うときと同じようにコピー・貼り付け・全選択などのショートカットを使えます!

もともと左Commandキーに割り当てられていたWinキーは、使用頻度はあまり高くないものの地味に困るので、右Commandキーに割り当てました。

ついでに、PowerToys Runという機能で、「Option(Alt) + Spaceキー」でMacのSpotlight風なランチャー機能も使えるようになります。よりMacの使用感に近づいて便利!

PowerToys Run

これで、わかままな欲望がすべて叶いました!!

ほかにもMacとWindowsではショートカットが異なる部分(ウィンドウの切り替えなど)があって、「ぐぬぬ」となるシーンはゼロにはならないですが、個人的に譲れないポイントはは全部解決することができてWindowsを使うのが格段に快適になりました。

もし同じような欲望をお持ちの方にとって参考になれば幸いです。

番外編:Fakeymacsの個人設定

今回の方法だと、config_personal.pyに入っている以下の設定は不要なので、コメントアウトしてよさそう:

# Emacs のキーバインドにするアプリケーションソフトで、Emacs キーバインドから除外するキーを指定する
# (リストに指定するキーは、Keyhac で指定可能なマルチストロークではないキーとしてください。
#   Fakeymacs の記法の "M-f" や "Ctl-x d" などの指定はできません。"A-v"、"C-v" などが指定可能です。)
# (ここで指定しなくとも、左右のモディファイアキーを使い分けることで入力することは可能です)
fc.emacs_exclusion_key  = {"chrome.exe"       : ["C-l", "C-t"],
                           "msedge.exe"       : ["C-l", "C-t"],
                           "firefox.exe"      : ["C-l", "C-t"],
                           "Code.exe"         : ["C-S-b", "C-S-f", "C-S-p", "C-S-n", "C-S-a", "C-S-e"],                           }

以下は日本語キーボード向けでUS配列では関係なさそうなので、コメントアウトしてます:

## 日本語キーボードを利用している場合、<無変換> キーで英数入力、<変換> キーで日本語入力となる
fc.set_input_method_key += [["(29)", "(28)"]]

## 日本語キーボードを利用している場合、<A> キーで英数入力、<あ> キーで日本語入力となる
## (https://docs.microsoft.com/ja-jp/windows-hardware/design/component-guidelines/keyboard-japan-ime)
fc.set_input_method_key += [["(26)", "(22)"]]

ほかにも不要そうな設定がいろいろあるので、気になったたびにバシバシ無効化しています。

Discussion