設定ガイド

config.toml に書けることのすべてと、その記述例。
インストールと使い方はヘルプページをご覧ください。

設定ファイルの形

ファイルの場所は %APPDATA%\winremap\config.toml です (--config <パス> で変更できます)。
形式は TOML で、内容は 2 種類しかありません。
任意の設定 セクションと、いくつでも書ける [[keymap]] ブロックです。

Microsoft Store から導入した場合は、 パッケージ専用のフォルダーに置かれます。
設定ウィンドウが実際に使っているフォルダーを 常に表示し、エクスプローラーで開くこともできます (2 つの経路の違い)。

# ---- 設定(すべて任意) ----
[macro]
delay_ms = 8

[ime_indicator]
enabled = true

# ---- キーマップ: いくつでも ----
[[keymap]]
name = "global-emacs"          # 自分と設定ウィンドウのための名札
application = ["*"]            # このブロックを適用するアプリ
exclude = ["windowsterminal.exe"]

[keymap.remap]                 # ルール本体
"C-p" = "Up"
"C-n" = "Down"

[[keymap]]
name = "jetbrains"
application = ["phpstorm64.exe", "idea64.exe"]

[keymap.remap]
"C-h" = "Back"

TOML の書き方で間違えやすい点が 2 つあります。

編集したら、トレイアイコンを右クリックして設定を再読み込みを 選んでください。
間違いがあれば内容を報告したうえで、直前の設定のまま動き続けます
書き間違いでキーボード環境が止まることはありません。

WinRemap の中で編集する

ファイルを開かずに編集することもできます。
トレイアイコンを右クリックして 設定を選び、編集を押してください。
名前・対象アプリ・ 除外アプリ・規則が入力欄になり、キーマップの追加・削除・並べ替えができ、全体設定は スライダーとチェックボックスで変更できます。

application に何を書けばよいか分からないときは、 今の前面アプリから取得を押して 3 秒以内に目的のアプリを前面にすると、 その exe 名が一覧に入ります。

アプリの指定

[[keymap]] は必ず「どのアプリに適用するか」から始めます。

キー意味
application exe 名のリスト。
前面アプリと大文字小文字を区別せず照合します (["notepad.exe", "chrome.exe"])。
["*"] で全アプリ。
"*" と個別名の混在は、推測せずエラーにします。
exclude このブロックを適用しない exe 名。
["*"] と一緒のときだけ 書けます。
自分で書いたリストから除外するのは、短いリストを書くのと同じだからです。
name 任意の名札。
設定ウィンドウとエラーメッセージに出るので、ブロックが 3 つを 超えたあたりから効いてきます。

どのブロックが勝つか

複数のブロックが当てはまる場合、アプリ別のブロックが "*" の ブロックに勝ちます
ファイルに書いた順序は関係ありません。
同じ区分の中では、 先に一致したものが勝ちます。

[[keymap]]
application = ["*"]
[keymap.remap]
"C-h" = "Back"          # どのアプリでも…

[[keymap]]
application = ["code.exe"]
[keymap.remap]
"C-h" = "C-h"           # …ただし VS Code では C-h のまま

実際に効くのは常に 1 つのルールだけです。
両方当てはまるブロックで同じ入力を 束縛した場合、設定ウィンドウが相手のブロック名を示す列を出します。
どちらか一方だけを 読んでいても気づけない衝突だからです。

exe 名の調べ方

トレイアイコンを右クリックしてログを表示を選び、対象のアプリへ 切り替えてください。
[前面] の行に、application に書くべき文字列 そのものと、適用されるキーマップが出ます (フルパスはその下の詳細行です)。
書くのは常に ファイル名だけで、パスは一致しません。

18:01:51.471 [前面]   application 指定値: "notepad.exe" — 適用されるキーマップ: emacs-keys

ルール

[keymap.remap] の中では、左辺が「押すキー」、右辺が「アプリが受け取る キー」です。

コマンドルールと単キールール

どちらになるかは、左辺に修飾キーが付いているかで決まります。
この違いは見た目以上に 重要です。

