我想复制一个键盘布局/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 死键)。
创建新的符号文件:
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
将新的布局声明添加到
/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> ...
删除 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
回复修复 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
。然后指示器将动态生成新的图标,该图标可能不符合当前主题。复制深色/浅色单色主题的任何布局图标:
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
SVG 文件只是 XML。打开后进行编辑并将文本值从 更改
En
为Xy
: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>
更新主题缓存:
sudo update-icon-caches /usr/share/icons/ubuntu-mono-*/
退出/登录
其他有用的参考资料
- 如何在 Linux 中修改键盘布局(感谢@Rmano)
- 构建 XKB 键盘(感谢@Glutanimate)
- 另一篇有据可查的文章添加了更多示例,例如 5 级转变。请参阅在 ubuntu 上创建新的键盘布局需要哪些步骤?
答案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/xkb
sudo
在这些文件中,我们定义了一个自定义选项,并调用了该选项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