
ReControl プロジェクトは、Windows と UNIX 由来ツールにおけるコントロールキーの振る舞いを統合することを基本理念としています。元々は、macOS にある Emacs キーバインディングを Windows 上で再現することから始まったプロジェクトで、現在の ReControl アプリケーションにも Emacs キーバインディングが含まれています。
背景
私は長年 macOS を使用してきましたが、最近は Windows を使用する機会が増えてきました。その中で、macOS 標準の Control キーを用いた Emacs キーバインディングが Windows では使えないことに不便さを感じていました。
Windows にも XKeymacs というような代替手段はありますが、私が必要とする機能だけならば大規模な開発は不要なので、私が自由に改造できるシンプルなアプリケーションとして開発することにしました。最初は XKeymacs に敬意を表して Keymacs という名前で、C# と Windows Forms で開発を始めました。
プロトタイプが動作する段階になったとき、完全に C++ と Win32 API を使用した開発に移行することを検討しました。キー入力ごとに処理を行うためパフォーマンスが重要になるからです。その一方、C# でも主要機能は Win32 API で実装しなければならなかったため、C# と Windows Forms である必要性が薄れていきました。また、Windows App SDK を利用し、WinUI 3 と Win32 API を融合したモダンなアプリケーションを開発できることも後押しになりました。
プロトタイプを日常的に使用する中で、Emacs キーバインディングだけでは不十分なことも明らかになりました。とくに、Visual Studio 2022 の VsVim 拡張機能を使ったとき、Esc の代替となる Ctrl+[ が Visual Studio や ReSharper のショートカットと衝突してしまうのです。ショートカットを調整すれば解決できるものの、根本的な不自由さを感じました。
一方、macOS では、アプリケーションは Command キー、UNIX 由来ツールは Control キーとうまく棲み分けられているため衝突することがなく、ふたつが統合された操作体系が実現できています。こうした操作体系を Windows でも実現できないかと考えたのが、ReControl プロジェクトの発端です。
プロジェクト名 ReControl には、コントロールキーを再定義するという意味を込めています。また、Emacs キーバインディングに限定しないプロジェクトを目指したこともプロジェクト名変更の理由です。
ReControl アプリケーションでは、CapsLock キーを RCtrl キーに置換し、UNIX 由来ツールを RCtrl キーで操作する仕組みを採用しています。これは、macOS の Command キーを Windows の Ctrl (LCtrl) キーに、macOS の Control キーを Windows の RCtrl キーに対応させた形となっています。
Mac の JIS キーボードや Happy Hacking Keyboard は、CapsLock キーの位置にコントロールキーがあるため、CapsLock キーを RCtrl キーに置換することにしました。Ctrl2Cap のように CapsLock キーを Ctrl (LCtrl) キーに置換するのではなく、あえて RCtrl キーに置換していることが要点です。
ただし、すでに CapsLock キーを Ctrl (LCtrl) キーに置換して使っている場合、この変更に慣れるまで苦労する可能性があります。また、Virtual Box のように RCtrl キーを特殊用途に使っているアプリケーションでは、不便さを感じることもあるかもしれません。
基本理念
Windows と UNIX 由来ツールにおけるコントロールキーの振る舞いを統合する。
これが ReControl プロジェクトの基本理念(コンセプト)です。プロジェクトの成果物として ReControl アプリケーションを開発していますが、この理念の実現は必ずしも ReControl アプリケーションに限定されません。実際、CapsLock キーを RCtrl キーに置換する処理は、Windows のレジストリを編集することで実現しており、アプリケーションには実装していません。既存ソフトウェアの設定変更やパッチ適用でも理念を実現できる可能性があると考えています。
ReControl アプリケーション
ReControl アプリケーションはプロジェクトの主要成果物です。
主要機能
現在の主な機能は、Global キーバインディングと除外アプリケーションです。
Global キーバインディング
macOS と同様の Emacs キーバインディングを提供しています。現在は以下のショートカットが使用可能です。ただし、RCtrl+K と RCtrl+T はクリップボードの内容を上書きするので注意してください。
ショートカット | 動作 |
---|---|
RCtrl+A | Home: 行頭に移動 |
RCtrl+B | Left: 左に1文字移動 |
RCtrl+D | Delete: 右の1文字を削除 |
RCtrl+E | End: 行末に移動 |
RCtrl+F | Right: 右に1文字移動 |
RCtrl+H | Backspace: 左の1文字を削除 |
RCtrl+K | Shift+End→Shift+Delete: 行末まで切り取り |
RCtrl+N | Down: 次行に移動 |
RCtrl+P | Up: 前行に移動 |
RCtrl+T | Shift+Left→Shift+Delete→Right→Shift+Insert: 左の文字と右の文字を置換 |
RCtrl+Y | Shift+Insert: 貼り付け |
除外アプリケーション
ReContro アプリケーションの提供するキーバインディングが不要なアプリケーションを除外しています。現在は以下のアプリケーションがリストに登録されています。
- Windows Terminal (WindowsTerminal.exe)
- GNU Emacs (emacs.exe)
- gVim (gvim.exe)
インストール
ReControl アプリケーションのインストーラーは下記のリンクからダウンロード可能です。ダウンロードした ReControl Installer 0.0.msi を実行してインストールしてください。
ReControl アプリケーションの実行ファイルは C:\Program Files\ReControl に配置されます。実行ファイルはスタートアップに登録され、Windows 起動時に自動起動し、通知エリアに常駐します。また、CapsLock キーを RCtrl キーに置換するため、Scancode Map キーがレジストリに登録されます。手動で起動したい場合はスタートメニューから起動できます。
注意点として、レジストリに既存の Scancode Map キーがある場合は上書きされません。インストール前に、レジストリエディタを使用して HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout の Scancode Map キーを削除することをおすすめします。
管理者権限の PowerShell から下記のコマンドを実行することでも Scancode Map キーを削除できます。
Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Keyboard Layout" -Name "Scancode Map"
アンインストールは、Windows 11 の「設定 > アプリ > インストールされているアプリ」から可能です。インストール時に登録したレジストリのキーも同時に削除されます。
開発方針
ReControl アプリケーションは GitHub の takuyatsuchida/ReControl でオープンソースソフトウェアとして公開しています。開発言語は C++ で、Windows App SDK を利用するパッケージ化されていない WinUI 3 アプリケーションとしてビルドされます。インストーラーの作成には WiX Toolset と HeatWave(Visual Studio 拡張機能)で使用しています。
なお、主要機能のほとんどは Win32 API を利用しており、WH_KEYBOARD_LL をフックしてキー入力を取得し、SendInput 関数で別のキー入力を送信しています。
公開プロジェクトではありますが、個人的なペットプロジェクトであるため、プルリクエストに応えられるとは限りません。ただし、MIT ライセンスで公開しているため、自由にフォークして独自機能を追加してもらうことは可能です。ないとは思いますが、GitHub スターが100以上になるほどユーザーが増えることがあれば、コミュニティプロジェクトへの移行を検討します。
ロードマップ
- ReControl 0.1 GitHub Actions によるビルドの自動化、README や Releases の整備
- ReControl 0.2 VsVim キーバインディングの実装
- ReControl 0.n 除外アプリケーション設定画面の追加、厳格モード設定画面の追加、クリップボード周辺の改善、WinGet パッケージリポジトリへの登録、自動テストの追加
本稿では「Windows と UNIX 由来ツールにおけるコントロールキーの振る舞いを統合する」という基本理念を持つ ReControl プロジェクトを紹介しました。初期バージョンの ReControl アプリケーションも公開していますので、興味のある方はぜひ試してみてください。
献辞
In loving memory of Merry, who curled up in my lap while I coded.
私がコードを書いていた間ずっと膝の上で丸くなっていたメリーへ。