AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 429835
Accepted
bwrabbit
bwrabbit
Asked: 2018-03-13 16:02:27 +0800 CST2018-03-13 16:02:27 +0800 CST 2018-03-13 16:02:27 +0800 CST

linux中的高级键映射

  • 772

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

  1. 握住时可控制的盖子,按下时可退出
  2. 交换分号和冒号

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

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 + 退格-> 主页
  9. mode_switch + 删除 --> 结束

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

x11 xkb
  • 1 1 个回答
  • 3460 Views

1 个回答

  • Voted
  1. Best Answer
    shender
    2019-01-09T21:14:49+08:002019-01-09T21:14:49+08:00

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

    查找关键代码

    在终端中运行xev并开始输入。有很多数据,但是您要查找的通常是单词之后的第二个第 3 行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
    
    

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

    所需工具

    xmodmap

    转储你当前的绑定

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

    xmodmap -pke ~/.Xmodmap.orig
    

    该文件还可以作为一个简单的参考,如果它们没有出现在xev.

    cat ~/.Xmodmap | grep Print
    keycode 107 = Print Sys_Req Print Sys_Req
    

    快速更改绑定的命令

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

    xmodmap -e "keycode [number] = [keys...]"
    

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

    句法

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

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

    例如:

    xmodmap -e "44 = j J Down Next"
    

    这将单独设置“J”键“j”,当按下 Shift 键时设置“J”,按下 Mode_switch 键时设置 Down Arrow,按下 Mode_switch 和 Shift 键时设置 Page Down。

    Mode_switch

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

    # Set left Alt as Mode_switch
    xmodmap -e "keycode 108 = Mode_switch"
    

    使用 GNOME 设置运行脚本或xbindkeys

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

    从 i3 配置

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

    bindcode 214 exec /home/you/some_script.sh
    

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

    侏儒

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

    键盘快捷键的 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"
    
    

    第 2 步:保存更改

    # 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文件中:

    # 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 上
    的 Mode_switch 一个更全面、更费力的解决方案是编写您自己的键盘布局。

    • 8

相关问题

  • Arch Linux:在没有窗口管理器的情况下运行 VirtualBox (VM)

  • xrdb 冒号丢失错误

  • 在不改变分辨率的情况下让事情变得更大?[伴侣]

  • SSH X11 转发仅在使用受信任时有效

  • base 和 evdev xkb 规则有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve