AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1537309
Accepted
Tina Russell
Tina Russell
Asked: 2025-01-06 08:13:13 +0800 CST2025-01-06 08:13:13 +0800 CST 2025-01-06 08:13:13 +0800 CST

重启后我的 XKB 自定义键盘布局不再起作用

  • 772

因此,几周前,我让自定义的 XKB 键盘布局可以在 Ubuntu 上使用。我按照这里的说明操作:https: //who-t.blogspot.com/2020/09/user-specific-xkb-configuration-putting.html并下载了它链接到的脚本,这里:https ://gitlab.freedesktop.org/whot/xkblayout运行脚本后(我忘记了我使用的选项的细节以及自动生成的选项有多少,但我稍后会向您展示结果)并编辑生成的~/.config/xkb/symbols/us文件(可能还有生成的~/.config/xkb/rules/evdev.xml文件,我不记得我是否必须手动编辑它,或者这是否都是脚本做的),突然我的自定义键盘布局“英语 - Interna-Tina-l(AltGr 死键)”出现在“设置”应用中(选择新键盘布局时,使用“设置”->“键盘”->“输入源”部分->“添加输入源”按钮;我的新布局列在选择“英语(美国)”时显示的变体中)。我选择了布局,它突然就起作用了,我就可以愉快地用自定义键打字了。(我还在键盘设置中将“备用字符键”选项设置为“左超级键”。我认为这比在布局中硬设置更有意义。)

然后,两天前,我的系统崩溃了。我不知道为什么,也不认为这与此有关(我只能说,我试图在 Emacs 中复制和粘贴某些内容,期望它能正常运作,但我的整个计算机却死机了,而且由于它似乎有点热,我想我唯一的选择是 Alt+PrtSc+REISUO 并关闭它,让它冷却一段时间),但关键是我不得不关闭并稍后重新启动。然后,令我惊恐的是,登录 Ubuntu 后,我发现我的自定义键盘布局不再起作用!突然它使用了“英语(国际,带有 AltGr 死键)”布局,我的布局继承自该布局(但进行了重大更改,足以让尝试在此布局或任何其他非我自己的布局上打字令人抓狂)。

不过,最令人困惑的是,如果我进入键盘设置,它仍然显示我正在使用自定义布局!我尝试明确添加“英语(国际,带有 AltGr 死键)”布局作为第二个输入源,这样我就可以在两种布局之间切换(使用 Super+Space),并希望刷新我的系统对我使用哪种布局打字的认识。但是,如果我切换到该布局然后返回到我自己的布局,我仍然像在使用其他布局一样打字!

可能还相关的是,如果我尝试使用setxkbmap -query来查看我当前正在使用的键盘映射setxkbmap,它会这样说,即使我肯定根据键盘设置和任务栏指示器使用我的自定义布局:

rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl

(正如您可能已经猜到的那样,“altgr-intl”指的是“英语(国际,带有 AltGr 死键)”布局。)

(可能还相关的是,键盘设置中的“备用字符键”选项仍然设置为“左超级键”,但左超级键实际上不再充当“备用字符键”;相反,右 Alt(AltGr)可以起到这个作用,这是“英语(国际,带有 AltGr 死键)”/“altgr-intl”布局的默认设置。)

另外,如果我尝试使用setxkbmap -variant tina,我认为这是我应该直接setxkbmap选择自定义变体的方式,它只会说Error loading new keyboard description然后退出。哼。

无论如何,在这里我将向您展示我的自定义布局文件,以便您可以自行判断它们是否存在问题,但请记住,在我重新启动计算机之前,这一切都运行正常。我真的不知道出了什么问题。

(请记住,中间注释掉的行是我的键盘布局中曾经有的部分,但无论原因如何,现在不再有它们了;我只是为了完整性才将它们包括在内,因为虽然我无法想象为什么注释掉的行会导致任何问题,但我不知道实际上是什么导致了问题。)

