首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux中的高级密钥映射

linux中的高级密钥映射
EN

Unix & Linux用户
提问于 2018-03-13 00:02:27
回答 1查看 3.9K关注 0票数 5

我正在使用manjaro i3,并且正在研究修改我所做的一些关键映射。目前,我正在使用x佛得角、xmodmap和setxkbmap命令重新映射以下键:

  1. 按住时,帽要弯曲,按压时要逃生。
  2. 交换分号和冒号

我用这个安装脚本完成了这个任务:

代码语言:javascript
复制
setxkbmap -option 'caps:ctrl_modifier'
xcape -e 'Caps_Lock=Escape'
xmodmap -e "keycode 47 = colon semicolon"

我想寻求一些帮助或建议,因为我想要做的额外改变,因为我已经打破了我的关键映射,必须重新安装我的操作系统,以回到原点时,在玩打印屏幕重新映射,列出如下。我希望作出以下改变:

  1. 打印屏幕->禁用或用作另一个超级键
  2. 左alt -> mode_switch键
  3. 转义键->倾斜和反勾
  4. 原版和背勾号->背距
  5. 后退空间->删除
  6. 禁用home、end、insert、delete键并映射它们以运行某些脚本
  7. mode_switch + h,j,k,L->附加箭头键
  8. mode_switch + backspace -> home
  9. mode_switch +删除->结尾

我应该使用什么工具来完成这些重构?此外,如果任何人有一些类似的例子,他们在过去使用过,这将是非常有帮助的!提前感谢您的帮助。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-01-09 05:14:49

我确认了在GNOME中运行Pop!_OS (Ubuntu18.10的一个派生)的ThinkPad P1上的所有内容。

查找密钥码

在终端中运行xev并开始键入。有大量的数据,但是您要寻找的通常是块的第二行,位于单词keycode之后:

代码语言:javascript
复制
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

有些键是xev不会打印密钥代码的,比如打印屏幕。对于这些,您可以通过下一节中创建的文件实现grep。

工具需要

xmodmap

转储当前绑定

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

代码语言:javascript
复制
xmodmap -pke ~/.Xmodmap.orig

如果键在xev中没有出现,这个文件也可以作为一个简单的参考。

代码语言:javascript
复制
cat ~/.Xmodmap | grep Print
keycode 107 = Print Sys_Req Print Sys_Req

命令快速更改绑定

你已经知道这一点了,但我只想重申:

代码语言:javascript
复制
xmodmap -e "keycode [number] = [keys...]"

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

语法

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

  • 钥匙本身
  • 移位+键
  • Mode_switch +密钥
  • Mode_switch + shift +键

例如:

代码语言:javascript
复制
xmodmap -e "44 = j J Down Next"

这将自动设置"J“键"j”,当按下Shift时设置"J“,用Mode_switch按下向下箭头,用Mode_switch和Shift按下页面向下。

Mode_switch

Mode_switch是一个单独的泛型修饰符,类似于Shift。我不认为很多键盘都有专用的Mode_switch (AltGr)键,但是你可以用xmodmap设置一个键盘。

代码语言:javascript
复制
# Set left Alt as Mode_switch
xmodmap -e "keycode 108 = Mode_switch"

使用GNOME设置或xbindkeys

运行脚本

我不知道用xmodmap运行任意脚本的方法。然而,有一些简单的方法。

来自i3 config

i3文档有关于在~/.config/i3/config文件中使用bindsym/bindcode指令的示例。

代码语言:javascript
复制
bindcode 214 exec /home/you/some_script.sh

我还没有设置i3,还没有测试过它,但是它是直接从用户手册中得到的。我猜这些代码与你在xmodmap和朋友中发现的是一致的。

GNOME

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

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

xbindkeys

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

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

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

您的示例

下面是运行所需的实际命令。一定要确认你自己的密码,这些正是我所拥有的。

步骤1:使用xmodmap

重新映射

代码语言:javascript
复制
# 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"

步骤2:保存更改

代码语言:javascript
复制
# Write current config to a file
xmodmap -pke > ~/.Xmodmap

# Load the config into xmodmap
xmodmap ~/.Xmodmap

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

步骤3:用xbindkeys

设置自定义脚本的绑定

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

代码语言:javascript
复制
# disable home, end, insert, delete keys and map them to run some script, and
"some-script-in-PATH"
  Home
"some-script-in-PATH"
  End
"some-script-in-PATH"
  Insert
"some-script-in-PATH"
  Delete

然后用xbindkeys -p重新加载。

步骤4:没有步骤4

再读

关于重新映射的Emacs Wiki页面

xmodmap上的Emacs Wiki页面

关于Xmodmap的Arch Wiki

更多关于模式_打开StackExchange

一个更全面、更费力的解决方案就是只使用编写自己的键盘布局

票数 8
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/429835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档