有一个选项可以指定用于访问键盘第 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
那么第五级修改器起什么作用呢?
我该如何设置才能从一个键中获得 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 显然将 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 布局的前四个键作为示例。这些键是Q
到R
,对应于<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 名称,例如U2192
U+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。