~/.config/xkb/symbols/us:

// $XKeyboardConfig$

partial alphanumeric_keys modifier_keys
xkb_symbols "tina" {
    name[Group1]= "English - Interna-Tina-l (AltGr dead keys)";

    include "us(altgr-intl)"
    
//    include "level3(ralt_alt)"
//    include "level3(win_switch)"
//    key <CAPS> {
//      type[Group1]="ONE_LEVEL",
//      symbols[Group1] = [ ISO_Level5_Shift ]
//      };
//    modifier_map Mod3   { ISO_Level5_Shift };
    
//    key.type[Group1]="EIGHT_LEVEL"

    key <TLDE> { [       grave,  asciitilde, dead_abovedot,  dead_tilde ] };
    key <CAPS> { [   parenleft, ISO_Next_Group, Greek_lambda, Greek_phi ] };
    key <BKSL> { [  parenright,         bar,     backslash,   brokenbar ] };
    key  <TAB> { [        Tab, ISO_Left_Tab, XF86BackForward,   notsign ] };

    key <AE01> { [           1,      exclam,   onesuperior,       U203C ] };
    key <AE04> { [           4,      dollar,          cent,    sterling ] };
    key <AE05> { [       5,     percent,      EuroSign,         yen ] };
    key <AE06> { [           6, asciicircum, onequarter,dead_circumflex ] };
    key <AE07> { [       7,   ampersand,       onehalf,   dead_horn ] };
    key <AE08> { [           8,    asterisk, threequarters, dead_ogonek ] };
    key <AE09> { [       9,   parenleft,   bracketleft,   braceleft ] };
    key <AE10> { [       0,  parenright,  bracketright,  braceright ] };
    key <AE11> { [   minus,  underscore,        emdash,      endash ] };

    key <AB03> { [       c,           C,      ccedilla,    Ccedilla ] };
    key <AB04> { [       v,           V,     copyright,  registered ] };
    key <AC04> { [       f,           F,         U017f,       U2122 ] };
    key <AC10> { [ leftsinglequotemark,  leftdoublequotemark, dead_grave, degree ] };
    key <AC11> { [rightsinglequotemark, rightdoublequotemark, dead_acute, dead_diaeresis ] };
    
    key <AB08> { [      comma,     less,        dead_ogonek,     dead_caron ] };
    key <AB09> { [     period,  greater,           ellipsis,  dead_abovedot ] };
    key <AD11> { [  semicolon,    colon, enfilledcircbullet, guillemotright ] };
    key <AD12> { [ apostrophe, quotedbl,   enopencircbullet,  guillemotleft ] };
    
    key <I151> { [ Menu ] };
};

~/.config/rules/evdev:

// generated by xkblayout templates

// Note: no rules file entries are required for for a custom layout

// Include the system 'evdev' file
! include %S/evdev

~/.config/rules/evdev.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
<!-- generated by xkblayout -->
<xkbConfigRegistry version="1.1">

  <layoutList>
    <layout>
      <configItem>
        <name>us</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (US)</description>
        <countryList>
          <iso3166Id>US</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>

      <variantList>
        <variant>
          <configItem>
            <name>tina</name>
            <shortDescription>tina</shortDescription>
            <description>English - Interna-Tina-l (AltGr dead keys)</description>
          </configItem>
        </variant>
      </variantList>

    </layout>
  </layoutList>

</xkbConfigRegistry>

此外,xkblayout 脚本生成了一些空目录:~/.config/xkb/compat、~/.config/xkb/keycodes/和~/.config/xkb/types。

我在 Thinkpad P53 工作站上使用 Ubuntu 24.04。我认为不是任何软件包升级导致了这种情况的发生;事实上,软件更新程序和 Synaptic 软件包管理器(在选择“重新加载”和“标记所有升级”后)几周内都没有显示任何可升级的软件包,这对我来说似乎很奇怪,但这是另一个话题了。(也许 24.04 已经变得足够稳定,不需要不断更新?)

