Answers:
xmodmap
过时的 因此确实应该使用xkb
工具来完成。
默认情况下,您想要的交换似乎未包含在X11文件中。所以你必须自己写。
http://madduck.net/docs/extending-xkb/页面帮助我理解并找到了一种方法。
创建一个文件~/.xkb/keymap/mykbd
,在其中放置的输出setxkbmap
,它将是您的基本键盘定义;例如:
setxkbmap -print > ~/.xkb/keymap/mykbd
然后,创建一个符号文件来定义您的密钥交换,例如将其放在 ~/.xkb/symbols/myswap
在那里,输入以下内容:
partial modifier_keys
xkb_symbols "swap_l_shift_ctrl" {
replace key <LCTL> { [ Shift_L ] };
replace key <LFSH> { [ Control_L ] };
};
然后,编辑~/.xkb/keymap/mykbd
文件,然后更改xkb_symbols
行以添加
+myswap(swap_l_shift_ctrl)
最后,您可以加载它xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY
(不能在-I
参数中使用“〜” )。对于一些稀有键,它可能会吐出很多关于未定义符号的警告,但是您可以忽略它们(例如,将错误重定向到dave:)2> /dev/null
。
如果您希望能够轻松地在普通和反向ctrl / shift键之间切换;只需在~/.xkb/keymap/
另一个文件下创建,而无需额外的“ myswap”选项,然后使用即可加载xkbcomp
。您可以制作两个小脚本来加载它们。
xkbcomp $DISPLAY some.dump
在调用IBus之后和之前尝试,对两个转储进行比较(它们是完整的键盘定义);您可能会发现差异。
setxkbmap -option caps:escape
有效。IBus记得交换的键Esc和Caps_Lock键,但是对交换的Left Shift和Left Control键不起作用。
我在映射LALT
到Control_L
使用Pablo解决方案时遇到了一些问题,看来您也需要设置modifier_map
选项。
我从/usr/share/X11/xkb/symbols/altwin
-查找xkb_symbols "ctrl_alt_win"
- 复制了模板,并对其进行了修改以设置以下更改:
最终~/.xkb/symbols/myswap
文件为:
partial modifier_keys
xkb_symbols "swap" {
key <MENU> { [ Super_L ] };
key <LALT> { [ Control_L, Control_L ] };
key <RALT> { type[Group1] = "TWO_LEVEL",
symbols[Group1] = [ Alt_R, Meta_R ] };
key <LWIN> { [ Alt_L, Meta_L ] };
key <LCTL> { [ Control_L ] };
key <RCTL> { [ Control_R ] };
modifier_map Control { <LALT>, <LCTL>, <RCTL> };
modifier_map Mod1 { <LWIN>, <RALT> };
modifier_map Mod4 { <MENU> };
};
我还添加-w0
了xkbcomp
命令,以避免在打开新外壳时出现任何警告输出。
xkbcomp -w0 -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY
**经常在Mac和Linux之间切换,我喜欢在Linux上有两个控制键来近似Mac键盘的肌肉记忆。