使用setxkbmap交换左移和左控制


17

是否可以使用来代替Left Shift和Left CTRL键?setxkbmapxmodmap

编辑

我已经改用Fcitx了,它在键盘布局和自定义键映射方面在各个方面都比IBus更好。我强烈推荐它。

Answers:


28

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。您可以制作两个小脚本来加载它们。


1
谢谢。它确实有效,但是只有一次。问题是我正在使用名为IBus的输入引擎。每当我切换输入法,然后按“ Ctrl +空格”键返回时,左移和左控制都将切换回去。关于如何避免它的任何建议。

嗯,也许IBus会自己做一些键盘重新定义。xkbcomp $DISPLAY some.dump在调用IBus之后和之前尝试,对两个转储进行比较(它们是完整的键盘定义);您可能会发现差异。
Pablo Saratxaga

嗯,确实如此,令人讨厌。有什么办法摆脱这个问题吗?请注意,该命令setxkbmap -option caps:escape有效。IBus记得交换的键Esc和Caps_Lock键,但是对交换的Left Shift和Left Control键不起作用。

也许IBus在启动时会阅读键盘。尝试卸载IBus,更换键盘,然后再次加载。如果问题仍然存在,则应该提出IBus特定问题(并且可能会报告错误;恕我直言,是的,IBus应该检测键盘变化并兑现它们)
Pablo Saratxaga

你好 谁能告诉我我将如何使用相同的技术将左Alt键换成左Control键?我尝试将myswap文件更改为:部分修改器密钥xkb_symbols“ swap_l_shift_ctrl” {替换密钥<LCTL> {[Alt_L]}; 替换键<LALT> {[Control_L]}; }; 但是没有用。TIA !!!
尼尔·吉拉迪

3

我在映射LALTControl_L使用Pablo解决方案时遇到了一些问题,看来您也需要设置modifier_map选项。

我从/usr/share/X11/xkb/symbols/altwin-查找xkb_symbols "ctrl_alt_win"- 复制了模板,并对其进行了修改以设置以下更改:

  • LALT控制键**
  • LWIN Alt键
  • MENU键至Windows键

最终~/.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> };
};

我还添加-w0xkbcomp命令,以避免在打开新外壳时出现任何警告输出。

xkbcomp -w0 -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY

**经常在Mac和Linux之间切换,我喜欢在Linux上有两个控制键来近似Mac键盘的肌肉记忆。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.