設定ファイルの形
ファイルの場所は %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 つあります。
[[keymap]]の角かっこが二重なのは、これがリストだからです。
1 つ書くたびに新しいブロックが始まります。
[keymap.remap]が一重なのは、 その上のブロックに属するテーブルだからです。- ルールの左辺は必ず引用符で囲みます。
"C-h" = "Back"であってC-h = "Back"ではありません。
ハイフンを含む文字列は、 裸のキー名としては書けないためです。
ルールの横に書いたコメントを WinRemap が 読み取り、設定ウィンドウでそのルールの隣に表示します。
自分あてのメモが、見える場所に 残ります。
編集したら、トレイアイコンを右クリックして設定を再読み込みを
選んでください。
間違いがあれば内容を報告したうえで、直前の設定のまま動き続けます。
書き間違いでキーボード環境が止まることはありません。
WinRemap の中で編集する
ファイルを開かずに編集することもできます。
トレイアイコンを右クリックして
設定を選び、編集を押してください。
名前・対象アプリ・
除外アプリ・規則が入力欄になり、キーマップの追加・削除・並べ替えができ、全体設定は
スライダーとチェックボックスで変更できます。
- キー記法の欄は打ちながら解釈を表示します(
A-x uなら 「Alt+x に続けて u」)。
解釈できない場合はその旨と、既知のキー名に近ければ候補を出します。 - 保存はコマンドラインと同じ検証を行います。
問題があれば何も書かず、 行番号付きで一覧します。 - 検証を通れば原子的に書き込んで再読み込みするので、新しい規則がすぐ効きます。
- 編集していない箇所はそのまま残ります — コメント・空行・規則の
並び順・書いた綴り・改行コード。
規則を削除したときに消えるのはその行と行末コメントだけで、 上に書いたコメントは次の規則へ引き継がれます。 - 編集中に 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+H は C-h のルールを
発火させません。 |
キー単体。 どの修飾キーを押していても一致します。 Ctrl+CapsLock は Ctrl+Ctrl になります。 |
| 修飾キーの扱い | 出力に合わせて置き換えます。 Ctrl を物理的に押していても、アプリには素の Backspace が届きます。 出力側が独自の修飾キーを持つこともできます: "C-i" = "S-Tab"。 |
触りません。 そのため出力は修飾キーの無い単一キーに限られます。 |
| 向いている用途 | Emacs 風キーバインド、アプリ別の手当て。 修飾キーも「押したもの」の一部である場合。 |
物理キーの入れ替え。 CapsLock→Ctrl、無変換キーを別の役に、など。 |
両者は共存できます。
CapsLock を LCtrl に差し替えつつ、
C-CapsLock だけ特別扱いすることもできます。
コマンドルールが先に
照合されるためです。
"LCtrl" = ... は拒否されます)。修飾キーはコマンドを組み立てる材料であり、 照合が始まる前に消費されるためです。
出力側なら問題ありません。
プレフィックスキー(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_startrecord_stoprecord_play |
マクロ記憶のキー。record_start と
record_play を書くまで機能は動きません。record_stop を
省略すると開始キーと同じになり、押すたびに開始・終了が切り替わります。これらの キーはキーマップ照合より前に横取りされるため、同じキーを [keymap.remap] にも書くとエラーになります。 |
macro_delay_ms)も引き続き
使えます。両方書いた場合は、どちらかが黙って勝つのではなくエラーになります。
どちらが 効いているのか分からない状態を作らないためです。
[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-h、A-S-F5、W-Space
のように書きます。
大文字小文字は区別せず、プレフィックスの順序も問いません
(C-S-h と S-C-h は同じコマンドです)。
| プレフィックス | 修飾キー |
|---|---|
C- | Ctrl(左右どちらでも) |
A- | Alt(左右どちらでも) |
S- | Shift(左右どちらでも) |
W- | Win(左右どちらでも) |
| 種類 | キー名 |
|---|---|
| 英字・数字 | a〜z、0〜9 |
| ファンクション | F1〜F24 |
| 編集 | Back(Backspace、BS)、Tab、Enter(Return)、Esc(Escape)、Space、Insert(Ins)、Delete(Del) |
| 移動 | PageUp(PgUp)、PageDown(PgDn)、Home、End、Left、Up、Right、Down |
| ロック | CapsLock |
| 記号 | そのキーに刻印されている文字(;、/、-、[ など)。別名は Oem1〜Oem8、Oem102、OemPlus、OemComma、OemMinus、OemPeriod |
| 出力用の修飾キー | LCtrl、RCtrl、LShift、RShift、LAlt、RAlt、LWin、RWin、Apps(Menu)— 出力側のみ |
未対応: ルールの入力側に置く修飾キー。
記号キーはキーボードによって違う
記号キーは、お使いのキーボードに刻印されているとおりに書きます。
"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 が記録するのはキーであって、打った内容ではないからです。
端末は Backspace キー に対して DEL
0x7f を、Ctrl+H に対して BS 0x08 を送り、アプリが
その 2 つに別の動作を割り当てていることがあります — WinRemap が作られた理由そのものです。C-h を Back にリマップすると、端末はどちらでも
0x7f を送るようになります。ログで両側とも
BS 0x08 と出るのは、
それが Windows が Backspace キーに与えているコードだからで、
0x7f はその先で端末が行う読み替えです。