在Linux上重新映射Win、Ctrl和Alt键

11

问题:

如何在Linux系统上全局重映射(交换)修饰键?

说明:

我想在我的PC上安装Debian Jessie并与Emacs一起使用。 我有一台MacBook,主要使用Emacs。以下是笔记本电脑上的按键排列方式:

fn ctrl alt cmd spacebar cmd alt

fn在我的Emacs工作流中未使用,其他按键配置如下:

  • ctrl 作为 Hyper
  • alt 作为 Meta
  • cmd 作为 Control

这些配置使我的Emacs体验更轻松(大拇指容易击中Control cmd键),我也已经习惯了这种按键绑定。

默认情况下,alt用作Metactrl用作Control,这些键被交换,大拇指放在Meta

我希望在Linux上以相同的方式配置我的按键,这是我PC键盘上的按键布局:

ctrl win alt spacebar alt win menu ctrl

因此,为了与我的笔记本电脑键盘匹配,我希望将win键映射到Alt修饰键,将alt键映射到Control修饰键。在这种情况下,ctrl可以用作Super修饰键,而menu可以保持不变。

是否可能在Linux(Debian)系统上进行此类全局配置?


最终,我通过以下配置实现了我的目标:

!file ~/.Xmodmap

clear control
clear mod1
clear mod4


keycode 37  = Super_L     
! left  Ctrl becomes Super
keycode 64  = Control_L
! left  Alt  becomes Control 
keycode 133 = Alt_L Meta_L
! left  Win  becomes Alt
keycode 108 = Control_R
! right Alt  becomes Control 
keycode 134 = Alt_R Meta_R
! right Win  becomes Alt
keycode 105 = Super_R
! right Ctrl becomes Super


add control = Control_L Control_R
add mod1 = Alt_L Meta_L
add mod4 = Super_L Super_R

还有,这是一个类似的问题,其中包含相当有用和简单的指南。

5个回答

6
此外,使用xmodmap的方法可能并不容易,而更简单的方法是通过setxkbmap提供的键盘布局选项进行检查。这些选项实现了常见的xmodmap更改,因此它们可能包含您想要的内容。
例如,我喜欢-option ctrl:nocaps,它在caps lock的位置添加了另一个control。请参考文件/usr/share/X11/xkb/rules/base.lst以获取标准选项列表。
然而,xmodmapsetxkbmap都没有包括纯文本tty终端(非X窗口)的键盘设置。

2

我仍然不知道如何在整个系统中交换键,是否可能在启动时进行此类配置? - Geradlus_RU
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Thomas Dickey
我想要的不是配置Emacs键,而是将win键映射为altctrl,适用于所有系统应用程序等。 - Geradlus_RU
...而xmodmap是实现这一目标的起点,因为它正是如此。 - Thomas Dickey

1

xmodmap/setxkbmap 方法非常好,直到您有第二个键盘不需要任何重新映射为止。例如笔记本电脑和外部键盘。

我发现通过 udev hwdb 进行交换 是最好的,因为它只改变特定的键盘。例如,在 Framework 笔记本电脑和 Pop!OS (也适用于大多数 Debian 派生版)中交换 alt 和 win 键,需要创建一个文件 /etc/udev/hwdb.d/99-fw-meta-alt.hwdb

evdev:input:b0011v0001p0001*
  KEYBOARD_KEY_38=leftmeta
  KEYBOARD_KEY_db=leftalt

然后运行

sudo systemd-hwdb update
sudo udevadm trigger

这样做可以使alt-win仅在内部笔记本电脑键盘上交换,而不会重新映射我连接到笔记本电脑的所有其他键盘。


这听起来像是我一直在寻找的解决方案,我会测试一下。这个改变是否也会影响非桌面环境?比如我打开一个tty或者尝试发送"REISUB"? - undefined

1

全面披露

我是Kinto的作者。

你可能会发现Kinto很有用。这是我最近创建的一个项目,经过几年的尝试,我现在感觉它足够稳定可以分享了。

Kinto安装程序仅使用Python进行初始安装,之后它只是一个systemd服务、bash、xprop、setxkbmap和xkbcomp。就我而言,这是你能找到的最快速、最本地化的解决方案。

此外,Xmodmap已经过时,在Wayland中将不再起作用。

https://github.com/rbreaves/kinto

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

如果您只想了解其核心内容,这里还有一个Gist,但它不会在需要时更改您的键位图。该Gist也不包括自定义的xkb键位图文件,这些文件设置macOS风格的光标/逐字操作,使用Cmd和箭头键。

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!
#

通知 @Makyen 披露。 - R Ben R

0

如果你正在使用KDE,你可以使用以下方法将命令键分配给Alt,但这将使选项键无用。

这意味着你会在命令和选项键上拥有两个Alt,但仍然比默认设置要好。

你可以进入设置 > 键盘 > 高级选项卡 > Alt/Win键行为 > 选择将Alt映射到Win以及通常的Alt > 确定


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接