Linux 中的高级键映射

bwr*_*bit 3 x11 xmodmap xkb xcape

我正在使用 manjaro i3 并且正在考虑修改我所做的一些键映射。目前我正在使用 xcape、xmodmap 和 setxkbmap 命令来重新映射以下键:

  1. 握住时可控制大帽,按下时逃逸
  2. 交换分号和冒号

我已经用这个设置脚本完成了这个:

setxkbmap -option 'caps:ctrl_modifier'
xcape -e 'Caps_Lock=Escape'
xmodmap -e "keycode 47 = colon semicolon"
Run Code Online (Sandbox Code Playgroud)

我想就我希望进行的其他更改寻求一些帮助或建议,因为我已经破坏了我的键映射,并且在使用下面列出的打印屏幕重新映射时必须重新安装我的操作系统才能回到原状态。我希望做出的改变如下:

  1. 打印屏幕 --> 禁用或用作另一个超级键
  2. 左 alt --> mode_switch 键
  3. 转义键 --> 波浪号和反引号
  4. 原始波浪号和反勾号 --> 退格
  5. 退格键 --> 删除
  6. 禁用 home、end、insert、delete 键并映射它们以运行一些脚本
  7. mode_switch + h, j, k, l --> 附加箭头键
  8. mode_switch + 退格键 --> 主页
  9. mode_switch + 删除 --> 结束

我应该使用什么工具来完成这些重新映射?另外,如果有人有一些他们过去使用过的类似示例,那也会非常有帮助!在此先感谢您的帮助。

小智 6

我在 GNOME 中运行 Pop!_OS(Ubuntu 18.10 的衍生版本)的 ThinkPad P1 上确认了以下所有内容。

查找关键代码

xev在终端中运行并开始输入。有很多数据,但是您要查找的通常是单词之后的块的第二个第三行keycode

KeyRelease event, serial 37, synthetic NO, window 0x3c00001,
    root 0x1a5, subw 0x0, time 291165043, (404,446), root:(454,634),
    state 0x0, **keycode 107** (keysym 0xff67, Menu), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Run Code Online (Sandbox Code Playgroud)

有些按键xev不会打印按键代码,例如 Print Screen。对于这些,您可以通过 grep 浏览下一节中创建的文件。

所需工具

xmodmap

转储您当前的绑定

您可以通过运行将当前映射打印到标准输出xmodmap -pke。通过首先将xmodmap布局备份到文件,您将省去一些潜在的麻烦:

KeyRelease event, serial 37, synthetic NO, window 0x3c00001,
    root 0x1a5, subw 0x0, time 291165043, (404,446), root:(454,634),
    state 0x0, **keycode 107** (keysym 0xff67, Menu), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Run Code Online (Sandbox Code Playgroud)

如果密钥没有出现在xev.

xmodmap -pke ~/.Xmodmap.orig
Run Code Online (Sandbox Code Playgroud)

快速更改绑定的命令

你已经知道这一点,但只是重申:

xmodmap -e "keycode [number] = [keys...]"
Run Code Online (Sandbox Code Playgroud)

这将暂时为您的会话重新绑定密钥。xmodmap -pke 再次运行将反映这些变化。

句法

xmodmap使用空格分隔的列来表示 的不同修饰符/模式keycode。从左到右分别是:

  • 钥匙本身
  • Shift + 键
  • Mode_switch + 键
  • Mode_switch + shift + 键

例如:

cat ~/.Xmodmap | grep Print
keycode 107 = Print Sys_Req Print Sys_Req
Run Code Online (Sandbox Code Playgroud)

这将单独设置“J”键“j”,当按下 Shift 时设置为“J”,使用 Mode_switch 按下时设置向下箭头,使用 Mode_switch 和 Shift 按下时设置 Page Down。

Mode_switch

Mode_switch是一个单独的通用修饰符,类似于 Shift。我认为很多键盘Mode_switch不再带有专用(AltGr) 键,但您可以使用xmodmap.

