如何使用 xmodmap 交换 Alt 和 Windows 键?

如何使用 xmodmap 交换 Alt 和 Windows 键?

我有一个 Mac 键盘,其中的 Alt/Win(即 Option/Command)键与普通 PC 键盘相比是颠倒的,我想交换它们。到目前为止,我还没有使用 xmodmap 的运气。标准配置如下:

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  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),  Mode_switch (0xcb)

目前,左/右 alt 键的键码为 64 和 108,而左/右 Windows 键的键码为 133 和 134。

我很感激任何帮助!

答案1

这是我的 Xmodmaprc:

! Exchange left Alt and left Win
remove mod1 = Alt_L
remove mod4 = Super_L
add mod1 = Super_L
add mod4 = Alt_L
! Exchange tilde and lesser/greater
keycode  94 = grave asciitilde dead_grave dead_tilde grave asciitilde
keycode  49 = less greater less greater bar brokenbar bar brokenbar
! Steve, your keyboard sucks

您必须修改 .xsession 或 .xinitrc 才能调用 xmodmap .Xmodmaprc

答案2

我发现在使用 xkb 和 gnome 的 Ubuntu 16.04 上,与Christopher Devine 的回答如果您想保留 alt 和 super 键的所有快捷方式行为,请回答上述问题。这是我找到的最简单的解决方案。

要获取您的密钥代码,请在命令行上$ xev 输入要获取其数字的密钥。有关更多信息,请参阅此帖子:xev 和 xmodmap 用法

这样做会给我: Super_L有密钥代码 133 Alt_L有密钥代码 64

因此,要将 Windows 又名 Command(在 Mac 上)又名 Super 键与左 Alt 键交换,我这样做:

remove mod1 = Alt_L
remove mod4 = Super_L
keycode 133 = Alt_L
keycode 64 = Super_L
add mod1 = Alt_L  
add mod4 = Super_L

最后两行将 mod1 和 mod4 重新添加到 Alt_L 和 Super_L 的键符中,就像它们被删除一样。如果不这样做,我将失去与超级键(搜索)相关的快捷键,并且它还会破坏用于在窗口之间切换的 alt+tab 组合。

您可以将这些命令添加到 .xmodmap 之类的文件中,然后 $ xmodmap .xmodmap运行它们。

或者,您可以在命令行上按顺序运行这些命令,例如: $ xmodmap -e <expression here>

如果您想恢复默认的键映射,那么您可以反转上面代码中的数字,例如:

remove mod1 = Alt_L
remove mod4 = Super_L
keycode 64 = Alt_L
keycode 133 = Super_L
add mod1 = Alt_L  
add mod4 = Super_L

或者在 Ubuntu 中我只需运行: $ setxkbmap

答案3

我在 Ubuntu 13.04 中通过结合 Christophe 的答案实现了这一点(这对我有帮助,但对修饰符不起作用,而且我不需要重音符和波浪号作为死键),关于setxkbmap的另一个答案,在设置-键盘-布局-选项中使用不同的选项(甚至查看源代码)并使用命令检查当前配置setxkbmap -query(您也应该运行该命令,以检查您的特定键盘型号和布局代码,因为它们可能有所不同)。

我有一个脚本,当我切换到 Apple 键盘时会调用它(关键选项是altwin:swap_lalt_lwin交换 Alt 和 Super 修饰键):

# clear all options
setxkbmap -model "pc105" -layout "hr,us" -option ""  

# set the Apple keyboard
setxkbmap -rules "evdev" -model "pc105" -layout "hr,us" -option "terminate:ctrl_alt_bksp,lv3:rwin_switch,grp:shifts_toggle,caps:ctrl_modifier,altwin:swap_lalt_lwin"

# swap the grave-tilde with less-greater key
#  - variant without dead keys
xmodmap -e "keycode  94 = grave asciitilde"
xmodmap -e "keycode  49 = less greater less greater bar brokenbar bar brokenbar"

当我回到普通键盘时,我会调用另一个命令:

# clear settings
setxkbmap -model "pc105" -layout "hr,us" -option ""

# pc keyobard
setxkbmap -rules "evdev" -model "pc105" -layout "hr,us" -option "terminate:ctrl_alt_bksp,lv3:rwin_switch,grp:shifts_toggle,caps:ctrl_modifier"

请注意,我添加了设置

terminate:ctrl_alt_bksp,lv3:rwin_switch,grp:shifts_toggle,caps:ctrl_modifier

启用 ctrl+alt+backspace Gnome 会话终止、使用右 Win 键进行 3 级键访问、通过同时按下两个 Shift 键进行布局转换以及将 Caps Lock 转换为额外的 Ctrl(分别)。您可能希望排除其中的部分或全部。

您可以使用自动键将呼叫绑定到某些键盘快捷键,或者从您的键盘上呼叫它,.profile或者.bashrc如果您一直使用 Apple 键盘。

答案4

我建议以后不要使用 xmodmap,因为它在 Wayland 中不起作用,但除此之外,setxkbmap 或 xkbcomp 将是今后最好的方法,我的项目 Kinto 就使用了它。

Kinto 会交换您想要的按键,但它也会监听您正在使用的应用程序,这样您就可以保留终端应用程序的正确键盘映射,以匹配您在 Mac 上的体验。

以下是相关链接,但我还将介绍 Kinto 的核心功能 - 减去自定义键盘映射和交替键盘映射功能,这样您就可以了解 Kinto 的实际功能。

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

要点内容

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#

相关内容