tag:github.com,2008:https://github.com/houmain/keymapper/releasesRelease notes from keymapper2026-03-07T08:57:43Ztag:github.com,2008:Repository/177397013/5.4.12026-03-07T09:01:12Z5.4.1<h3>Changed</h3>
<ul>
<li>On Windows the mouse is now also only hooked when it has mappings. One can add <code>@grab-device mouse</code> to further hook it unconditionally (<a href="https://github.com/houmain/keymapper/issues/344" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/344/hovercard">#344</a>).</li>
<li>On Windows the devices are unhooked when the active context only contains <code>Any >> Any</code> (<a href="https://github.com/houmain/keymapper/issues/351" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/351/hovercard">#351</a>).</li>
<li><code>keymapper-launchd</code> also installs the <code>Karabiner-DriverKit-VirtualHIDDevice</code> daemon (<a href="https://github.com/houmain/keymapper/issues/298" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/298/hovercard">#298</a>).</li>
<li>Updated <code>Karabiner-DriverKit-VirtualHIDDevice</code> to version 6.10.0.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed expression <code>Any</code> to match all inputs (<a href="https://github.com/houmain/keymapper/issues/351" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/351/hovercard">#351</a>).</li>
<li>Fixed string comparison blocks with empty strings (<a href="https://github.com/houmain/keymapper/issues/334" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/334/hovercard">#334</a>).</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.4.02026-03-01T09:38:53Z5.4.0<h3>Added</h3>
<ul>
<li>
<p>Added FreeBSD support (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2819930378" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/222" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/222/hovercard" href="https://github.com/houmain/keymapper/issues/222">#222</a>).</p>
</li>
<li>
<p>Allow <code>keymapperctl</code> to press/release non-virtual keys (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9534718" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/348" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/348/hovercard" href="https://github.com/houmain/keymapper/discussions/348">#348</a>).</p>
</li>
<li>
<p>Added <code>getenv</code> builtin macro and string comparison blocks (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3787889069" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/334" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/334/hovercard" href="https://github.com/houmain/keymapper/issues/334">#334</a>). .e.g.:</p>
<div class="highlight highlight-source-ini notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# activate context when environment variable has some specific value
[getenv["HOSTNAME"] = "LaptopMum"]"><pre><span class="pl-c"><span class="pl-c">#</span> activate context when environment variable has some specific value</span>
<span class="pl-en">[getenv["HOSTNAME"]</span> = <span class="pl-s"><span class="pl-pds">"</span>LaptopMum<span class="pl-pds">"</span></span>]</pre></div>
</li>
<li>
<p>Added window title change detection to KWin script (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4000618874" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/349" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/349/hovercard" href="https://github.com/houmain/keymapper/issues/349">#349</a>).</p>
</li>
<li>
<p>Improved version mismatch error dialog on Windows.</p>
</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.3.22026-02-07T10:22:25Z5.3.2<h3>Changed</h3>
<ul>
<li>Showing path in "Opening configuration file failed" error (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3749844974" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/326" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/326/hovercard" href="https://github.com/houmain/keymapper/issues/326">#326</a>).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed concurrent output on release (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3850594976" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/341" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/341/hovercard" href="https://github.com/houmain/keymapper/issues/341">#341</a>).</li>
<li>Fixed empty strings in context filters (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3760029993" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/329" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/329/hovercard" href="https://github.com/houmain/keymapper/issues/329">#329</a>).</li>
<li>Added missing dependency to DEB package.</li>
<li>Bundling documentation (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3788187860" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/336" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/336/hovercard" href="https://github.com/houmain/keymapper/issues/336">#336</a>).</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.3.12025-12-04T19:20:52Z5.3.1<h3>Fixed</h3>
<ul>
<li>Fixed <code>ContextActive</code> for contexts with device filter (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3690794979" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/319" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/319/hovercard" href="https://github.com/houmain/keymapper/issues/319">#319</a>).</li>
<li>Fixed <code>keymapperctl --next-key-info</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3653599918" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/314" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/314/hovercard" href="https://github.com/houmain/keymapper/issues/314">#314</a>).</li>
<li>Fixed disabling notifications (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3653599918" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/314" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/314/hovercard" href="https://github.com/houmain/keymapper/issues/314">#314</a>).</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.3.02025-11-21T19:33:02Z5.3.0<h3>Added</h3>
<ul>
<li>Added <code>keymapperctl --print "string"</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9090907" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/312" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/312/hovercard" href="https://github.com/houmain/keymapper/discussions/312">#312</a>).</li>
<li>Allow to pass key <code>Any</code> to <code>keymapperctl --wait-toggled</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="9090907" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/312" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/312/hovercard" href="https://github.com/houmain/keymapper/discussions/312">#312</a>).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Retry initializing Winsock when network subsystem is not ready yet (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3580525294" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/313" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/313/hovercard" href="https://github.com/houmain/keymapper/issues/313">#313</a>).</li>
<li>Fixed path separator in <code>keymapper-launchd</code> (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3437603494" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/298" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/298/hovercard" href="https://github.com/houmain/keymapper/issues/298">#298</a>).</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.2.02025-10-25T08:31:54Z5.2.0<h3>Added</h3>
<ul>
<li>
<p>Added directive <code>@virtual-keys-toggle</code>, which allows to change the behavior of virtual keys in outputs (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3530374184" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/309" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/309/hovercard" href="https://github.com/houmain/keymapper/issues/309">#309</a>). e.g.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@virtual-keys-toggle true # true is (still) the default
# toggle Virtual1
F1 >> Virtual1"><pre>@virtual-keys-toggle <span class="pl-c1">true</span> <span class="pl-c"><span class="pl-c">#</span> true is (still) the default</span>
<span class="pl-c"><span class="pl-c">#</span> toggle Virtual1</span>
F1 <span class="pl-k">>></span> Virtual1</pre></div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@virtual-keys-toggle false
# press Virtual1
F1 >> Virtual1
# release Virtual1
F2 >> !Virtual1
# toggle Virtual1
Virtual1{F3} >> !Virtual1
F3 >> Virtual1"><pre>@virtual-keys-toggle <span class="pl-c1">false</span>
<span class="pl-c"><span class="pl-c">#</span> press Virtual1</span>
F1 <span class="pl-k">>></span> Virtual1
<span class="pl-c"><span class="pl-c">#</span> release Virtual1</span>
F2 <span class="pl-k">>></span> <span class="pl-k">!</span>Virtual1
<span class="pl-c"><span class="pl-c">#</span> toggle Virtual1</span>
Virtual1{F3} <span class="pl-k">>></span> <span class="pl-k">!</span>Virtual1
F3 <span class="pl-k">>></span> Virtual1</pre></div>
</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Improved performance of sending mouse events on Windows (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3450450221" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/300" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/300/hovercard" href="https://github.com/houmain/keymapper/issues/300">#300</a>).</li>
<li>Fixed output on release with together groups (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3509050945" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/306" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/306/hovercard" href="https://github.com/houmain/keymapper/issues/306">#306</a>).</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.1.02025-10-12T10:15:52Z5.1.0<h3>Added</h3>
<ul>
<li>Verbose keymapper logging logs virtual key state changes (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8909128" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/297" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/297/hovercard" href="https://github.com/houmain/keymapper/discussions/297">#297</a>).</li>
<li>Allowing next-key-info to report multiple keys (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2766068465" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/212" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/212/hovercard" href="https://github.com/houmain/keymapper/issues/212">#212</a>).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed obtaining current keyboard layout on X11/XKB (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3424019364" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/296" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/296/hovercard" href="https://github.com/houmain/keymapper/issues/296">#296</a>).</li>
<li>Ignoring key repeat also when mouse was clicked (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8838097" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/294" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/294/hovercard" href="https://github.com/houmain/keymapper/discussions/294">#294</a>).</li>
<li>Fixed <code>keymapperctl --toggle</code> when invalid key is passed.</li>
</ul>houmaintag:github.com,2008:Repository/177397013/5.0.02025-09-02T17:41:21Z5.0.0<p>The reason for the major version number increment is mainly because of the changed behavior of <code>;</code>. Up until 4.9 it was documented to start comments like <code>#</code>. Otherwise all configurations should work like before.</p>
<h3>Added</h3>
<ul>
<li>
<p>Allow to separate multiple mappings on one line with <code>;</code>. This is useful for macros which generate multiple mappings. e.g.:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="swap = $0 >> $1 ; $1 >> $0
swap[Y, Z]"><pre>swap = <span class="pl-smi">$0</span> <span class="pl-k">>></span> <span class="pl-smi">$1</span> <span class="pl-k">;</span> <span class="pl-smi">$1</span> <span class="pl-k">>></span> <span class="pl-smi">$0</span>
swap[Y, Z]</pre></div>
</li>
<li>
<p>Allow to add mappings for inputs which are released. e.g.:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# trigger when A is released
!A >> B
# trigger when B is released while A is held
A{!B} >> C
# trigger when B is released while A is NOT held
!A !B >> C"><pre><span class="pl-c"><span class="pl-c">#</span> trigger when A is released</span>
<span class="pl-k">!</span>A <span class="pl-k">>></span> B
<span class="pl-c"><span class="pl-c">#</span> trigger when B is released while A is held</span>
A{<span class="pl-k">!</span>B} <span class="pl-k">>></span> C
<span class="pl-c"><span class="pl-c">#</span> trigger when B is released while A is NOT held</span>
<span class="pl-k">!</span>A <span class="pl-k">!</span>B <span class="pl-k">>></span> C</pre></div>
</li>
<li>
<p>Toggling virtual keys can also have immediate effects. Using them as modifiers is toggling them twice:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# toggle Virtual1 before and after pressing B
# this effectively maps D to A B C
Virtual1 >> A ^ C
D >> Virtual1{B}
# {} may also be empty. This maps C to A B
Virtual2 >> B
Virtual1 >> A Virtual2{}
C >> Virtual1{}"><pre><span class="pl-c"><span class="pl-c">#</span> toggle Virtual1 before and after pressing B</span>
<span class="pl-c"><span class="pl-c">#</span> this effectively maps D to A B C</span>
Virtual1 <span class="pl-k">>></span> A ^ C
D <span class="pl-k">>></span> Virtual1{B}
<span class="pl-c"><span class="pl-c">#</span> {} may also be empty. This maps C to A B</span>
Virtual2 <span class="pl-k">>></span> B
Virtual1 <span class="pl-k">>></span> A Virtual2{}
C <span class="pl-k">>></span> Virtual1{}</pre></div>
</li>
<li>
<p>Automatically replace <code>Virtual</code> with an unused virtual key. e.g.:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# assign different virtual keys to VimMode and CapsWord
VimMode = Virtual
CapsWord = Virtual"><pre><span class="pl-c"><span class="pl-c">#</span> assign different virtual keys to VimMode and CapsWord</span>
VimMode = Virtual
CapsWord = Virtual</pre></div>
</li>
<li>
<p>Added <code>keymapperctl</code> operation <code>--notify</code> for showing notifications (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8560761" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/282" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/282/hovercard" href="https://github.com/houmain/keymapper/discussions/282">#282</a>). e.g.:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="notify = $(keymapperctl --notify "$0")
F1 >> notify["Test"]"><pre>notify = <span class="pl-s"><span class="pl-pds">$(</span>keymapperctl --notify <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$0</span><span class="pl-pds">"</span></span><span class="pl-pds">)</span></span>
F1 <span class="pl-k">>></span> notify[<span class="pl-s"><span class="pl-pds">"</span>Test<span class="pl-pds">"</span></span>]</pre></div>
</li>
<li>
<p>Added <code>toggle-active</code> directive, which allows to set a sequence that de-/activates keymapper (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="8560793" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/discussions/283" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/283/hovercard" href="https://github.com/houmain/keymapper/discussions/283">#283</a>). e.g.:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@toggle-active ScrollLock"><pre>@<span class="pl-s1">toggle</span><span class="pl-c1">-</span><span class="pl-s1">active</span> <span class="pl-v">ScrollLock</span></pre></div>
</li>
<li>
<p>Added <code>include-optional</code> directive, which includes a file but does not fail when file does not exist.</p>
</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed suppressed modifiers getting reapplied (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3267293047" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/291" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/291/hovercard" href="https://github.com/houmain/keymapper/issues/291">#291</a>).</li>
<li>Fixed loading config from <code>"%HOME%\.config\keymapper"</code> on Windows (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3327123294" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/292" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/292/hovercard" href="https://github.com/houmain/keymapper/issues/292">#292</a>).</li>
<li>Properly releasing keys when UAC prompt appeared on Windows.</li>
</ul>houmaintag:github.com,2008:Repository/177397013/4.12.32025-07-13T06:32:17Z4.12.3<h3>Fixed</h3>
<ul>
<li>Fixed problem with virtual keys (introduced in 4.12.1 for <a href="https://github.com/houmain/keymapper/discussions/275#discussioncomment-13210753" data-hovercard-type="discussion" data-hovercard-url="/houmain/keymapper/discussions/275/hovercard?comment_id=13210753">#275</a>).</li>
<li>Fixed checking for a specific number of mouse wheel events (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3200204013" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/280" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/280/hovercard" href="https://github.com/houmain/keymapper/issues/280">#280</a>).</li>
</ul>houmaintag:github.com,2008:Repository/177397013/4.12.22025-06-29T10:34:34Z4.12.2<h3>Added</h3>
<ul>
<li>Showing a hint in "Next Key Info" that Gnome/KDE script is not enabled.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Handling only lowres wheel events by default on Linux (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3039804327" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/268" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/268/hovercard" href="https://github.com/houmain/keymapper/issues/268">#268</a>).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Not blocking when opening configuration from tray on Linux (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2816838501" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/220" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/220/hovercard" href="https://github.com/houmain/keymapper/issues/220">#220</a>).</li>
<li>Fixed focus update when xwayland app is minimized to tray (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2816838501" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/220" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/220/hovercard" href="https://github.com/houmain/keymapper/issues/220">#220</a>).</li>
<li>Fixed device context fallthrough (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3185455160" data-permission-text="Title is private" data-url="https://github.com/houmain/keymapper/issues/277" data-hovercard-type="issue" data-hovercard-url="/houmain/keymapper/issues/277/hovercard" href="https://github.com/houmain/keymapper/issues/277">#277</a>).</li>
<li>Optimized SVG icon.</li>
</ul>houmain