gnome-keyboard-properties 中的“选择第 5 级的键”有什么作用?

sup*_*sup 25 gnome keyboard xmodmap

有一个选项可以指定用于访问键盘上第 5 级的键gnome-keyboard-properties(系统设置中硬件下的“键盘”):

所述对话框的屏幕截图

但是,如果我将第 5 个级别设置为第AltGr3 个级别Right Ctrl,如果我将键 54 设置为如下:

xmodmap -e "keycode 54 = 1 2 3 4 5 6 7 8"
Run Code Online (Sandbox Code Playgroud)

我通过按不同的变化得到以下结果:

keycode 54 = 1
keycode 54 + right ctrl = 5
keycode 54 + right ctrl + shift = 6
keycode 54 + shift = 2
keycode 54 + AltGr = 1
keycode 54 + AltGr + shift = 2
Run Code Online (Sandbox Code Playgroud)
  1. 那么5级修改器有什么作用呢?

  2. 我该如何设定,让我可以得到5个或六个不同的角色了一个键(通过修改的ShiftAlt GrRight Ctrl举例)?

Gui*_*ern 25

“1。那么五级修饰符有什么作用呢?”

它选择第五级。2级修改器(只是普通班次)选择第二级,第三级选择第三级。

5级修改器选择第五级而不是第四级(紧接在第三级修改器之后)的原因是这三个修改器可以通过不同的方式组合选择八个不同的级别(这包括不使用任何修改器,这只是按下一个没有任何此类修饰符的键)。因为 2?3 = 8,所以有八种组合。对于前两个修饰符,有四种组合:

  • 无修饰符(级别 1)
  • 2 级修饰符,又名转变(2 级)
  • 3级修改器(3级)
  • 2nd + 3rd 修饰符(4 级)

添加第三个修饰符(第 5 级)会增加四个级别。

“2。我该如何设定,让我可以得到5个或六个不同的角色了单个键(按住Shift键修改,Alt GrRight Ctrl举例)?”

首先,您需要一个每个键使用五个或更多字符的布局。您可以选择现有布局,但如果您只是想为当前使用的布局添加更多级别,这可能不是最佳选择。例如,有Neo键盘布局 (†1),但它“针对德语进行了优化”,因此对于大多数说英语的人来说并不是那么好。

不过,看看 Neo 为 5 级修饰符选择了哪些键可能会有所启发。

Neo布局

Neo 显然将 5 级修饰符称为“Mod4”。如您所见,它使用左侧 shift 键 ( LSGT) 右侧的键和右侧 alt 键/AltGr键。这是在欧式键盘(105 键)上,与美式键盘(104 键)相比,左移较窄,返回键又高又细。对于基于美式键盘的键盘布局,人们可能不得不——或者更喜欢——选择其他键。

选择 5 级修饰键

在 sup 的回答中,他选择使用 Xmodmap。现在推荐使用 Setxkbmap 之类的工具而不是 Xmodmap。Xkb 带有许多预定义选项,例如选择 5 级修饰符。如果您咨询 man xkeyboard-config并搜索,lv5您会发现以下选项:

????????????????????????????????????????????????????????????????????????????
? Option               ? Description                                       ?
????????????????????????????????????????????????????????????????????????????
? lv5:lsgt_switch_lock ? <Less/Greater> chooses 5th level; acts as onetime ?
?                      ? lock when pressed together with another 5th level ?
?                      ? chooser                                           ?
????????????????????????????????????????????????????????????????????????????
? lv5:ralt_switch_lock ? Right Alt chooses 5th level; acts as onetime lock ?
?                      ? when pressed together with another 5th level      ?
?                      ? chooser                                           ?
????????????????????????????????????????????????????????????????????????????
? lv5:lwin_switch_lock ? Left Win chooses 5th level; acts as onetime lock  ?
?                      ? when pressed together with another 5th level      ?
?                      ? chooser                                           ?
????????????????????????????????????????????????????????????????????????????
? lv5:rwin_switch_lock ? Right Win chooses 5th level; acts as onetime lock ?
?                      ? when pressed together with another 5th level      ?
?                      ? chooser                                           ?
????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

因此,记录的选项是LSGT键、右 alt 键、右 Windows 键和左 Windows 键。正如我们所见,Neo 使用前两个选项。

假设您想使用lv5:ralt_switch_lock具有某种布局的选项。此命令us使用此级别 5 修饰键设置布局:

setxkbmap -option "lv5:ralt_switch_lock" us
Run Code Online (Sandbox Code Playgroud)

因此,对于 中记录的任何选项,请在使用 Setxkbmap 时将man xkeyboard-config其用作参数-option

如果这些选项还不够,并且您想定义另一个键作为 5 级修饰符,那么查看这些选项的声明是有益的。他们似乎在 /usr/share/X11/xkb/symbols/level5. 的声明 lv5:ralt_switch_lock如下所示:

partial modifier_keys
xkb_symbols "ralt_switch_lock" {
  include "level5(lock)"
  key <RALT> {
    type[Group1] = "EIGHT_LEVEL",
    symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
                        ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
  };
};
Run Code Online (Sandbox Code Playgroud)

的右侧symbols[Group1]声明了每个级别的键应该产生什么键或字符。这使用了所有八个可能的级别,因为当与另一个 5 级 shift 键一起按下时,它应该锁定5 级修饰符。因此级别 5-8 发出, ISO_Level5_Lock因为所有这些级别都可以通过按住级别 5 的 shift 和其他 shift 键的某些组合(全部都没有)来访问。如果你只想要 shift 行为而不是 lock-if-two-pressed 行为,你可以做一个更简单的声明(来自同一个文件):

// The right Alt key (while pressed) chooses the fifth shift level.
partial modifier_keys
xkb_symbols "ralt_switch" {
  key <RALT> {
    type[Group1]="ONE_LEVEL",
    symbols[Group1] = [ ISO_Level5_Shift ]
  };
  include "level5(modifier_mapping)"
};
Run Code Online (Sandbox Code Playgroud)

向布局添加额外的级别

Xkb 布局非常模块化。您可以包含现有布局并更改它们。所以我们可以选择一个少于 5 个级别的现有布局,并为其添加一些级别。

您可以通过将带有布局的文件复制到/usr/share/X11/xkb/symbols/或 Xkb 工具查找布局的任何位置来制作新 布局。但这需要 sudo 权限,因此它不是最佳解决方案。或者,您可以复制 的目录结构xkb/ 并将您的布局放在 下的相应目录中xkb/,即 symbols/. 所以说你已经制作了一个文件xkb-tree/symbols/my-layouts。为了使用此文件中定义的布局,您可以使用-print 选项,setxkbmap然后将输出通过管道传输到xkbcomp. 这个包装脚本将布局作为输入:

#!/bin/sh

# `-option ""` resets all options.
setxkbmap -option "" -layout "$1" \
    -print |
    xkbcomp -I"<path-to-project>/xkb-tree" - "$DISPLAY"
Run Code Online (Sandbox Code Playgroud)

就布局文件而言,假设我们要扩展“美国国际”布局,它使用四个级别。首先,我们以与 Neo 相同的方式设置 3 级和 5 级 shift 键:

partial alphanumeric_keys
xkb_symbols "mine" {
    // US international
    include "us(intl)"
    // Set up level 3 modifiers.
    include "level3(modifier_mapping)"
    include "level3(bksl_switch)"
    include "level3(caps_switch)"
    // Set up level 5 modifiers.
    include "level5(modifier_mapping)"
    include "level5(lsgt_switch)"
    include "level5(ralt_switch)"
};
Run Code Online (Sandbox Code Playgroud)

