<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>HardwareonDocs</title><link>https://hiraethecho.github.io/docs/tags/hardware/</link><description>Recent contentinHardwareonDocs</description><generator>Hugo --0.152.2</generator><language>en</language><managingEditor>wyz2016zxc@outlook.com(Hiraeth)</managingEditor><webMaster>wyz2016zxc@outlook.com(Hiraeth)</webMaster><lastBuildDate>Mon, 16 Mar 2026 15:39:39 +0800</lastBuildDate><atom:link href="https://hiraethecho.github.io/docs/tags/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>从键盘到字符</title><link>https://hiraethecho.github.io/docs/linux/keysym/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/linux/keysym/</guid><description>linux下从键盘收到信号后到屏幕上显示字符的过程</description><content:encoded><![CDATA[<h1 id="从键盘到字符">
  <a class="anchor inpage" href="#%e4%bb%8e%e9%94%ae%e7%9b%98%e5%88%b0%e5%ad%97%e7%ac%a6">#</a>从键盘到字符</h1>
<h2 id="前置知识">
  <a class="anchor inpage" href="#%e5%89%8d%e7%bd%ae%e7%9f%a5%e8%af%86">##</a>前置知识</h2>
<p>参考
</p>
<ul>
<li>硬件，即键盘本身，发出扫描码（scancode），发送给内核；</li>
<li>内核并将其转换为键码（keycode）。键码是操作系统用来识别按键的数字表示。</li>
<li>受到键码后，X服务器或Wayland合成器将其转换为键符（keysym）。键符是一个更高级别的表示，表示按键的实际字符或功能。</li>
</ul>
<p>在xorg下，有
来使用keycode</p>
<h2 id="识别">
  <a class="anchor inpage" href="#%e8%af%86%e5%88%ab">##</a>识别</h2>
<p>xorg下管理接入的输入设备，例如 find id of touchpad:</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">xinput list | grep -i &#34;Touchpad&#34; | awk &#39;{print $6}&#39; | sed &#39;s/[^0-9]//g&#39;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>似乎需要添加文件 <code>/usr/share/X11/xorg.conf.d/30-touchpad.conf</code></p>
<details open>
    <summary>conf</summary><pre
        class="codeblock"
      ><code class="language-conf" data-lang="conf">Section &#34;InputClass&#34;
        Identifier &#34;MyTouchpad&#34;
        MatchIsTouchpad &#34;on&#34;
        Driver &#34;libinput&#34;
        Option &#34;Tapping&#34; &#34;on&#34;
EndSection</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>之后才能正常识别<code>touchpad</code>：</p>
<details open>
    <summary>xinput</summary><pre
        class="codeblock"
      ><code class="language-xinput" data-lang="xinput">
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ GXTP7863:00 27C6:01E0 Mouse             	id=11	[slave  pointer  (2)]
⎜   ↳ GXTP7863:00 27C6:01E0 Touchpad          	id=12	[slave  pointer  (2)]
⎜   ↳ HS6209 2.4G Wireless Receiver Keyboard  	id=9	[slave  pointer  (2)]
⎜   ↳ HS6209 2.4G Wireless Receiver Mouse     	id=10	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Video Bus                               	id=6	[slave  keyboard (3)]
    ↳ Power Button                            	id=7	[slave  keyboard (3)]
    ↳ Huawei WMI hotkeys                      	id=13	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=14	[slave  keyboard (3)]</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>否则只会识别两个设备，没有 <code>Mouse</code> <code>Touchpad</code></p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>$ xinput list
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>⎡ Virtual core pointer                    	id<span style="color:#f92672">=</span>2	<span style="color:#f92672">[</span>master pointer  <span style="color:#f92672">(</span>3<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>⎜   ↳ Virtual core XTEST pointer              	id<span style="color:#f92672">=</span>4	<span style="color:#f92672">[</span>slave  pointer  <span style="color:#f92672">(</span>2<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>⎜   ↳ GXTP7863:00 27C6:01E0                   	id<span style="color:#f92672">=</span>10	<span style="color:#f92672">[</span>slave  pointer  <span style="color:#f92672">(</span>2<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>⎜   ↳ GXTP7863:00 27C6:01E0                   	id<span style="color:#f92672">=</span>11	<span style="color:#f92672">[</span>slave  pointer  <span style="color:#f92672">(</span>2<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>⎣ Virtual core keyboard                   	id<span style="color:#f92672">=</span>3	<span style="color:#f92672">[</span>master keyboard <span style="color:#f92672">(</span>2<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>    ↳ Virtual core XTEST keyboard             	id<span style="color:#f92672">=</span>5	<span style="color:#f92672">[</span>slave  keyboard <span style="color:#f92672">(</span>3<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>    ↳ Video Bus                               	id<span style="color:#f92672">=</span>6	<span style="color:#f92672">[</span>slave  keyboard <span style="color:#f92672">(</span>3<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>    ↳ Power Button                            	id<span style="color:#f92672">=</span>7	<span style="color:#f92672">[</span>slave  keyboard <span style="color:#f92672">(</span>3<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>    ↳ Huawei WMI hotkeys                      	id<span style="color:#f92672">=</span>12	<span style="color:#f92672">[</span>slave  keyboard <span style="color:#f92672">(</span>3<span style="color:#f92672">)]</span>
</span></span><span style="display:flex;"><span>    ↳ AT Translated Set <span style="color:#ae81ff">2</span> keyboard            	id<span style="color:#f92672">=</span>13	<span style="color:#f92672">[</span>slave  keyboard <span style="color:#f92672">(</span>3<span style="color:#f92672">)]</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p><code>xev</code>: find keycode;</p>
<h2 id="修改">
  <a class="anchor inpage" href="#%e4%bf%ae%e6%94%b9">##</a>修改</h2>
<h3 id="xorg">
  <a class="anchor inpage" href="#xorg">###</a>xorg</h3>
<p>支持的修改可以参考 <code>/usr/share/X11/xkb/rules/base.lst</code></p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">  caps                 Caps Lock behavior
  caps:internal        Caps Lock uses internal capitalization; Shift &#34;pauses&#34; Caps Lock
  caps:internal_nocancel Caps Lock uses internal capitalization; Shift does not affect Caps Lock
  caps:shift           Caps Lock acts as Shift with locking; Shift &#34;pauses&#34; Caps Lock
  caps:shift_nocancel  Caps Lock acts as Shift with locking; Shift does not affect Caps Lock
  caps:capslock        Caps Lock toggles normal capitalization of alphabetic characters
  caps:shiftlock       Caps Lock toggles Shift Lock (affects all keys)
  caps:swapescape      Swap Esc and Caps Lock
  caps:escape          Make Caps Lock an additional Esc
  caps:escape_shifted_capslock Make Caps Lock an additional Esc, but Shift &#43; Caps Lock is the regular Caps Lock
  caps:backspace       Make Caps Lock an additional Backspace
  caps:return          Make Caps Lock an additional Return key
  caps:super           Make Caps Lock an additional Super
  caps:hyper           Make Caps Lock an additional Hyper
  caps:menu            Make Caps Lock an additional Menu key
  caps:numlock         Make Caps Lock an additional Num Lock
  caps:ctrl_shifted_capslock Make Caps Lock an additional Ctrl and Shift &#43; Caps Lock the regular Caps Lock
  caps:ctrl_modifier   Make Caps Lock act as an additional Ctrl modifier, but keep identifying as Caps Lock
  caps:digits_row      Caps Lock gives digits on the digits row (Azerty layouts)
  caps:digits_row_independent_lock Shift &#43; Caps locks the digits on the digits row, Caps Lock alone behaves as usual (Azerty layouts)
  caps:none            Caps Lock is disabled

  ctrl                 Ctrl position
  ctrl:nocaps          Caps Lock as Ctrl
  ctrl:lctrl_meta      Left Ctrl as Meta
  ctrl:swapcaps        Swap Ctrl and Caps Lock
  ctrl:grouptoggle_capscontrol Caps Lock as Ctrl,  Left Control switches to another layout
  ctrl:hyper_capscontrol Caps Lock as Ctrl, Ctrl as Hyper
  ctrl:ac_ctrl         To the left of &#34;A&#34;
  ctrl:aa_ctrl         At the bottom left
  ctrl:rctrl_ralt      Right Ctrl as Right Alt
  ctrl:ralt_rctrl      Right Alt as Right Control
  ctrl:menu_rctrl      Menu as Right Ctrl
  ctrl:swap_lalt_lctl  Swap Left Alt with Left Ctrl
  ctrl:swap_ralt_rctl  Swap Right Alt with Right Ctrl
  ctrl:swap_lwin_lctl  Swap Left Win with Left Ctrl
  ctrl:swap_rwin_rctl  Swap Right Win with Right Ctrl
  ctrl:swap_lalt_lctl_lwin Left Alt as Ctrl, Left Ctrl as Win, Left Win as Left Alt</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h4 id="xmodmap">
  <a class="anchor inpage" href="#xmodmap">####</a>xmodmap</h4>
<details open>
    <summary>man</summary><pre
        class="chroma codeblock"
      ><code class="language-man" data-lang="man"
          ><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>XMODMAP(1)                  General Commands Manual                  XMODMAP(1)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>NAME
</span></span><span style="display:flex;"><span>       xmodmap - utility for modifying keymaps and pointer button mappings in X
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>SYNOPSIS
</span></span><span style="display:flex;"><span>       xmodmap [-options ...] [filename]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>DESCRIPTION
</span></span><span style="display:flex;"><span>       The  xmodmap  program  is used to edit and display the keyboard modifier
</span></span><span style="display:flex;"><span>       map and keymap table that are used by  client  applications  to  convert
</span></span><span style="display:flex;"><span>       event  keycodes into keysyms.  It is usually run from the user&#39;s session
</span></span><span style="display:flex;"><span>       startup script to configure the keyboard according to personal tastes.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>OPTIONS
</span></span><span style="display:flex;"><span>       The following options may be used with xmodmap:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -display display
</span></span><span style="display:flex;"><span>               This option specifies the host and display to use.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -help   This option indicates that a brief description  of  the  command
</span></span><span style="display:flex;"><span>               line  arguments should be printed on the standard error channel.
</span></span><span style="display:flex;"><span>               This will be done whenever an unhandled  argument  is  given  to
</span></span><span style="display:flex;"><span>               xmodmap.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -grammar
</span></span><span style="display:flex;"><span>               This option indicates that a help message describing the expres‐
</span></span><span style="display:flex;"><span>               sion  grammar  used  in  files and with -e expressions should be
</span></span><span style="display:flex;"><span>               printed on the standard error.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -version
</span></span><span style="display:flex;"><span>               This option indicates that xmodmap should print its version  in‐
</span></span><span style="display:flex;"><span>               formation and exit.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -verbose
</span></span><span style="display:flex;"><span>               This option indicates that xmodmap should print logging informa‐
</span></span><span style="display:flex;"><span>               tion as it parses its input.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -quiet  This option turns off the verbose logging.  This is the default.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -n      This  option  indicates  that xmodmap should not change the map‐
</span></span><span style="display:flex;"><span>               pings, but should display what it would do,  like  make(1)  does
</span></span><span style="display:flex;"><span>               when given this option.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -e expression
</span></span><span style="display:flex;"><span>               This  option specifies an expression to be executed.  Any number
</span></span><span style="display:flex;"><span>               of expressions may be specified from the command line.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -pm     This option indicates that the current modifier  map  should  be
</span></span><span style="display:flex;"><span>               printed  on  the  standard output.   This is the default mode of
</span></span><span style="display:flex;"><span>               operation if no other mode options are specified.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -pk     This option indicates that the current keymap  table  should  be
</span></span><span style="display:flex;"><span>               printed on the standard output.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -pke    This  option  indicates  that the current keymap table should be
</span></span><span style="display:flex;"><span>               printed on the standard output in the form of  expressions  that
</span></span><span style="display:flex;"><span>               can be fed back to xmodmap.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -pp     This  option  indicates  that  the current pointer map should be
</span></span><span style="display:flex;"><span>               printed on the standard output.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -       A lone dash means that the standard input should be used as  the
</span></span><span style="display:flex;"><span>               input file.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       The  filename specifies a file containing xmodmap expressions to be exe‐
</span></span><span style="display:flex;"><span>       cuted.  This file is usually kept in the user&#39;s home  directory  with  a
</span></span><span style="display:flex;"><span>       name like .xmodmaprc.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>EXPRESSION GRAMMAR
</span></span><span style="display:flex;"><span>       The  xmodmap program reads a list of expressions and parses them all be‐
</span></span><span style="display:flex;"><span>       fore attempting to execute any of them.  This makes it possible to refer
</span></span><span style="display:flex;"><span>       to keysyms that are being redefined in a natural way without  having  to
</span></span><span style="display:flex;"><span>       worry as much about name conflicts.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       The   list   of   keysym   names   may  be  found  in  the  header  file
</span></span><span style="display:flex;"><span>       &lt;X11/keysymdef.h&gt; (without the XK_ prefix).   Keysyms  matching  Unicode
</span></span><span style="display:flex;"><span>       characters  may  be  specified  as  &#34;U0020&#34;  to  &#34;U007E&#34;  and &#34;U00A0&#34; to
</span></span><span style="display:flex;"><span>       &#34;U10FFFF&#34; for all possible Unicode characters.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       keycode NUMBER = KEYSYMNAME ...
</span></span><span style="display:flex;"><span>               The list of keysyms is assigned to the indicated keycode  (which
</span></span><span style="display:flex;"><span>               may  be specified in decimal, hex or octal and can be determined
</span></span><span style="display:flex;"><span>               by running the xev program).  Up to eight  keysyms  may  be  at‐
</span></span><span style="display:flex;"><span>               tached to a key, however the last four are not used in any major
</span></span><span style="display:flex;"><span>               X server implementation.  The first keysym is used when no modi‐
</span></span><span style="display:flex;"><span>               fier  key  is  pressed  in conjunction with this key, the second
</span></span><span style="display:flex;"><span>               with Shift, the third when the Mode_switch key is used with this
</span></span><span style="display:flex;"><span>               key and the fourth when both the Mode_switch and Shift keys  are
</span></span><span style="display:flex;"><span>               used.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       keycode any = KEYSYMNAME ...
</span></span><span style="display:flex;"><span>               If no existing key has the specified list of keysyms assigned to
</span></span><span style="display:flex;"><span>               it,  a spare key on the keyboard is selected and the keysyms are
</span></span><span style="display:flex;"><span>               assigned to it.  The list of keysyms may be specified  in  deci‐
</span></span><span style="display:flex;"><span>               mal, hex or octal.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       keysym KEYSYMNAME = KEYSYMNAME ...
</span></span><span style="display:flex;"><span>               The KEYSYMNAME on the left hand side is translated into matching
</span></span><span style="display:flex;"><span>               keycodes  used  to  perform the corresponding set of keycode ex‐
</span></span><span style="display:flex;"><span>               pressions.  Note that if the same keysym is  bound  to  multiple
</span></span><span style="display:flex;"><span>               keys, the expression is executed for each matching keycode.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       clear MODIFIERNAME
</span></span><span style="display:flex;"><span>               This removes all entries in the modifier map for the given modi‐
</span></span><span style="display:flex;"><span>               fier,  where  valid  name are: Shift, Lock, Control, Mod1, Mod2,
</span></span><span style="display:flex;"><span>               Mod3, Mod4, and Mod5 (case does not matter  in  modifier  names,
</span></span><span style="display:flex;"><span>               although  it  does  matter  for  all other names).  For example,
</span></span><span style="display:flex;"><span>               ‘‘clear Lock&#39;&#39; will remove all any keys that were bound  to  the
</span></span><span style="display:flex;"><span>               shift lock modifier.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       add MODIFIERNAME = KEYSYMNAME ...
</span></span><span style="display:flex;"><span>               This adds all keys containing the given keysyms to the indicated
</span></span><span style="display:flex;"><span>               modifier  map.   The  keysym names are evaluated after all input
</span></span><span style="display:flex;"><span>               expressions are read to make it easy  to  write  expressions  to
</span></span><span style="display:flex;"><span>               swap keys (see the EXAMPLES section).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       remove MODIFIERNAME = KEYSYMNAME ...
</span></span><span style="display:flex;"><span>               This  removes all keys containing the given keysyms from the in‐
</span></span><span style="display:flex;"><span>               dicated modifier map.  Unlike add, the keysym names  are  evalu‐
</span></span><span style="display:flex;"><span>               ated  as  the  line  is read in.  This allows you to remove keys
</span></span><span style="display:flex;"><span>               from a modifier without having to worry  about  whether  or  not
</span></span><span style="display:flex;"><span>               they have been reassigned.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       pointer = default
</span></span><span style="display:flex;"><span>               This sets the pointer map back to its default settings (button 1
</span></span><span style="display:flex;"><span>               generates a code of 1, button 2 generates a 2, etc.).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       pointer = NUMBER ...
</span></span><span style="display:flex;"><span>               This sets the pointer map to contain the indicated button codes.
</span></span><span style="display:flex;"><span>               The  list always starts with the first physical button.  Setting
</span></span><span style="display:flex;"><span>               a button code to 0 disables events from that button.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Lines that begin with an exclamation point (!) are taken as comments.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       If you want to change the binding of a modifier key, you must  also  re‐
</span></span><span style="display:flex;"><span>       move it from the appropriate modifier map.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>EXAMPLES
</span></span><span style="display:flex;"><span>       Many  pointers  are designed such that the first button is pressed using
</span></span><span style="display:flex;"><span>       the index finger of the right hand.  People  who  are  left-handed  fre‐
</span></span><span style="display:flex;"><span>       quently  find  that  it  is more comfortable to reverse the button codes
</span></span><span style="display:flex;"><span>       that get generated so that the primary button is pressed using the index
</span></span><span style="display:flex;"><span>       finger of the left hand.  This could be done on a 3  button  pointer  as
</span></span><span style="display:flex;"><span>       follows:
</span></span><span style="display:flex;"><span>       %  xmodmap -e &#34;pointer = 3 2 1&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Many  applications  support  the notion of Meta keys (similar to Control
</span></span><span style="display:flex;"><span>       keys except that Meta is held down instead of Control).   However,  some
</span></span><span style="display:flex;"><span>       servers  do  not  have a Meta keysym in the default keymap table, so one
</span></span><span style="display:flex;"><span>       needs to be added by hand.  The following command will  attach  Meta  to
</span></span><span style="display:flex;"><span>       the  Multi-language  key (sometimes labeled Compose Character).  It also
</span></span><span style="display:flex;"><span>       takes advantage of the fact that applications that need a Meta key  sim‐
</span></span><span style="display:flex;"><span>       ply  need  to  get the keycode and don&#39;t require the keysym to be in the
</span></span><span style="display:flex;"><span>       first column of the keymap table.  This means that applications that are
</span></span><span style="display:flex;"><span>       looking for a Multi_key (including the default modifier map)  won&#39;t  no‐
</span></span><span style="display:flex;"><span>       tice any change.
</span></span><span style="display:flex;"><span>       %  xmodmap -e &#34;keysym Multi_key = Multi_key Meta_L&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Similarly, some keyboards have an Alt key but no Meta key.  In that case
</span></span><span style="display:flex;"><span>       the following may be useful:
</span></span><span style="display:flex;"><span>       %  xmodmap -e &#34;keysym Alt_L = Meta_L Alt_L&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       One  of  the  more simple, yet convenient, uses of xmodmap is to set the
</span></span><span style="display:flex;"><span>       keyboard&#39;s &#34;rubout&#34; key to generate  an  alternate  keysym.   This  fre‐
</span></span><span style="display:flex;"><span>       quently involves exchanging Backspace with Delete to be more comfortable
</span></span><span style="display:flex;"><span>       to the user.  If the ttyModes resource in xterm is set as well, all ter‐
</span></span><span style="display:flex;"><span>       minal emulator windows will use the same key for erasing characters:
</span></span><span style="display:flex;"><span>       %  xmodmap -e &#34;keysym BackSpace = Delete&#34;
</span></span><span style="display:flex;"><span>       %  echo &#34;XTerm*ttyModes:  erase ^?&#34; | xrdb -merge
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Some  keyboards do not automatically generate less than and greater than
</span></span><span style="display:flex;"><span>       characters when the comma and period keys  are  shifted.   This  can  be
</span></span><span style="display:flex;"><span>       remedied with xmodmap by resetting the bindings for the comma and period
</span></span><span style="display:flex;"><span>       with the following scripts:
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       ! make shift-, be &lt; and shift-. be &gt;
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       keysym comma = comma less
</span></span><span style="display:flex;"><span>       keysym period = period greater
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       One of the more irritating differences between keyboards is the location
</span></span><span style="display:flex;"><span>       of  the  Control  and CapsLock keys.  A common use of xmodmap is to swap
</span></span><span style="display:flex;"><span>       these two keys as follows:
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       ! Swap Caps_Lock and Control_L
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       remove Lock = Caps_Lock
</span></span><span style="display:flex;"><span>       remove Control = Control_L
</span></span><span style="display:flex;"><span>       keysym Control_L = Caps_Lock
</span></span><span style="display:flex;"><span>       keysym Caps_Lock = Control_L
</span></span><span style="display:flex;"><span>       add Lock = Caps_Lock
</span></span><span style="display:flex;"><span>       add Control = Control_L
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       This example can be run again to swap the keys back  to  their  previous
</span></span><span style="display:flex;"><span>       assignments.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       The  keycode command is useful for assigning the same keysym to multiple
</span></span><span style="display:flex;"><span>       keycodes.  Although unportable, it  also  makes  it  possible  to  write
</span></span><span style="display:flex;"><span>       scripts  that  can  reset  the keyboard to a known state.  The following
</span></span><span style="display:flex;"><span>       script sets the backspace key  to  generate  Delete  (as  shown  above),
</span></span><span style="display:flex;"><span>       flushes  all  existing  caps  lock bindings, makes the CapsLock key be a
</span></span><span style="display:flex;"><span>       control key, make F5 generate Escape, and makes Break/Reset be  a  shift
</span></span><span style="display:flex;"><span>       lock.
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       ! On the HP, the following keycodes have key caps as listed:
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       !     101  Backspace
</span></span><span style="display:flex;"><span>       !      55  Caps
</span></span><span style="display:flex;"><span>       !      14  Ctrl
</span></span><span style="display:flex;"><span>       !      15  Break/Reset
</span></span><span style="display:flex;"><span>       !      86  Stop
</span></span><span style="display:flex;"><span>       !      89  F5
</span></span><span style="display:flex;"><span>       !
</span></span><span style="display:flex;"><span>       keycode 101 = Delete
</span></span><span style="display:flex;"><span>       keycode 55 = Control_R
</span></span><span style="display:flex;"><span>       clear Lock
</span></span><span style="display:flex;"><span>       add Control = Control_R
</span></span><span style="display:flex;"><span>       keycode 89 = Escape
</span></span><span style="display:flex;"><span>       keycode 15 = Caps_Lock
</span></span><span style="display:flex;"><span>       add Lock = Caps_Lock
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>ENVIRONMENT
</span></span><span style="display:flex;"><span>       DISPLAY to get default host and display number.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>X Version 11                     xmodmap 1.0.11                      XMODMAP(1)</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>xmodmap 修改键码到键符的映射 (<code>xkeycaps</code> gui);</p>
<p>usage of <code>xmodmap</code>:</p>
<p>modifier for X Window. mod1: left Alt, mod2: Num_Lock，mod3: no，mod4: Left Super (windows)，mod5: Shift</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>$ xmodmap -pm
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xmodmap:  up to <span style="color:#ae81ff">4</span> keys per modifier, <span style="color:#f92672">(</span>keycodes in parentheses<span style="color:#f92672">)</span>:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>shift       Shift_L <span style="color:#f92672">(</span>0x32<span style="color:#f92672">)</span>,  Shift_R <span style="color:#f92672">(</span>0x3e<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>lock        Caps_Lock <span style="color:#f92672">(</span>0x42<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>control     Control_L <span style="color:#f92672">(</span>0x25<span style="color:#f92672">)</span>,  Control_R <span style="color:#f92672">(</span>0x69<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>mod1        Alt_L <span style="color:#f92672">(</span>0x40<span style="color:#f92672">)</span>,  Alt_R <span style="color:#f92672">(</span>0x6c<span style="color:#f92672">)</span>,  Alt_L <span style="color:#f92672">(</span>0xcc<span style="color:#f92672">)</span>,  Meta_L <span style="color:#f92672">(</span>0xcd<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>mod2        Num_Lock <span style="color:#f92672">(</span>0x4d<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>mod3        ISO_Level5_Shift <span style="color:#f92672">(</span>0xcb<span style="color:#f92672">)</span>,  Hyper_L <span style="color:#f92672">(</span>0xcf<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>mod4        Super_L <span style="color:#f92672">(</span>0x85<span style="color:#f92672">)</span>,  Super_R <span style="color:#f92672">(</span>0x86<span style="color:#f92672">)</span>,  Super_L <span style="color:#f92672">(</span>0xce<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>mod5        ISO_Level3_Shift <span style="color:#f92672">(</span>0x5c<span style="color:#f92672">)</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>Keycode is what the kernal get, and keysym is what it gives. Each keysym column in the table corresponds to a particular combination of modifier keys:</p>
<ol>
<li>Key</li>
<li>Shift+Key</li>
<li>Mode_switch+Key</li>
<li>Mode_switch+Shift+Key</li>
<li>ISO_Level3_Shift+Key</li>
<li>ISO_Level3_Shift+Shift+Key</li>
</ol>
<p>check current keycode map:</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">$ xmodmap -pke

keycode   8 =
keycode   9 = Escape NoSymbol Escape
keycode  10 = 1 exclam 1 exclam
keycode  11 = 2 at 2 at
keycode  12 = 3 numbersign 3 numbersign
keycode  13 = 4 dollar 4 dollar
keycode  14 = 5 percent 5 percent
keycode  15 = 6 asciicircum 6 asciicircum
keycode  16 = 7 ampersand 7 ampersand
keycode  17 = 8 asterisk 8 asterisk
keycode  18 = 9 parenleft 9 parenleft
keycode  19 = 0 parenright 0 parenright
...
keycode  34 = bracketleft braceleft bracketleft braceleft
keycode  35 = bracketright braceright bracketright braceright
keycode  36 = Return NoSymbol Return
keycode  37 = Control_L NoSymbol Control_L
keycode  38 = a A a A
keycode  39 = s S s S
keycode  40 = d D d D
keycode  41 = f F f F
keycode  42 = g G g G
keycode  43 = h H h H
keycode  67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode  68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
...</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><blockquote class="alert alert-warning">
      <p class="alert-heading">WARNING</p><p>xmodmap设置会被setxkbmap重置，它不仅将字母数字键改变为映射表中的值，还将所有其他键重置为启动时的默认值。
由于Xorg的限制，xmodmap设置不会自动应用到热插拔设备上。如果在应用了自定义映射表后，系统中添加了一个新的键盘，则必须重新应用自定义映射表</p></blockquote><h4 id="setxkbmap">
  <a class="anchor inpage" href="#setxkbmap">####</a>setxkbmap</h4>
<p><code>setxkbmap</code>: set keyboard layout;</p>
<details open>
    <summary>man</summary><pre
        class="chroma codeblock"
      ><code class="language-man" data-lang="man"
          ><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>SETXKBMAP(1)                General Commands Manual                SETXKBMAP(1)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>NAME
</span></span><span style="display:flex;"><span>       setxkbmap - set the keyboard using the X Keyboard Extension
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>SYNOPSIS
</span></span><span style="display:flex;"><span>       setxkbmap [ args ] [ layout [ variant [ option ...  ] ] ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>DESCRIPTION
</span></span><span style="display:flex;"><span>       The  setxkbmap command maps the keyboard to use the layout determined by
</span></span><span style="display:flex;"><span>       the options specified on the command line.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       An XKB keymap is constructed from a number of components which are  com‐
</span></span><span style="display:flex;"><span>       piled only as needed.  The source for all of the components can be found
</span></span><span style="display:flex;"><span>       in /usr/share/X11/xkb.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>OPTIONS
</span></span><span style="display:flex;"><span>       -compat name
</span></span><span style="display:flex;"><span>               Specifies  the  name  of the compatibility map component used to
</span></span><span style="display:flex;"><span>               construct a keyboard layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -config file
</span></span><span style="display:flex;"><span>               Specifies the name of an XKB configuration file which  describes
</span></span><span style="display:flex;"><span>               the keyboard to be used.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -device device
</span></span><span style="display:flex;"><span>               Specifies  the  numeric  device id of the input device to be up‐
</span></span><span style="display:flex;"><span>               dated with the new keyboard layout. If not specified,  the  core
</span></span><span style="display:flex;"><span>               keyboard device of the X server is updated.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -display display
</span></span><span style="display:flex;"><span>               Specifies  the  display to be updated with the new keyboard lay‐
</span></span><span style="display:flex;"><span>               out.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -geometry name
</span></span><span style="display:flex;"><span>               Specifies the name of the geometry component used to construct a
</span></span><span style="display:flex;"><span>               keyboard layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -help   Prints a message describing the valid input to setxkbmap.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -I directory
</span></span><span style="display:flex;"><span>               Adds a directory to the list of directories to be used to search
</span></span><span style="display:flex;"><span>               for specified layout or rules files.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -keycodes name
</span></span><span style="display:flex;"><span>               Specifies the name of the keycodes component used to construct a
</span></span><span style="display:flex;"><span>               keyboard layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -keymap name
</span></span><span style="display:flex;"><span>               Specifies the name of the keymap description used to construct a
</span></span><span style="display:flex;"><span>               keyboard layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -layout name
</span></span><span style="display:flex;"><span>               Specifies the name of the layout used to  determine  the  compo‐
</span></span><span style="display:flex;"><span>               nents which make up the keyboard description. The -layout option
</span></span><span style="display:flex;"><span>               may  only  be  used once. Multiple layouts can be specified as a
</span></span><span style="display:flex;"><span>               comma-separated list.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -model name
</span></span><span style="display:flex;"><span>               Specifies the name of the keyboard model used to  determine  the
</span></span><span style="display:flex;"><span>               components  which  make  up  the keyboard description.  Only one
</span></span><span style="display:flex;"><span>               model may be specified on the command line.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -option name
</span></span><span style="display:flex;"><span>               Specifies the name of an  option  to  determine  the  components
</span></span><span style="display:flex;"><span>               which make up the keyboard description;  multiple options may be
</span></span><span style="display:flex;"><span>               specified,  one  per  -option flag. Note that setxkbmap adds op‐
</span></span><span style="display:flex;"><span>               tions specified in the command line to the options that were set
</span></span><span style="display:flex;"><span>               before (as saved in root window properties). If you want to  re‐
</span></span><span style="display:flex;"><span>               place  all  previously  specified  options, use the -option flag
</span></span><span style="display:flex;"><span>               with an empty argument first.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -print  With this option setxkbmap just prints component names in a for‐
</span></span><span style="display:flex;"><span>               mat acceptable by xkbcomp (an XKB keymap  compiler)  and  exits.
</span></span><span style="display:flex;"><span>               The option can be used for tests instead of a verbose option and
</span></span><span style="display:flex;"><span>               in  cases  when one needs to run both the setxkbmap and the xkb‐
</span></span><span style="display:flex;"><span>               comp in chain (see below).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -query  With this option setxkbmap just prints the current rules, model,
</span></span><span style="display:flex;"><span>               layout, variant, and options, then exits.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -rules file
</span></span><span style="display:flex;"><span>               Specifies the name of the rules file used  to  resolve  the  re‐
</span></span><span style="display:flex;"><span>               quested layout and model to a set of component names.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -symbols name
</span></span><span style="display:flex;"><span>               Specifies  the name of the symbols component used to construct a
</span></span><span style="display:flex;"><span>               keyboard layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -synch  Force synchronization for X requests.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -types name
</span></span><span style="display:flex;"><span>               Specifies the name of the types component used  to  construct  a
</span></span><span style="display:flex;"><span>               keyboard layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -variant name
</span></span><span style="display:flex;"><span>               Specifies which variant of the keyboard layout should be used to
</span></span><span style="display:flex;"><span>               determine the components which make up the keyboard description.
</span></span><span style="display:flex;"><span>               The -variant option may only be used once. Multiple variants can
</span></span><span style="display:flex;"><span>               be  specified as a comma-separated list and will be matched with
</span></span><span style="display:flex;"><span>               the layouts specified with -layout.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -verbose|-v [level]
</span></span><span style="display:flex;"><span>               Specifies level of verbosity in output messages.   Valid  levels
</span></span><span style="display:flex;"><span>               range  from 0 (least verbose) to 10 (most verbose).  The default
</span></span><span style="display:flex;"><span>               verbosity level is 5.  If no level  is  specified,  each  -v  or
</span></span><span style="display:flex;"><span>               -verbose flag raises the level by 1.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -version
</span></span><span style="display:flex;"><span>               Prints the program&#39;s version number.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>USING WITH xkbcomp
</span></span><span style="display:flex;"><span>       If you have an Xserver and a client shell running on different computers
</span></span><span style="display:flex;"><span>       and  some  XKB  configuration files on those machines are different, you
</span></span><span style="display:flex;"><span>       can get problems specifying a keyboard map by model, layout, and options
</span></span><span style="display:flex;"><span>       names.  This is because setxkbmap converts its arguments to names of XKB
</span></span><span style="display:flex;"><span>       configuration files according to files that are on the client-side  com‐
</span></span><span style="display:flex;"><span>       puter,  then  sends  these file names to the server where xkbcomp has to
</span></span><span style="display:flex;"><span>       compose a complete keyboard map using files which the server has.   Thus
</span></span><span style="display:flex;"><span>       if the sets of files differ in some way, the names that setxkbmap gener‐
</span></span><span style="display:flex;"><span>       ates can be unacceptable on the server side.  You can solve this problem
</span></span><span style="display:flex;"><span>       by  running  the xkbcomp on the client side too.  With the -print option
</span></span><span style="display:flex;"><span>       setxkbmap just prints the file names in an  appropriate  format  to  its
</span></span><span style="display:flex;"><span>       stdout  and this output can be piped directly to the xkbcomp input.  For
</span></span><span style="display:flex;"><span>       example, the command
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       setxkbmap us -print | xkbcomp - $DISPLAY
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       makes both steps run on the same (client) machine and loads  a  keyboard
</span></span><span style="display:flex;"><span>       map into the server.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>XWAYLAND
</span></span><span style="display:flex;"><span>       Xwayland  is  an  X  server  that  uses a Wayland Compositor as backend.
</span></span><span style="display:flex;"><span>       Xwayland acts as translation layer between the X protocol and  the  Way‐
</span></span><span style="display:flex;"><span>       land protocol but does not manage the keymaps - these are handled by the
</span></span><span style="display:flex;"><span>       Wayland Compositor.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Changing  the  keymap  with  setxkbmap is not supported by Xwayland.  In
</span></span><span style="display:flex;"><span>       most instances, using setxkbmap on Xwayland is indicative of a bug in  a
</span></span><span style="display:flex;"><span>       shell script and setxkbmap will print a warning. Use the Wayland Compos‐
</span></span><span style="display:flex;"><span>       itor&#39;s native XKB configuration methods instead.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>SEE ALSO
</span></span><span style="display:flex;"><span>       xkbcomp(1), xkeyboard-config(7)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>FILES
</span></span><span style="display:flex;"><span>       /usr/share/X11/xkb
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>X Version 11                    setxkbmap 1.3.4                    SETXKBMAP(1)</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>simple examples</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>setxkbmap -option ctrl:swapcaps <span style="color:#75715e"># swap ctrl and caps</span>
</span></span><span style="display:flex;"><span>setxkbmap -option ctrl:nocaps</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h4 id="xcape">
  <a class="anchor inpage" href="#xcape">####</a>xcape</h4>
<p><code>xcape</code>: use a modifier as another key.</p>
<details open>
    <summary>man</summary><pre
        class="chroma codeblock"
      ><code class="language-man" data-lang="man"
          ><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>XCAPE(1)                          xcape Manual                         XCAPE(1)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>NAME
</span></span><span style="display:flex;"><span>       xcape - use a modifier key as another key
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>SYNOPSIS
</span></span><span style="display:flex;"><span>       xcape [-d] [-t timeout] [-e map-expression]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>DESCRIPTION
</span></span><span style="display:flex;"><span>       xcape allows a modifier key to be used as another key when it is pressed
</span></span><span style="display:flex;"><span>       and released on its own. The default behaviour is to generate the Escape
</span></span><span style="display:flex;"><span>       key in place of Control_L (Left Control).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>OPTIONS
</span></span><span style="display:flex;"><span>       -d     Debug mode.  Will run as a foreground process.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -t timeout
</span></span><span style="display:flex;"><span>              Give  a  timeout  in milliseconds.  If you hold a key longer than
</span></span><span style="display:flex;"><span>              timeout a key event will not be generated.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       -e map-expression
</span></span><span style="display:flex;"><span>              Use map-expression as the expression(s).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>EXPRESSION SYNTAX
</span></span><span style="display:flex;"><span>       Expression syntax is ´ModKey=Key[|OtherKey]´.  Multiple expressions  can
</span></span><span style="display:flex;"><span>       be passed, delimited by semi-colons (;).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       A  list  of  keysyms  can  be found in the header file &lt;X11/keysymdef.h&gt;
</span></span><span style="display:flex;"><span>       (without the XK_ prefix).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Note that shifted keys must be specified as a shift key followed by  the
</span></span><span style="display:flex;"><span>       key  to be pressed rather than the actual name of the character. For ex‐
</span></span><span style="display:flex;"><span>       ample to generate &#34;{&#34; the expression ´ModKey=Shift_L|bracketleft´  could
</span></span><span style="display:flex;"><span>       be used (assuming that you have a key with ´{´ above ´[´).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       You  can also specify ModKey in decimal (prefix #), octal (#0), or hexa‐
</span></span><span style="display:flex;"><span>       decimal (#0x). It will be interpreted as a keycode unless no correspond‐
</span></span><span style="display:flex;"><span>       ing key name is found.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>EXAMPLES
</span></span><span style="display:flex;"><span>       Make Left Shift generate Escape when pressed and released on  it&#39;s  own,
</span></span><span style="display:flex;"><span>       and  Left  Control generate Ctrl-O combination when pressed and released
</span></span><span style="display:flex;"><span>       on it&#39;s own:
</span></span><span style="display:flex;"><span>              xcape -e &#39;Shift_L=Escape;Control_L=Control_L|O&#39;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       In conjugation with xmodmap it is possible to make an ordinary  key  act
</span></span><span style="display:flex;"><span>       as an extra modifier. First map the key to the modifier with xmodmap and
</span></span><span style="display:flex;"><span>       then the modifier back to the key with xcape. As an example, we can make
</span></span><span style="display:flex;"><span>       the  space bar work as an additional ctrl key when held with the follow‐
</span></span><span style="display:flex;"><span>       ing sequence of commands:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       First, map an unused modifier&#39;s keysym to  the  spacebar&#39;s  keycode  and
</span></span><span style="display:flex;"><span>       make it a control modifier. It needs to be an existing key so that emacs
</span></span><span style="display:flex;"><span>       won&#39;t spazz out when you press it. Hyper_L is a good candidate.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              spare_modifier=&#34;Hyper_L&#34;
</span></span><span style="display:flex;"><span>              xmodmap -e &#34;keycode 65 = $spare_modifier&#34;
</span></span><span style="display:flex;"><span>              xmodmap -e &#34;remove mod4 = $spare_modifier&#34;
</span></span><span style="display:flex;"><span>              # hyper_l is mod4 by default
</span></span><span style="display:flex;"><span>              xmodmap -e &#34;add Control = $spare_modifier&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Next,  map  space  to  an unused keycode (to keep it around for xcape to
</span></span><span style="display:flex;"><span>       use).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              xmodmap -e &#34;keycode any = space&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>       Finally use xcape to cause the  space  bar  to  generate  a  space  when
</span></span><span style="display:flex;"><span>       tapped.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              xcape -e &#34;$spare_modifier=space&#34;</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>example</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>xcape -e <span style="color:#e6db74">&#39;Alt_L=Escape&#39;</span> <span style="color:#75715e"># Escape when tap, ALt when hold</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h4 id="example">
  <a class="anchor inpage" href="#example">####</a>example</h4>
<p>for example, <kbd>caps</kbd> as <kbd>escape</kbd> and <kbd>ctrl</kbd></p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span><span style="color:#75715e"># I usually use following</span>
</span></span><span style="display:flex;"><span>setxkbmap -option <span style="color:#e6db74">&#39;caps:ctrl_modifier&#39;</span> <span style="color:#75715e"># caps become ctrl</span>
</span></span><span style="display:flex;"><span>xcape -e <span style="color:#e6db74">&#39;Caps_Lock=Escape&#39;</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h3 id="wayland">
  <a class="anchor inpage" href="#wayland">###</a>wayland</h3>
<p>似乎暂时只有KDE Gnome的环境里还有改的方法</p>
<h3 id="console">
  <a class="anchor inpage" href="#console">###</a>console</h3>
<p>
</p>
<h3 id="keyd">
  <a class="anchor inpage" href="#keyd">###</a>keyd</h3>
<p>
， inspired by via</p>
<p>这个厉害，tty, X11, wayland都能用，而且能实现很强的配置效果。</p>
<details open>
    <summary>tldr</summary><pre
        class="codeblock"
      ><code class="language-tldr" data-lang="tldr">
  Remap keys.
  More information: &lt;https://manned.org/keyd&gt;.

  Start and enable the `keyd` service:

      systemctl enable keyd --now

  Display keypress information:

      sudo keyd monitor

  Reset bindings and reload the configuration files in `/etc/keyd`:

      sudo keyd reload

  List all valid key names:

      keyd list-keys

  Create a temporary binding:

      sudo keyd bind &#34;pressed_key = output_key&#34;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>Other software:</p>
<ul>
<li>interception-tools with plugins
<ul>
<li>dual-function-keys (like Mod-Tap feature of zmk and qmk)</li>
<li>caps2esc</li>
<li>space2meta</li>
</ul>
</li>
</ul>
<h2 id="ref">
  <a class="anchor inpage" href="#ref">##</a>ref</h2>
<p>
</p>
]]></content:encoded></item></channel></rss>