选择 5 级修饰键

选择 5 级修饰键

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

该对话框的屏幕截图

但是,如果我将第 5 级设置为,AltGr将第三级设置为,Right Ctrl并且如果我将键 54 设置为如下:

xmodmap -e "keycode 54 = 1 2 3 4 5 6 7 8"

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

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
  1. 那么第五级修改器起什么作用呢?

  2. 我该如何设置才能从一个键中获得 5 个或 6 个不同的字符(例如Shift,由Alt Gr和修改)?Right Ctrl

答案1

“1.那么第五级修改器起什么作用呢?”

它选择第五级。第二级修饰符(只是常规移位)选择第二级,第三级修饰符选择第三级。

第 5 级修饰键之所以选择第 5 级而不是第 4 级(紧接着第 3 级修饰键),是因为这三个修饰键可以以不同的方式组合以选择八个不同的级别(这包括不使用任何修饰键,即只按下一个键而不使用任何修饰键)。因为 2↑3 = 8,所以共有 8 种组合。对于前两个修饰键,共有 4 种组合:

  • 无修饰符(级别 1)
  • 2 级修饰符,又称 shift(2 级)
  • 第 3 级修饰符(3 级)
  • 第二 + 第三个修饰符(4 级)

添加第三个修饰符(第五级)将再添加四个级别。

“2. 我该如何设置才能用一个键(例如通过 ShiftAlt Gr和修改)获得 5 个或 6 个不同的字符?”Right Ctrl

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

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

Neo 布局

Neo 显然将 5 级修饰符称为“Mod4”。因此,如您所见,它使用左移键 ( LSGT) 和右 alt 键/AltGr键右侧的键。这是在欧洲键盘(105 个键)上,与美国键盘(104 个键)相比,欧洲键盘的左移键较窄,回车键又高又细。对于基于美国键盘的键盘布局,人们可能必须(或更愿意)选择其他键。

选择 5 级修饰键

在 sup 的回答中,他选择使用 Xmodmap。如今,建议使用 Setxkbmap 等工具,而不是 Xmodmap。Xkb 附带许多预定义选项,例如选择级别 5 修饰符。如果您咨询 人xkeyboard配置并搜索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                                           │
└──────────────────────┴───────────────────────────────────────────────────┘

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

假设您想将该选项与某些布局一起使用。此命令使用此 5 级修饰键lv5:ralt_switch_lock设置布局:us

setxkbmap -option "lv5:ralt_switch_lock" us

因此,对于 中记录的任何选项,在使用 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 ]
  };
};

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

// 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)"
};

向布局添加额外级别

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"

就布局文件而言,假设我们要扩展“美国国际”布局,该布局使用四个级别。首先,我们以与 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)"
};

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

key.type[Group1] = "EIGHT_LEVEL";

对于前四个级别,为了不重新定义它们,我们将它们映射到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
    ] };

};

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

./setxkbmap-wrapper "my-layouts(mine)"

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

†2:为了找到 Xkb 使用的符号名称,请搜索名为 的文件keysymdef.h。它应该位于名为 的目录下X11/。您也可以使用 Unicode 名称,例如U2192U+2192。

答案2

好吧,经过一番挖掘:

(1) 选择第 5 级的键会做一些奇怪的事情(关于一些法语布局),这与我想要做的无关。基本上,它设置哪个键将充当 ISO_Level5_Shift。ISO_Level5_Shift 用于一些晦涩难懂的布局。这个答案基于谷歌搜索“ISO_Level5_Shift”时给出的结果数量,这些 链接

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

首先,命令

xmodmap -pm

给出哪些键符号充当各种修饰符。在我的系统上,它如下所示:

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)

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

clear mod3
clear mod5
keycode 94 = Mode_switch
add mod3 = Mode_switch
add mod5 = ISO_Level3_Shift

然后 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)

其中键码 94 是我选择用作 mod3 的键。可以使用命令行工具 xev 找到各种物理键的键码(只需运行它并按下各种键,键码就会显示出来)。

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

keycode 54 = 1 2 3 4 5 6

或者运行

xmodmap -e "keycode 54 = 1 2 3 4 5 6"

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

更新:如果您只需要 5 个符号,那么像这样设置会很方便:

keycode 54 = 1 2 3 3 5 6

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

相关内容