keyboard-layout
  • 1 1 个回答
  • 41 Views

1 个回答

  • Voted
  1. Best Answer
    Tina Russell
    2025-01-07T00:56:25+08:002025-01-07T00:56:25+08:00

    好的,所以我认为我已经找到了解决这个问题的权宜之计。(如果有人比我更了解 XKB,可以给我一个更优雅的解决方案,我将不胜感激,但目前我打算采用这种方法。)

    首先,我将告诉您我是如何找到解决方案的。我查看了https://altgr-weur.eu/上的实施细节(Ubuntu 24.04 中已默认包含此键盘布局,但我想查看有关如何在.config目录中安装它的建议)。我注意到在我的自定义布局中没有另一个文件与之类似:~/.config/xkb/map。因此,我创建了一个与他们类似的文件,并将其保存为~.config/xkb/map我的机器:

    xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"  };
        xkb_compat    { include "complete"  };
        xkb_symbols   { include "pc+us(tina)+inet(evdev)"   };
        xkb_geometry  { include "pc(pc105)" };
    };
    

    (我xkb_symbols include根据的输出重写了该语句setxkbmap -v -variant tina;其余部分与 altgr-weur 相同。)

    然后,我可以运行这个命令,这是 altgr-weur 网站建议您安装其键盘布局的方式:

    xkbcomp -w 0 -I$HOME/.config/xkb $HOME/.config/xkb/map $DISPLAY
    

    结果是:

    Error:            No Symbols named "altgr-intl" in the include file "us"
                      Exiting
                      Abandoning symbols file "tina"
                      Abandoning symbols file "(null)"
    Error:            success in unknown
                      Couldn't write keyboard description to :1
    

    此时,我意识到(如果我错了,请纠正我)问题在于我有一个~/.config/xkb/symbols/us文件实际上覆盖了 处的文件/etc/X11/xkb/symbols/us,因此xkbcomp看不到后一个文件,该文件包含前一个文件中包含的定义。因此,我将后一个文件中的相关定义复制到前一个文件中。现在,我的~/.config/xkb/symbols/us文件如下所示:

    // $XKeyboardConfig$
    
    partial alphanumeric_keys
    xkb_symbols "intl" {
    
        name[Group1]= "English (US, intl., with dead keys)";
    
        key <TLDE> { [dead_grave, dead_tilde,         grave,       asciitilde ] };
        key <AE01> { [     1,     exclam,    exclamdown,      onesuperior ] };
        key <AE02> { [     2,         at,   twosuperior, dead_doubleacute ] };
        key <AE03> { [     3, numbersign, threesuperior,      dead_macron ] };
        key <AE04> { [     4,     dollar,      currency,         sterling ] };
        key <AE05> { [     5,    percent,      EuroSign,     dead_cedilla ] };
        key <AE06> { [    6, dead_circumflex,    onequarter,      asciicircum ] };
        key <AE07> { [     7,  ampersand,       onehalf,    dead_horn ] };
        key <AE08> { [     8,   asterisk, threequarters,      dead_ogonek ] };
        key <AE09> { [     9,  parenleft, leftsinglequotemark, dead_breve ] };
        key <AE10> { [     0, parenright, rightsinglequotemark, dead_abovering ] };
        key <AE11> { [     minus, underscore,           yen,    dead_belowdot ] };
        key <AE12> { [     equal,       plus,      multiply,         division ] };
    
        key <AD01> { [     q,          Q,    adiaeresis,       Adiaeresis ] };
        key <AD02> { [     w,          W,         aring,            Aring ] };
        key <AD03> { [     e,          E,        eacute,           Eacute ] };
        key <AD04> { [     r,          R,    registered,        trademark ] };
        key <AD05> { [     t,          T,         thorn,            THORN ] };
        key <AD06> { [     y,          Y,    udiaeresis,       Udiaeresis ] };
        key <AD07> { [     u,          U,        uacute,           Uacute ] };
        key <AD08> { [     i,          I,        iacute,           Iacute ] };
        key <AD09> { [     o,          O,        oacute,           Oacute ] };
        key <AD10> { [     p,          P,    odiaeresis,       Odiaeresis ] };
        key <AD11> { [ bracketleft,  braceleft,  guillemotleft, leftdoublequotemark ] };
        key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
    
        key <AC01> { [     a,          A,        aacute,           Aacute ] };
        key <AC02> { [     s,          S,        ssharp,          section ] };
        key <AC03> { [     d,          D,           eth,              ETH ] };
        key <AC04> { [     f,          F,    ediaeresis,       Ediaeresis ] };
        key <AC05> { [     g,          G,             g,                G ] };
        key <AC06> { [     h,          H,             h,                H ] };
        key <AC07> { [     j,          J,    idiaeresis,       Idiaeresis ] };
        key <AC08> { [     k,          K,            oe,               OE ] };
        key <AC09> { [     l,          L,        oslash,           Oslash ] };
        key <AC10> { [ semicolon,      colon,     paragraph,           degree ] };
        key <AC11> { [dead_acute, dead_diaeresis, apostrophe,        quotedbl ] };
    
        key <AB01> { [     z,          Z,            ae,               AE ] };
        key <AB02> { [     x,          X, periodcentered,     dead_stroke ] };
        key <AB03> { [     c,          C,     copyright,             cent ] };
        key <AB04> { [     v,          V,             v,                V ] };
        key <AB05> { [     b,          B,             b,                B ] };
        key <AB06> { [     n,          N,        ntilde,           Ntilde ] };
        key <AB07> { [     m,          M,            mu,        plusminus ] };
        key <AB08> { [     comma,       less,      ccedilla,         Ccedilla ] };
        key <AB09> { [    period,    greater, dead_abovedot,       dead_caron ] };
        key <AB10> { [     slash,   question,  questiondown,        dead_hook ] };
        key <BKSL> { [ backslash,        bar,       notsign,        brokenbar ] };
    
        key <LSGT> { [ backslash,   bar,            backslash,      bar ] };
    
        include "level3(ralt_switch)"
    };
    
    partial alphanumeric_keys
    xkb_symbols "altgr-intl" {
    
       include "us(intl)"
       name[Group1]= "English (intl., with AltGr dead keys)";
    
    // five dead keys moved into level3:
    
       key <TLDE> { [    grave, asciitilde,  dead_grave,   dead_tilde      ] };
       key <AC11> { [apostrophe,quotedbl,    dead_acute,   dead_diaeresis  ] };
    
    // diversions from the MS Intl keyboard:
    
       key <AE01> { [        1, exclam,      onesuperior,  exclamdown      ] };
       key <AD04> { [        r, R,           ediaeresis,   Ediaeresis      ] };
       key <AC04> { [        f, F,           f,            F               ] };
       key <AB02> { [        x, X,           oe,           OE              ] };
       key <AB04> { [        v, V,           registered,   trademark       ] };
       key <AB05> { [        b, B,         periodcentered, dead_stroke     ] };
    
    // onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys:
    
       key <AE06> { [        6, asciicircum, dead_circumflex, onequarter    ] };
       key <AE07> { [        7, ampersand,   dead_horn,       onehalf       ] };
       key <AE08> { [        8, asterisk,    dead_ogonek,     threequarters ] };
    
       include "level3(ralt_switch)"
    };
    
    partial alphanumeric_keys modifier_keys
    xkb_symbols "tina" {
        name[Group1]= "English - Interna-Tina-l (AltGr dead keys)";
    
        include "us(altgr-intl)"
        
    //    include "level3(ralt_alt)"
    //    include "level3(win_switch)"
    //    key <CAPS> {
    //      type[Group1]="ONE_LEVEL",
    //      symbols[Group1] = [ ISO_Level5_Shift ]
    //      };
    //    modifier_map Mod3   { ISO_Level5_Shift };
        
    //    key.type[Group1]="EIGHT_LEVEL"
    
        key <TLDE> { [       grave,  asciitilde, dead_abovedot,  dead_tilde ] };
        key <CAPS> { [   parenleft, ISO_Next_Group, Greek_lambda, Greek_phi ] };
        key <BKSL> { [  parenright,         bar,     backslash,   brokenbar ] };
        key  <TAB> { [        Tab, ISO_Left_Tab, XF86BackForward,   notsign ] };
    
        key <AE01> { [           1,      exclam,   onesuperior,       U203C ] };
        key <AE04> { [           4,      dollar,          cent,    sterling ] };
        key <AE05> { [       5,     percent,      EuroSign,         yen ] };
        key <AE06> { [           6, asciicircum, onequarter,dead_circumflex ] };
        key <AE07> { [       7,   ampersand,       onehalf,   dead_horn ] };
        key <AE08> { [           8,    asterisk, threequarters, dead_ogonek ] };
        key <AE09> { [       9,   parenleft,   bracketleft,   braceleft ] };
        key <AE10> { [       0,  parenright,  bracketright,  braceright ] };
        key <AE11> { [   minus,  underscore,        emdash,      endash ] };
    
        key <AB03> { [       c,           C,      ccedilla,    Ccedilla ] };
        key <AB04> { [       v,           V,     copyright,  registered ] };
        key <AC04> { [       f,           F,         U017f,       U2122 ] };
        key <AC10> { [ leftsinglequotemark,  leftdoublequotemark, dead_grave, degree ] };
        key <AC11> { [rightsinglequotemark, rightdoublequotemark, dead_acute, dead_diaeresis ] };
        
        key <AB08> { [      comma,     less,        dead_ogonek,     dead_caron ] };
        key <AB09> { [     period,  greater,           ellipsis,  dead_abovedot ] };
        key <AD11> { [  semicolon,    colon, enfilledcircbullet, guillemotright ] };
        key <AD12> { [ apostrophe, quotedbl,   enopencircbullet,  guillemotleft ] };
        
        key <I151> { [ Menu ] };
    
        include "level3(ralt_alt)"
        include "level3(win_switch)"
    };
    

    然后我再次运行该xkbcomp -w 0 -I$HOME/.config/xkb $HOME/.config/xkb/map $DISPLAY命令,突然我的自定义布局就可以正常工作了!好极了!

    (最后一点说明:在结束分号之前的最后两行,是我添加的,因为在添加它们并重新运行命令之前, “Left Super”作为“Alternate Characters Key”选项仍然xkbcomp不起作用。您会注意到它们与更上面的两行注释掉的行相匹配...很高兴我保留了这两行以供参考。)

    如果重启后它仍然有效,我会将其标记为已解决,但我现在发布此信息,因为我的终端窗口等中仍然有所有相关信息。不过,就像我说的,如果您有更优雅/向前兼容的解决方案,我将不胜感激!

    编辑:好的,所以,重新启动后,它又恢复了原来的行为,任务栏显示我正在使用自定义“tina”布局,但输入清楚地表明我正在使用“altgr-intl”布局。所以,我刚刚xkbcomp -w 0 -I$HOME/.config/xkb $HOME/.config/xkb/map $DISPLAY在末尾添加了~/.profile,重新启动,现在可以确认我的自定义布局有效了。所以,没错,我本来就不优雅的解决方案现在更加不优雅了,但至少它有效。我很想知道做这一切的“正确”方法!

    • 1

相关问题

  • 重新映射键盘键

  • 如何将字符映射到组合键?

  • 如何阻止“gnome-screensaver”将我的键盘重置为默认布局?

  • 如何重置我的键盘布局?

  • 如何键入 ë 之类的重音字符?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve