如何添加新的键盘布局(自定义键盘布局定义)

如何添加新的键盘布局(自定义键盘布局定义)

我想复制一个键盘布局/usr/share/X11/xkb/symbols/并更改它,然后从中生成一个新的布局。

如何添加新的键盘布局(例如名为“mylayout”)?

更新#1:

我更改了以下文件以添加新布局:

  • /usr/share/X11/xkb/symbols/irwinxp(原本与 相同ir):

    // Iranian keyboard layout
    
    ////////////////////////////////////////
    // Persian layout,
    // based on
    // Information Technology – Layout of Persian Letters and Symbols on Computer Keyboards
    // ISIRI 9147 – 1st Edition
    // Institute of Standards and Industrial Research of Iran
    // http://www.isiri.org/UserStd/DownloadStd.aspx?id=9147
    // http://behnam.esfahbod.info/standards/isiri-keyboard-9147.pdf
    //
    // Author: Behnam Esfahbod <[email protected]>
    //
    
    default  partial alphanumeric_keys
    xkb_symbols "pes" {
        name[Group1]= "Persian";
    
        include "ir(pes_part_basic)"
        include "ir(pes_part_ext)"
    
        include "nbsp(zwnj2nb3nnb4)"
        include "level3(ralt_switch)"
    };
    
    
    partial alphanumeric_keys
    xkb_symbols "pes_keypad" {
        name[Group1]= "Persian (with Persian Keypad)";
    
        include "ir(pes_part_basic)"
        include "ir(pes_part_keypad)"
    
        include "nbsp(zwnj2nb3nnb4)"
        include "level3(ralt_switch)"
    };
    
    partial hidden alphanumeric_keys
    xkb_symbols "pes_part_basic" {
    
        // Persian digits
        key <AE01> { [ Farsi_1, exclam,     grave           ] };
        key <AE02> { [ Farsi_2, 0x100066c,  at          ] };
        key <AE03> { [ Farsi_3, 0x100066b,  numbersign      ] };
        key <AE04> { [ Farsi_4, 0x100fdfc,  dollar          ] };
        key <AE05> { [ Farsi_5, 0x100066a,  percent         ] };
        key <AE06> { [ Farsi_6, multiply,   asciicircum     ] };
        key <AE07> { [ Farsi_7, Arabic_comma,   ampersand       ] };
        key <AE08> { [ Farsi_8, asterisk,   enfilledcircbullet  ] };
        key <AE09> { [ Farsi_9, parenright, 0x100200e       ] };
        key <AE10> { [ Farsi_0, parenleft,  0x100200f       ] };
    
        // Persian letters and symbols
        key <AD01> { [ Arabic_dad,      Arabic_fathatan,    degree      ] }; // 2: Arabic_sukun
        key <AD02> { [ Arabic_sad,      Arabic_dammatan,    VoidSymbol  ] }; // 2: Arabic_dammatan
        key <AD03> { [ Arabic_theh,     Arabic_kasratan,    0x13a4      ] }; // 2: Arabic_kasratan
        key <AD04> { [ Arabic_qaf,      Arabic_fathatan,    VoidSymbol  ] };
        key <AD05> { [ Arabic_feh,      Arabic_comma,       VoidSymbol  ] }; // 2: Arabic_damma
        key <AD06> { [ Arabic_ghain,    Arabic_semicolon,   VoidSymbol  ] }; // 2: Arabic_kasra
        key <AD07> { [ Arabic_ain,      Arabic_fatha,       VoidSymbol  ] };
        key <AD08> { [ Arabic_heh,      Arabic_hamza_above, 0x100202d   ] }; // 2: Arabic_shadda
        key <AD09> { [ Arabic_khah,     bracketright,       0x100202e   ] };
        key <AD10> { [ Arabic_hah,      bracketleft,        0x100202c   ] };
        key <AD11> { [ Arabic_jeem,     braceright,     0x100202a   ] };
        key <AD12> { [ Arabic_tcheh,    braceleft,      0x100202b   ] };
    
        key <AC01> { [ Arabic_sheen,    Arabic_fatha,       VoidSymbol  ] }; // 2: Arabic_hamzaonwaw
        key <AC02> { [ Arabic_seen,     Arabic_damma,       VoidSymbol  ] }; // 2: Arabic_hamzaonyeh
        key <AC03> { [ Farsi_yeh,       Arabic_kasra,       Arabic_alefmaksura ] }; // 2: Arabic_yeh
        key <AC04> { [ Arabic_beh,      Arabic_shadda,  VoidSymbol  ] }; // 1: Arabic_hamzaunderalef
        key <AC05> { [ Arabic_lam,      0x10006c0,  VoidSymbol  ] };// 2: Arabic_hamzaonalef
        key <AC06> { [ Arabic_alef,     Arabic_maddaonalef, 0x1000671   ] };
        key <AC07> { [ Arabic_teh,      Arabic_tehmarbuta,  VoidSymbol  ] };
        key <AC08> { [ Arabic_noon,     guillemotright,     0x100fd3e   ] };
        key <AC09> { [ Arabic_meem,     guillemotleft,      0x100fd3f   ] };
        key <AC10> { [ Arabic_keheh,    colon,          semicolon   ] };
        key <AC11> { [ Arabic_gaf,      quotedbl,       quotedbl    ] }; // 2: Arabic_semicolon
    
        key <AB01> { [ Arabic_zah,      Arabic_kaf,     VoidSymbol  ] };
        key <AB02> { [ Arabic_tah,      0x1000653,      VoidSymbol  ] };
        key <AB03> { [ Arabic_zain,     Arabic_jeh,     VoidSymbol  ] };
        key <AB04> { [ Arabic_ra,       Arabic_hamzaonwaw   ,0x1000656  ] }; // 2: Arabic_superscript_alef ٰ
        key <AB05> { [ Arabic_thal,     0x100200c,      0x100200d   ] };
        key <AB06> { [ Arabic_dal,      Arabic_hamza_above, Arabic_hamza_below  ] };
        key <AB07> { [ Arabic_hamzaonyeh,   Arabic_hamza,       ellipsis    ] }; // 1: Arabic_peh
        key <AB08> { [ Arabic_waw,      greater,        comma       ] };
        key <AB09> { [ period,      less,           apostrophe  ] };
        key <AB10> { [ slash,       Arabic_question_mark,   question    ] };
    
        key <TLDE> { [ 0x100200d,       division,       asciitilde  ] };
        key <AE11> { [ minus,       Arabic_tatweel,     underscore  ] };
        key <AE12> { [ equal,       plus,           0x1002212   ] };
        key <BKSL> { [ Arabic_peh,      bar,            0x1002010   ] }; // 1: backslash
    };
    
    partial hidden alphanumeric_keys
    xkb_symbols "pes_part_ext" {
    
        // Persian and ASCII digits
        key <AE01> { [ 0x10006f1,   exclam,     grave,          1   ] };
        key <AE02> { [ 0x10006f2,   0x100066c,  at,         2   ] };
        key <AE03> { [ 0x10006f3,   0x100066b,  numbersign,     3   ] };
        key <AE04> { [ 0x10006f4,   0x100fdfc,  dollar,         4   ] };
        key <AE05> { [ 0x10006f5,   0x100066a,  percent,        5   ] };
        key <AE06> { [ 0x10006f6,   multiply,   asciicircum,        6   ] };
        key <AE07> { [ 0x10006f7,   Arabic_comma,   ampersand,      7   ] };
        key <AE08> { [ 0x10006f8,   asterisk,   enfilledcircbullet, 8   ] };
        key <AE09> { [ 0x10006f9,   parenright, 0x100200e,      9   ] };
        key <AE10> { [ 0x10006f0,   parenleft,  0x100200f,      0   ] };
    };
    
    partial hidden alphanumeric_keys
    xkb_symbols "pes_part_keypad" {
    
        // Persian digits and Mathematical operators
        key <KPDV> { [ division,    XF86_Ungrab ] };
        key <KPMU> { [ multiply,    XF86_ClearGrab  ] };
        key <KPSU> { [ 0x1002212,   XF86_Prev_VMode ] };
        key <KPAD> { [ plus,    XF86_Next_VMode ] };
    
        key <KPEN> { [ KP_Enter ] };
        key <KPEQ> { [ equal    ] };
    
        key <KP7>  { [ KP_Home, 0x10006f7   ] };
        key <KP8>  { [ KP_Up,   0x10006f8   ] };
        key <KP9>  { [ KP_Prior,    0x10006f9   ] };
    
        key <KP4>  { [ KP_Left, 0x10006f4   ] };
        key <KP5>  { [ KP_Begin,    0x10006f5   ] };
        key <KP6>  { [ KP_Right,    0x10006f6   ] };
    
        key <KP1>  { [ KP_End,  0x10006f1   ] };
        key <KP2>  { [ KP_Down, 0x10006f2   ] };
        key <KP3>  { [ KP_Next, 0x10006f3   ] };
    
        key <KP0>  { [ KP_Insert,   0x10006f0   ] };
        key <KPDL> { [ KP_Delete,   0x100066b   ] };
    };
    
    
    ////////////////////////////////////////
    // Kurdish Layout
    
    partial alphanumeric_keys
    xkb_symbols "ku" {
        include "tr(ku)"
        name[Group1]= "Kurdish (Iran, Latin Q)";
    };
    
    partial alphanumeric_keys
    xkb_symbols "ku_f" {
        include "tr(ku_f)"
        name[Group1]= "Kurdish (Iran, F)";
    };
    
    partial alphanumeric_keys
    xkb_symbols "ku_alt" {
        include "tr(ku_alt)"
        name[Group1]= "Kurdish (Iran, Latin Alt-Q)";
    };
    
    ////////////////////////////////////////
    // Kurdish Soranî Bahdînî (Arabic) keyboard layout,
    // based on the Kurdî Soranî Bahdînî keyboard from KurdITGroup
    // which is based on National Iranian Keyboard Standard (ISIRI 2901:1994),
    // with additions.
    //
    // Copyright (C) 2006 Erdal Ronahî, published under the GPL v2
    //
    // Special copyright note: author explicitly permitted to license this 
    // layout under MIT/X11 license, for details see
    // https://bugs.freedesktop.org/show_bug.cgi?id=9541
    //
    // Author: Erdal Ronahî  <[email protected]>
    //
    // Kurdish Arabic-Latin Layout for Soranî
    
    partial alphanumeric_keys
    xkb_symbols "ku_ara" {
        name[Group1]= "Kurdish (Iran, Arabic-Latin)";
    
        // Other 3-Level symbols
        key <TLDE> { [ 0x100200d,       division,       asciitilde  ] };
        key <BKSL> { [ backslash,       bar,            ccedilla, Ccedilla  ] };
    
        // Digits
        key <AE01> { [ 1,   exclam,     0x10006f1,  grave       ] };
        key <AE02> { [ 2,   at,         0x10006f2,  at      ] };
        key <AE03> { [ 3,   numbersign, 0x10006f3,  0x100066b   ] };
        key <AE04> { [ 4,   dollar,     0x10006f4,  0x100fdfc   ] };
        key <AE05> { [ 5,   percent,    0x10006f5,  0x100066a   ] };
        key <AE06> { [ 6,   asciicircum,    0x10006f6,  multiply    ] };
        key <AE07> { [ 7,   ampersand,  0x10006f7,  Arabic_comma    ] };
        key <AE08> { [ 8,   asterisk,   0x10006f8,  enfilledcircbullet  ] };
        key <AE09> { [ 9,   parenright, 0x10006f9,  0x100200e   ] };
        key <AE10> { [ 0,   parenleft,  0x10006f0,  0x100200f   ] };
        key <AE11> { [ minus,       Arabic_tatweel,     underscore  ] };
        key <AE12> { [ equal,       plus,           0x1002212   ] };
    
        key <AD01> { [         Arabic_qaf,            X,  q,  Q ] };
        key <AD02> { [         Arabic_waw,            X,  w,  W ] };
        key <AD03> { [          0x10006d5,   Arabic_heh,  e,  E ] };
        key <AD04> { [         Arabic_ra ,    0x1000695,  r,  R ] };
        key <AD05> { [         Arabic_teh,   Arabic_tah,  t,  T ] };
        key <AD06> { [          0x10006cc,    0x10006ce,  y,  Y ] };
        key <AD07> { [  Arabic_hamzaonyeh, Arabic_hamza,  u,  U ] };
        key <AD08> { [         Arabic_hah,   Arabic_ain,  i,  I ] };
        key <AD09> { [          0x10006c6, Arabic_hamzaonwaw,  o,  O ] };
        key <AD10> { [          0x100067e,  Arabic_theh,  p,  P ] };
        key <AD11> { [ bracketright,    braceright, ucircumflex, Ucircumflex    ] };
        key <AD12> { [ bracketleft,     braceleft,  scedilla, Scedilla  ] };
    
        key <AC01> { [ Arabic_alef, Arabic_maddaonalef, a, A    ] };
        key <AC02> { [ Arabic_seen,     Arabic_sheen,   s, S    ] };
        key <AC03> { [  Arabic_dal,     Arabic_thal,    d, D    ] };
        key <AC04> { [  Arabic_feh, Arabic_hamzaunderalef,  f, F    ] };
        key <AC05> { [   0x10006af,     Arabic_ghain,   g, G    ] };
        key <AC06> { [  Arabic_heh,     0x100200c,  h, H    ] };
        key <AC07> { [   0x1000698, Arabic_hamzaonalef, j, J    ] };
        key <AC08> { [   0x10006a9,     Arabic_kaf, k, K    ] };
        key <AC09> { [  Arabic_lam,     0x10006b5,  l, L    ] };
        key <AC10> { [  Arabic_semicolon,   colon,      ecircumflex, Ecircumflex    ] };
        key <AC11> { [  apostrophe,     quotedbl,   icircumflex, Icircumflex    ] };
    
        key <AB01> { [ Arabic_zain,     Arabic_dad, z, Z    ] };
        key <AB02> { [ Arabic_khah,     Arabic_sad, x, X    ] };
        key <AB03> { [ Arabic_jeem,     0x1000686,  c, C    ] };
        key <AB04> { [   0x10006a4,     Arabic_zah, v, V    ] };
        key <AB05> { [ Arabic_beh,      0x1000649,  b, B    ] };
        key <AB06> { [ Arabic_noon, Arabic_tehmarbuta,  n, N    ] };
        key <AB07> { [ Arabic_meem, Arabic_tatweel,     m, M    ] };
        key <AB08> { [ Arabic_comma,    greater,    comma       ] };
        key <AB09> { [ period,      less,       apostrophe  ] };
        key <AB10> { [ slash,       Arabic_question_mark,   question    ] };
    
        include "nbsp(zwnj2nb3)"
        include "level3(ralt_switch)"
    };
    
    // EXTRAS:
    
    /////////////////////////////////////////////////////////////////////////////////
    //
    // Generated keyboard layout file with the Keyboard Layout Editor.
    // For more about the software, see http://code.google.com/p/keyboardlayouteditor
    //
    // Version 0.2, fixed AD09.
    //
    // Layout by Ernst Tremel, http://ubuntuforums.org/showpost.php?p=9365469&postcount=32
    // Creation of this file by Simos Xenitellis.
    
    partial alphanumeric_keys
    xkb_symbols "ave"
    {
        name[Group1] = "Avestan";
    
        key <AB01> { [ U10B30,         U10B32 ] }; // 

答案1

创建自定义键盘布局

例如,我想添加一个新的修改英语(国际 AltGr 死键)r美国布局,将, R& t,互换T。我将它命名为XY 交换:RT 英语(国际 AltGr 死键)

  1. 创建新的符号文件:

    sudo nano /usr/share/X11/xkb/symbols/xy

     default  partial alphanumeric_keys
     xkb_symbols "basic" {
    
        name[Group1]= "XY swapped:RT English (international AltGr dead keys)";
    
        include "us(altgr-intl)"
    
     // my custom changes:
    
        key <AD04> { [        t, T,           ediaeresis,   Ediaeresis      ] };
        key <AD05> { [        r, R,           thorn,        THORN           ] };
    
    
        include "level3(ralt_switch)"
     };
    

    include "us(altgr-intl)"意味着它从该布局中继承了所有键,只有这里的键被覆盖。

    您可以使用键盘布局编辑器这是一个帮助创建或编辑 XKB 键盘布局的 GUI 程序。感谢@Glutanimate

  2. 将新的布局声明添加到/usr/share/X11/xkb/rules/evdev.xml(复制并修改us布局部分)

    参考:在“设置”中提供新的键盘布局变体吗?

    sudo gedit /usr/share/X11/xkb/rules/evdev.xml

     ...
     <layout>
       <configItem>
         <name>xy</name>
    
         <shortDescription>en</shortDescription>
         <description>XY swapped:RT English (international AltGr dead keys)</description>
         <languageList>
                  <iso639Id>eng</iso639Id>
                  <iso639Id>fra</iso639Id>
                  <iso639Id>ger</iso639Id>
         </languageList>
       </configItem>
       <variantList>
       </variantList>
     </layout>
     ...
    
  3. 删除 xkb 缓存。

     sudo rm /var/lib/xkb/*.xkm
    

    笔记:

    要加载布局菜单的更改,只需重新启动 gnome-keyboard-preferences;无需重新启动窗口管理器。

    Ubuntu 13.10 版中有一个变化,导致在修改“/usr/share/X11/xkb/symbols”中的文件后键盘设置缓存不会刷新。看起来更改没有应用。要强制刷新缓存,应该从“/var/lib/xkb”中删除 *.xkm 文件。

    参考: 如何:自定义键盘布局定义

    或者

     sudo dpkg-reconfigure xkb-data
    

    参考: 为什么 13.10 破坏了我的自定义键盘布局?

    自定义键盘布局

回复修复 OP 修改

  • 更新 #1 错误的父级布局)您已经修改了文件xkb_symbols "pes_part_basic"中的内容irwinxp:没关系。

    但文件xkb_symbols "pes"irwinxp仍然存在:

      include "ir(pes_part_basic)"
    

    应该是:

      include "irwinxp(pes_part_basic)"
    
  • 更新#2 自定义图标) 如果<shortDescription>en</shortDescription>更改为<shortDescription>xy</shortDescription>。那么新的布局将不同于En,它将显示为Xy

    很可能在 中没有它的图标ubuntu-mono。然后指示器将动态生成新的图标,该图标可能不符合当前主题。

    1. 复制深色/浅色单色主题的任何布局图标:

       sudo cp /usr/share/icons/ubuntu-mono-dark/status/22/indicator-keyboard-En.svg /usr/share/icons/ubuntu-mono-dark/status/22/indicator-keyboard-Xy.svg
       sudo cp /usr/share/icons/ubuntu-mono-light/status/22/indicator-keyboard-En.svg /usr/share/icons/ubuntu-mono-light/status/22/indicator-keyboard-Xy.svg
      
    2. SVG 文件只是 XML。打开后进行编辑并将文本值从 更改EnXy

       sudo nano /usr/share/icons/ubuntu-mono-dark/status/22/indicator-keyboard-Xy.svg
       sudo nano /usr/share/icons/ubuntu-mono-light/status/22/indicator-keyboard-Xy.svg
      

      例子:

       <?xml version="1.0" encoding="UTF-8" standalone="no"?>
       <svg width="22" xmlns="http://www.w3.org/2000/svg" version="1.1" height="22">
        <defs>
         <mask id="m">
          <rect y="0" x="0" style="fill:#fff" height="22" width="22"/>
          <text y="15.5" x="5" style="font-size:12;font-family:Ubuntu;font-weight:500;fill:black">Xy</text>
         </mask>
        </defs>
        <rect style="fill:#dfdbd2" mask="url(#m)" rx="2" height="20" width="20" y="1" x="1"/>
       </svg>
      
    3. 更新主题缓存:

       sudo update-icon-caches /usr/share/icons/ubuntu-mono-*/            
      
    4. 退出/登录

      带有自定义图标的新布局

其他有用的参考资料

答案2

多年来,我一直在使用上述答案的变体,但随着 Ubuntu 的新版本出现问题,并且可能是由于切换到 Wayland,所以我寻找另一种方法。

似乎已经引入了一种更方便、更简洁(因为一切都在用户空间中)的指定键盘布局自定义的方法。这已在 GNOME/Wayland 下的 22.04 LTS 和 21.10 上进行了测试;它在 X.org 下不起作用。

下面是一个将 PrtSc(“打印屏幕”)键重新映射为“菜单”键的示例。我发现这在我的 ThinkPad 键盘上很有用,因为它用这个不太有用的(在我看来)前一个键代替了后者。

mkdir -p ~/.config/xkb/{symbols,rules}
cd ~/.config/xkb
cat > rules/evdev << EOF
! option = symbols
  custom:prtscmenu = +custom(prtscmenu)

! include %S/evdev
EOF
cat > symbols/custom << EOF
partial modifier_keys
xkb_symbols "prtscmenu" {
  key <PRSC> { [ Menu ] };
};
EOF

在上面,我们在主目录的目录中创建了几个名为rules/evdev和的文件。注意:不需要或修改任何系统文件。symbols/custom.config/xkbsudo

在这些文件中,我们定义了一个自定义选项,并调用了该选项prtscmenu(您可以使用任何您喜欢的选项,只需替换所有出现的字符串),最后我们使用“熟悉的”XKB 语法根据<PRSC>需要覆盖(“print screen”)键。语法与接受的答案中使用的语法相同。

最后,为了应用此选项(或禁用它),无论加载哪个键盘,只需运行:

# apply custom layout:
gsettings set org.gnome.desktop.input-sources xkb-options "['custom:prtscmenu']"
# disable custom layout:
gsettings set org.gnome.desktop.input-sources xkb-options "[]"

可以轻松将它们设置为别名,以使事情变得更容易。

另外几点:

  • 您可以定义多个这样的自定义并分别应用它们(xkb-option上面的 GSettings 接受一个数组)
  • 与接受的答案不同,这不会生成完全独立的布局。因此,假设您在工作流程中切换不同的布局(例如美国和您自己的语言环境),您可以prtscmenu在每个布局上应用相同的自定义。

资料来源:https://who-t.blogspot.com/2020/02/user-specific-xkb-configuration-part-1.html

相关内容