xmodmap -e "keycode [number] = [keys...]"
Run Code Online (Sandbox Code Playgroud)

使用 GNOME 设置运行脚本或 xbindkeys

我不知道使用xmodmap. 但是,有一些简单的方法。

从 i3 配置

I3文档对使用的例子bindsym/bindcode在你的指令~/.config/i3/config文件。

xmodmap -e "44 = j J Down Next"
Run Code Online (Sandbox Code Playgroud)

我还没有设置 i3,还没有测试过,但它直接来自用户手册。我猜这些代码与您在xmodmap& 朋友中找到的相符。

GNOME

查看设置 > 设备 > 键盘 > 键盘快捷键。单击加号并添加脚本/键组合。请注意,您必须将完整路径(从根目录)放入脚本并确保它是可执行的。

键盘快捷键的 GNOME 设置窗格的屏幕截图

在我的测试中,GNOME 不允许您使用某些键,例如 Home 和 End。

xbindkeys

xbindkeys 可以拦截任何按键并运行脚本。

太看一些配置文件示例,运行xbindkeys --defaults > $HOME/.xbindkeysrc并查看文件。

请注意,它不会打开终端,只是在进程中执行文件。

你的例子

这是为您想要的运行而运行的实际命令。请务必确认您自己的密钥代码,这些正是我碰巧拥有的。

第 1 步:重新映射 xmodmap

# print screen --> use as another super key, print screen with Mode_switch
# Note: On GNOME, it appears Super_R doesn't work the same as Super_L
xmodmap -e "keycode 107 = Super_L NoSymbol Print Sys_Req"

# left alt --> mode_switch key
xmodmap -e "keycode 64 = Mode_switch NoSymbol"

# escape key --> tilde and backtick
# Note: this can have unexpected consequences if you use `xcape` to map 
# Control/Caps to send Escape when tapped. It will instead send `/~ when you 
# press Caps Lock attempting to get Escape.
# A solution might be to switch the keys around and use a non-op key as a 
# placeholder, like in the xcape README
# https://github.com/alols/xcape/blob/master/README.md#examples
xmodmap -e "keycode 9 = grave asciitilde grave asciitilde"

# original tild and back tick --> backspace
xmodmap -e "keycode 49 = BackSpace"

# backspace --> delete, and
# mode_switch + backspace --> home
xmodmap -e "keycode 22 = Delete NoSymbol Home"

# mode_switch + delete --> end
# Note: This won't work when combined with `xbindkeys`, since `xbindkeys`
# hijacks the entire Delete key from X.
xmodmap -e "keycode 119 = Delete NoSymbol End"

# mode_switch + h, j, k, l --> additional arrow keys
# Bonus: capital J/K are Page Down/Up, H/L are Home/End with Mode_switch + Shift
xmodmap -e "keycode 43 = h H Left Home"
xmodmap -e "keycode 44 = j J Down Next"
xmodmap -e "keycode 45 = k K Up Prior"
xmodmap -e "keycode 46 = l L Right End"

Run Code Online (Sandbox Code Playgroud)

第 2 步:保存更改

# Set left Alt as Mode_switch
xmodmap -e "keycode 108 = Mode_switch"
Run Code Online (Sandbox Code Playgroud)

将上面的最后一个命令添加到您的~/.profile~/.bash_profile将在您登录时加载它,假设您有一个标准设置。对我来说这有点慢,您可能只想xmodmap -e手动添加所有命令。

第 3 步:为自定义脚本设置绑定 xbindkeys

确保xbindkeys已安装,并将其添加到您的~/.xbindkeysrc文件中:

bindcode 214 exec /home/you/some_script.sh
Run Code Online (Sandbox Code Playgroud)

然后用xbindkeys -p.

第 4 步:没有第 4 步

进一步阅读

关于重新映射的
Emacs Wiki 页面 关于 xmodmap 的 Emacs Wiki 页面 关于 Xmodmap 的
Arch Wiki
更多关于 StackExchange 上的 Mode_switch
一个更全面和更费力的解决方案是只编写您自己的键盘布局