问题:我想修改/重新定义我的键盘布局(pc105 se),以便当我按下带有 mod3(super)和 mod4(hyper)的某些键时,返回与平常不同的字符。
例如
键码 61 在正常按下时产生“减号”(-),在按住 Shift 键时产生“下划线”(_)。在按住第一个修饰键组 (AltGr) 时产生“dead_belowdot”和“dead_abovedot”(不使用/使用 Shift)。
我想要的是,当我按下该键并且同时按下 Super(win)键时,出现左括号或右括号(不带/带 shift),以及 Hyper 键(我已将其配置为 Caps Lock)的斜线/反斜线。
我尝试将一个文件添加.Xmodmap
到我的主目录并
xmodmap ~/.Xmodmap
使用以下语法运行它
keycode 61 = minus underscore a b c d e f g h i j k l m n o p
但是,这将导致 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]};
但发生的只是 ' * ´ × ' * ' * (分别表示 normal、altgr、win 和 caps lock)。我也试过
key <BKSL> { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};
但是,一旦指定的字段超过 4 个,它似乎就会完全破坏密钥,并且密钥会恢复为默认的 pc105(我们?)行为。
由于我在 stackoverflow、superuser 或 google 上都找不到关于如何处理我的情况的任何信息,所以我在这里询问。
这是我的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)
答案1
两年后,我终于可以自豪地回答我自己的问题了。
我发现最简单、最可靠、最可扩展的方法是完全依靠xmodmap
。
1. 获取特殊键的键码
运行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
键码在第三行,键码 66。
对我来说,这些是我特别感兴趣的键,以及它们对应的键代码:
Caps Lock
,键码 66Pause|Break
,键码 128Left Windows key
,键码 133Num Lock
,键代码 77
2. 设置切换键
这是我选择的设置,但您可以选择自己的设置。我已将其保存到文件中$HOME/.xmodmap
。
~/.xmodmap
keycode 66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...
这样,我就将 绑定Caps Lock
到Mode_switch
、Pause Break
和Compose
左键Win
到Super_L
。Compose
键特别有用,因为它允许将两个键组合起来进行连字符。例如,Compose
后跟T
和M
会得到商标符号™
。
3. 获取当前的键盘映射绑定xmodmap
为了不破坏我的键盘布局,我希望我的按键尽可能接近原来的布局。为了做到这一点,我打印了当前的按键映射并查找了我想要更改的键码。
$ xmodmap -pke | ag 'keycode 51'
当然,您也可以轻松使用grep
或ack
,具体取决于您喜欢使用的工具。
$ xmodmap -pke | grep 'keycode 41'
$ xmodmap -pke | ack 'keycode 31'
其输出格式与您指定的格式相同,~/.xmodmap
如下所示:
keycode 31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless
4. 备份现有xmodmap
为了防止出现问题,保持当前xmodmap
可用状态并能轻松恢复永远不是一个坏主意。
$ xmodmap -pke > ~/.xmodmap.bak
5. 为键盘的第 2、3、4 级添加字符
据我了解,该.xmodmap
文件的格式如下:
keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...
现在,我不明白所有这些级别,但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
...
6. 测试你的.xmodmap
现在让我们xmodmap
执行.xmodmap
并测试您的全新键盘布局。
$ xmodmap /home/user/.xmodmap
7. 确保你的键盘布局在 x init 上加载
我将其添加到我的$HOME/.xinitrc
:
~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...
我希望这可以帮到你!