コマンドルール単キールール
書き方 "C-h" = "Back" "CapsLock" = "LCtrl"
一致する条件 修飾キーの組み合わせが完全に一致したときだけ。
Ctrl+Shift+HC-h のルールを 発火させません
キー単体。
どの修飾キーを押していても一致します。
Ctrl+CapsLockCtrl+Ctrl になります。
修飾キーの扱い 出力に合わせて置き換えます。
Ctrl を物理的に押していても、アプリには素の Backspace が届きます。
出力側が独自の修飾キーを持つこともできます: "C-i" = "S-Tab"
触りません。
そのため出力は修飾キーの無い単一キーに限られます。
向いている用途 Emacs 風キーバインド、アプリ別の手当て。
修飾キーも「押したもの」の一部である場合。
物理キーの入れ替え。
CapsLock→Ctrl、無変換キーを別の役に、など。

両者は共存できます。
CapsLockLCtrl に差し替えつつ、 C-CapsLock だけ特別扱いすることもできます。
コマンドルールが先に 照合されるためです。

プレフィックスキー(2 ストローク)

"A-x u" = "C-z"      # Alt+X → U       →  元に戻す
"A-x C-s" = "C-s"    # Alt+X → Ctrl+S  →  保存

2 つのコマンドを空白で区切って書きます。
1 打鍵目は抑止され、WinRemap が待機します。
タイムアウトはありません
Emacs と同じ挙動です。
次の打鍵で確定します。

2 打鍵目が定義されていないものだった場合、素通しではなく破棄されます。
打ち間違えても、文書に余計な文字が漏れることはありません。
1 打鍵目には修飾キーが必須です。
裸のキーをプレフィックスにすると、通常の入力まで飲み込んでしまうためです。

マクロ

"C-t" = ["C-Right", "C-Left", "C-S-Right"]   # 最大 8 コマンド

出力を配列にすると、各コマンドを順に 1 回ずつタップします。
全体が 1 バッチで注入 されるため、自分のタイピングが割り込むことはありません。
マクロは押下のたびに 1 回だけ 実行され、押しっぱなしでも連射されません。

一部のストロークが抜けるアプリ(WinUI 版メモ帳など)では、下の [macro] delay_ms を使ってください。

設定セクション

[macro]

[macro]
delay_ms = 8            # 0〜15、既定 0

record_start = "S-F10"  # マクロ記憶。詳細はヘルプページ
# record_stop = "S-F11" # 省略すると開始キーが終了も兼ねます
record_play  = "F10"
キー意味
delay_ms マクロの各コマンドの間に入れる待ち時間(ミリ秒、0〜15)。
ストロークが抜ける アプリが無ければ 0 のままで構いません。
WinUI 版メモ帳には 8 で足ります。
記憶したマクロの再生にも同じ値が使われます。
コマンドラインの --macro-delay は実験用にこれを上書きします。
record_start
record_stop
record_play
マクロ記憶のキー。
record_startrecord_play を書くまで機能は動きません。
record_stop を 省略すると開始キーと同じになり、押すたびに開始・終了が切り替わります。
これらの キーはキーマップ照合より前に横取りされるため、同じキーを [keymap.remap] にも書くとエラーになります。

[ime_indicator]

[ime_indicator]
enabled = true                # 既定: false
# trigger_keys = ["C-Space"]  # Ctrl+Space で IME を切り替えている場合
# duration_ms = 800           # 100〜5000
# size = 96                   # 32〜256
# opacity = 200               # 0〜255
# show_app_name = true        # 「あ」の下に exe 名を出す

IME がオンになった瞬間、アクティブウィンドウの中央に半透明の 「あ」パネルを一瞬表示します。
標準の IME キーは最初から検知します。
Windows 11 の IME の Ctrl+Space のような独自の切り替えキーを使っている場合は trigger_keys を足してください。
表示のみで、WinRemap が IME を切り替える ことはありません。

キー記法

ルールでは Keyhac / fakeymacs でおなじみの Emacs 風記法を使います。
修飾キーの プレフィックス+キー名で、C-hA-S-F5W-Space のように書きます。
大文字小文字は区別せず、プレフィックスの順序も問いません (C-S-hS-C-h は同じコマンドです)。

プレフィックス修飾キー
C-Ctrl(左右どちらでも)
A-Alt(左右どちらでも)
S-Shift(左右どちらでも)
W-Win(左右どちらでも)
種類キー名
英字・数字az09
ファンクションF1F24
編集BackBackspaceBS)、TabEnterReturn)、EscEscape)、SpaceInsertIns)、DeleteDel
移動PageUpPgUp)、PageDownPgDn)、HomeEndLeftUpRightDown
ロックCapsLock
記号そのキーに刻印されている文字;/-[ など)。
別名は Oem1Oem8Oem102OemPlusOemCommaOemMinusOemPeriod
出力用の修飾キーLCtrlRCtrlLShiftRShiftLAltRAltLWinRWinAppsMenu)— 出力側のみ