现在我们要添加一些额外的字符。我们仅以 Qwerty 布局的前四个键为例。这些键是Qto R,对应<AD01><AD04>。首先,我们需要使密钥能够使用多达八个级别:

key.type[Group1] = "EIGHT_LEVEL";
Run Code Online (Sandbox Code Playgroud)

对于前四个级别,为了不重新定义它们,我们将它们映射到NoSymbol. 然后我们添加两个级别。在第 5 级,我们添加了箭头????(†2)。在第 6 级,我们添加了方向键。我们的布局最终看起来像这样:

partial alphanumeric_keys
xkb_symbols "mine" {
    // US international
    include "us(intl)"
    // Set up level 3 modifiers.
    include "level3(modifier_mapping)"
    include "level3(bksl_switch)"
    include "level3(caps_switch)"
    // Set up level 5 modifiers.
    include "level5(modifier_mapping)"
    include "level5(lsgt_switch)"
    include "level5(ralt_switch)"

    // Make the following keys capable of using eight levels.
    key.type[Group1] = "EIGHT_LEVEL";

    key <AD01> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        leftarrow, Left
    ] };
    key <AD02> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        downarrow, Down
    ] };
    key <AD03> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        uparrow, Up
    ] };
    key <AD04> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        rightarrow, Right
    ] };

};
Run Code Online (Sandbox Code Playgroud)

为了使用它,我们可以使用我们制作的包装脚本:

./setxkbmap-wrapper "my-layouts(mine)"
Run Code Online (Sandbox Code Playgroud)

†1:Neode(neo)在 Xkb 中;setxkbmap "de(neo)".

†2:为了找到 Xkb 使用的符号名称,搜索名为keysymdef.h. 它应该在名为X11/. 您还可以使用 Unicode 名称,例如U2192U+2192。

  • 四年后,我终于实现了这个,再次感谢您!现在,我在某些键上有多达八个级别(1 和分数的上下索引)。 (2认同)

sup*_*sup 8

好吧,经过一番挖掘:

(1) Key to choose 5th level 做了一些奇怪的事情(关于一些法式布局),与我想做的事情无关。基本上它设置哪个键将用作 ISO_Level5_Shift。ISO_Level5_Shift 用于一些晦涩的布局。这个答案是基于谷歌在搜索“ISO_Level5_Shift”和这些 链接时给出的结果数量。

(2) 不能从一个物理键中取出6个符号。实现此目的的一种方法是使用放置在 $HOME 目录中的文件 .xmodmap。

一、命令

xmodmap -pm
Run Code Online (Sandbox Code Playgroud)

给出了哪些键符号充当各种修饰符。在我的系统上是这样的:

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x9)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c)
Run Code Online (Sandbox Code Playgroud)

mod3需要设置为一键使用6个符号。这需要放入 .xmodmap 文件中:

clear mod3
clear mod5
keycode 94 = Mode_switch
add mod3 = Mode_switch
add mod5 = ISO_Level3_Shift
Run Code Online (Sandbox Code Playgroud)

然后 xmodmap -pm 给了我:

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x9)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Mode_switch (0x5e),  Mode_switch (0xcb)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  ISO_Level3_Shift (0x6c)
Run Code Online (Sandbox Code Playgroud)

其中键码 94 是我选择充当 mod3 的键。各种物理键的键码可以通过命令行工具xev找到(运行它并按下各种键,键码就会出现)。

然后,如果我放入 .xmodmap 文件

keycode 54 = 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)

或运行

xmodmap -e "keycode 54 = 1 2 3 4 5 6"
Run Code Online (Sandbox Code Playgroud)

我使用 altgr、shift 和键码 94 从一个键中得到六个不同的符号(它是我物理布局上左移旁边的一个无用键)。

更新:如果你只需要五个符号,像这样设置它很方便:

keycode 54 = 1 2 3 3 5 6
Run Code Online (Sandbox Code Playgroud)

我偶尔会得到 4 而不是 3。