Aro*_*olm 10 keyboard keyboard-layout xmodmap xkb setxkbmap
问题:我想修改/重新定义我的键盘布局 (pc105 se),这样当我使用 mod3 (super) 和 mod4 (hyper) 按下某些键时,会返回一个与平常不同的字符。
例如
正常按下时,键码 61 会产生“减号”(-),而当按下 shift 时会产生“下划线”(_)。当按下第一个修饰符组 (AltGr) 'dead_belowdot' 和 'dead_abovedot' 时(无/有移位)。
我想要的是左括号或右括号(不带/带移位),当我按下 Super(赢)键的同时按下键,以及 Hyper 键的斜杠/反斜杠(我已配置为大写锁定)。
我尝试将 a 添加.Xmodmap
到我的主目录并xmodmap ~/.Xmodmap
使用以下语法运行它
keycode 61 = minus underscore a b c d e f g h i j k l m n o p
Run Code Online (Sandbox Code Playgroud)
但是,这将导致 AltGr 导致 c/d,而 win/caps lock 仍然只导致 -/_
我也尝试过直接修改 /usr/share/X11/xkb/symbols/se 并尝试以下更改:
key <BKSL> { [apostrophe, asterisk, acute, multiply], [a,b,c,d], [e,f,g,h], [i,j,k,l]};
Run Code Online (Sandbox Code Playgroud)
但所有发生的都是 ' * ´ × ' * ' * (分别用于普通、altgr、win 和大写锁定)。我也试过
key <BKSL> { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};
Run Code Online (Sandbox Code Playgroud)
但是,只要指定的字段超过四个,它似乎就会完全破坏密钥,并且密钥将恢复为默认的 pc105(我们?)行为。
由于我没有在 stackoverflow、超级用户或谷歌上找到任何关于如何处理我的场景的信息,我在这里问。
这是我的 xmodmap -pm
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3 Hyper_L (0x42), Hyper_L (0xcf)
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Run Code Online (Sandbox Code Playgroud)
Aro*_*olm 12
两年后,我终于可以自豪地回答我自己的问题了。
我发现最简单、最可靠和最可扩展的方法是完全依赖xmodmap
.
运行xev
以确定您希望用作模式切换器的键的键代码。然后按您感兴趣的键并记下keycode
$ xev
KeyRelease event, serial 40, synthetic NO, window 0x2600001,
root 0x2a6, subw 0x0, time 1221887800, (885,743), root:(3447,805),
state 0x2010, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
Run Code Online (Sandbox Code Playgroud)
键码在第三行,键码 66。
对我来说,这些是我特别感兴趣的键,以及它们对应的键码:
Caps Lock
, 键码 66Pause|Break
, 键码 128Left Windows key
, 键码 133Num Lock
, 键码 77这是我选择的设置,但您可以选择自己的设置。我已将其保存到文件中$HOME/.xmodmap
。
~/.xmodmap
keycode 66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...
Run Code Online (Sandbox Code Playgroud)
这样我就绑定Caps Lock
到Mode_switch
, Pause Break
toCompose
和左键Win
到Super_L
. 该Compose
键特别有用,因为它允许将两个键组合为连字。例如,Compose
后跟T
和M
导致商标符号™
。
xmodmap
为了不破坏我的键盘布局,我想让我的按键尽可能接近我的原始布局。为了做到这一点,我打印了当前的键盘映射并查找了我想要更改的键码。
$ xmodmap -pke | ag 'keycode 51'
Run Code Online (Sandbox Code Playgroud)
当然,您也可以轻松使用grep
或ack
,具体取决于您喜欢使用的工具。
$ xmodmap -pke | grep 'keycode 41'
$ xmodmap -pke | ack 'keycode 31'
Run Code Online (Sandbox Code Playgroud)
此输出的格式与您在~/.xmodmap
这样的格式中指定的格式相同:
keycode 31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless
Run Code Online (Sandbox Code Playgroud)
xmodmap
以防万一出现问题,让您的当前xmodmap
可用轻松回退绝不是一个坏主意。
$ xmodmap -pke > ~/.xmodmap.bak
Run Code Online (Sandbox Code Playgroud)
据我了解,.xmodmap
文件的格式是这样的:
keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...
Run Code Online (Sandbox Code Playgroud)
现在,我不了解所有这些级别,但是Mode_Switch
(Caps Lock
在我的情况下)会给你 2 级并Alt Gr
给我 3 级,这几乎是我感兴趣的全部,所以我保留了该行的其余部分,因为它在我的~/.xmodmap.bak
并且只是将第 3、4、5 和 6 列(第 2 和第 3 级,加上移位)更改为有效字符(有关有效字符列表,请参见此处)。
~/.xmodmap
...
keycode 51 = apostrophe asterisk dollar ampersand acute multiply acute multiply apostrophe asterisk acute multiply apostrophe asterisk acute multiply
keycode 59 = comma semicolon parenleft parenright dead_cedilla dead_ogonek dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek
keycode 60 = period colon bracketleft bracketright periodcentered dead_abovedot periodcentered dead_abovedot period colon periodcentered dead_abovedot period colon periodcentered dead_abovedot
keycode 61 = minus underscore braceleft braceright slash backslash braceleft braceright
keycode 65 = space space space space space underscore space space
...
Run Code Online (Sandbox Code Playgroud)
.xmodmap
现在让我们xmodmap
执行.xmodmap
并测试您全新的键盘布局。
$ xmodmap /home/user/.xmodmap
Run Code Online (Sandbox Code Playgroud)
我将此添加到我的$HOME/.xinitrc
:
~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮到你!