未対応: ルールの入力側に置く修飾キー。

記号キーはキーボードによって違う

記号キーは、お使いのキーボードに刻印されているとおりに書きます。
"C-;" = "Enter" と書けば、; と刻まれたキーが対象になります。

どのキーがそれなのかは、実はキーボードによって違います。
同じキーが US 配列では ;、日本語配列では : を刻んでいる、ということが起こります。
WinRemap は決め打ちせず、設定を読み込むときに Windows へ問い合わせます
ですから同じ設定ファイルでも、それぞれのキーボードで刻印どおりのキーが 対象になります。

Shift が要る文字は、Shift ごと書きます。

US 配列の @Shift+2 です。
この場合 "C-@" ではなく "C-S-2" と書きます。
WinRemap が黙って Shift を 足すことはせず、こう教えます。

`@` needs Shift on this keyboard; write `S-2` instead

日本語配列なら @ は単独のキーなので、そのまま "C-@" と書けます。
配列が違えば書き方も違う — これは キーボードが実際にそうなっているからで、隠さずにお伝えしています。

設定を別のキーボードのマシンへ持って行きたい場合は、別名を使います。
"C-OemMinus" のように書くと、配列に関係なく同じキーを指します。
文字が刻まれていないキー(Oem8)や、同じ文字を刻んだキーが 2 つある場合 (US 配列の \ は 2 か所にあります)も、別名でなければ指せません。

キーボードを差し替えたら、トレイメニューの [設定を再読み込み]を選んでください。
読み込み直すときに問い合わせ直します。
設定ウィンドウのキー記法パネル()には、 今つながっているキーボードの記号キーが並びます。

記述例

いずれもそのまま設定ファイルに貼れる、完結したブロックです。

CapsLock をもう一つの Ctrl にする

[[keymap]]
name = "capslock"
application = ["*"]

[keymap.remap]
"CapsLock" = "LCtrl"

単キールールなので、他に何を押していても効きます。
CapsLock は大文字ロックの切り替えを 一切しなくなり、コマンドのために押しっぱなしにしたときも含めて Ctrl そのものに なります。

Ctrl+H を Backspace に。
ただしターミナルは除く

[[keymap]]
name = "backspace"
application = ["*"]
exclude = ["windowsterminal.exe", "mintty.exe"]  # 自前で 0x08 を送るため

[keymap.remap]
"C-h" = "Back"

WinRemap が生まれるきっかけになった設定です。
エディタで Ctrl+H はたいてい置換ダイアログを開きますが、これで 1 文字削除に なります。
ターミナルは既に正しく動くので除外します。

Emacs 風のカーソル移動をすべてのアプリで

[[keymap]]
name = "emacs-motion"
application = ["*"]
exclude = ["windowsterminal.exe", "emacs.exe"]

[keymap.remap]
"C-p" = "Up"
"C-n" = "Down"
"C-b" = "Left"
"C-f" = "Right"
"C-a" = "Home"
"C-e" = "End"
"C-d" = "Delete"
"C-k" = ["S-End", "C-x"]     # 行末まで選択して切り取り
"C-y" = "C-v"                # ヤンク

C-k がマクロになっている点に注目してください。
「行末まで削除」は 「行末まで選択する」「切り取る」の 2 操作だからです。
もともと Emacs キーバインドを 持つアプリは除外しないと、互いに衝突します。

1 つのアプリだけ逆にしたい

[[keymap]]
name = "vscode"
application = ["code.exe"]

[keymap.remap]
"C-p" = "C-p"     # VS Code のクイックオープンはそのまま渡す

アプリ別のブロックは、上の "*" ブロックより後に書かなくても勝ちます。
コマンドを自分自身に対応させるのが「このアプリは例外」を表す書き方です。

Emacs 風のプレフィックスコマンド

[[keymap]]
name = "prefix"
application = ["*"]

[keymap.remap]
"A-x u" = "C-z"        # Alt+X → U       →  元に戻す
"A-x s" = "C-s"        # Alt+X → S       →  保存
"A-x C-c" = "A-F4"     # Alt+X → Ctrl+C  →  ウィンドウを閉じる

Alt+X のあとに定義していないキーを押しても破棄されるので、 打ち間違えて文書に文字が入ることはありません。

1 キーで単語を選択する

[[keymap]]
name = "select-word"
application = ["*"]

[keymap.remap]
"C-t" = ["C-Right", "C-Left", "C-S-Right"]

単語の先を通り過ぎ、その先頭へ戻り、末尾まで選択します。
単語のどこにカーソルが あっても、単語まるごとを選択できます。
1 マクロあたり最大 8 コマンドです。

その場かぎりの繰り返し作業を記憶する

[macro]
delay_ms = 8
record_start = "S-F10"   # Shift+F10 で開始、もう一度押して終了
record_play  = "F10"     # F10 で再生

恒久的なルールにするほどでもない編集向けです。
Shift+F10 を 押して一度だけ作業し、もう一度押して終了。
あとはファイルの残りで F10 を 押していきます。
記憶できるのは 20 コマンド、内容はメモリ上だけにあり、WinRemap を 終了すると消えます。
何が記録され何が記録されないかは マクロ記憶をご覧ください。

出発点にする設定ファイル

WinRemap には 2 つの設定例が同梱されています。
どちらも通して読む価値があります: minimal.toml (ルール 1 つだけ。
WinRemap が動いているかの確認用)と emacs.toml (fakeymacs 相当の一式)です。

設定を間違えたとき

問題は行番号付きで全件まとめて報告されます。
ファイルを 1 回見直すだけで全部直せます。
リロードに失敗した場合は、直前の有効な設定がそのまま動き続けます。

メッセージ意味
unknown key `Bogus` その名前がキー記法の表にありません。
記号の場合は、 お使いのキーボードのどのキーにもその文字が刻まれていないということです。
設定ウィンドウのキー記法パネルで、刻まれている記号を確認してください。
`@` needs Shift on this keyboard; write `S-2` instead その文字はキーのシフト面にあります。
メッセージが示すとおり、Shift ごと 書いてください(記号キー)。
modifier key `LCtrl` cannot be a remap input 修飾キー単体はルールの左辺にできません。
出力側なら書けます。
a bare-key rule's target may not have modifiers 左辺に修飾キーが無いので単キールールになりますが、単キールールは修飾状態に 手を触れません。
左辺に修飾キーを足してコマンドルールにしてください。
duplicates an earlier rule for the same key 同じブロック内の 2 つのルールが同じコマンドに解決されています ("C-h""c-H" は同じものです)。
is already used as a sequence prefix 同じコマンドが、単独のルールとシーケンスの 1 打鍵目の両方になっています。
発火すべきか次のキーを待つべきか決められません。
`exclude` requires application = ["*"] アプリを列挙したうえで一部を除外しています。
短いリストを書いてください。
is also remapped in `…`; recording keys are always taken first マクロ記憶のキーがキーマップにも束縛されています。
そのルールは決して発火せず、 しかも設定ファイルを読んでもそうとは分からないため、書いた時点で拒否します。

それでも解決しない場合は、トレイのログを表示でキーごとの処理内容が 見られます。
設定ウィンドウには今実際に効いている設定が出るので、 リロードできていないことに気づく最短の方法でもあります。

ログの読み方

各行にはミリ秒までの時刻と、どの流れの行かを示すタグが付きます。
[判定] は キー 1 つにつき 1 行です。
[全イベント]にチェックを入れると流れた入力をすべて出します — 届いた押下・解放が [入力]、WinRemap が送出したイベントが [注入] です。
記録はチェックの有無にかかわらず取っているので、 入れる前に押したキーの詳細も見えます

18:01:51.517 [入力]     n ↓
             [判定]     C-n → Down に置換
             [注入]       LCtrl ↑(修飾補正)
             [注入]       Down ↓(置換)

ASCII 制御コードを持つキー・コマンドは、それも表示します (C-h (BS 0x08)Enter (CR 0x0D))。
英数字にはコードを付けません — WinRemap が記録するのはキーであって、打った内容ではないからです。

Ctrl+H と Backspace、そして端末について。
端末は Backspace キー に対して DEL 0x7f を、Ctrl+H に対して BS 0x08 を送り、アプリが その 2 つに別の動作を割り当てていることがあります — WinRemap が作られた理由そのものです。
C-hBack にリマップすると、端末はどちらでも 0x7f を送るようになります。
ログで両側とも BS 0x08 と出るのは、 それが Windows が Backspace キーに与えているコードだからで、 0x7f はその先で端末が行う読み替えです。