本文来自依云's Blog,转载请注明。
很早之前,因为有了 fcitx-keyboard,fcitx 能够管理键盘布局了。于是乎,经常干了什么事情之后,xmodmap 的效果就没了。
为了解决这个问题,fcitx 可以在相关事件时自动调用 xmodmap 命令。然后我发现,xmodmap 命令经常会调用很多很多次。我笔记本的配置还好,那个 xmodmap 配置调用多次会有命令失败,所以只要调整下顺序就可以保证键映射正确:
keysym Pause = Print remove Lock = Caps_Lock keysym Escape = Caps_Lock keysym Caps_Lock = Escape add Lock = Caps_Lock keycode 107 = Super_R Sys_Req Super_R Sys_Req
这样子日志里会多一些消息,无所谓了,反正桌面日志我只保留最近的一份。
可是,我另外的系统上只需要交换 Esc 和 Caps Lock 这两个键:
remove Lock = Caps_Lock keysym Escape = Caps_Lock keysym Caps_Lock = Escape add Lock = Caps_Lock
于是,当 fcitx 调用偶数次 xmodmap 时,这两个键就给交换回去了……实际的效果是,我几乎每次从挂起中恢复,都需要手动执行一次 xmodmap。更烦的是,几乎每次在 gnome-screensaver 里输入密码时,大小写切换键默认是开着的。这时候我得按按 Esc 或者 Caps Lock,或者是输入一个字符后再按它们中的一个。一直以来没找到规律……
最后,终于查阅 xmodmap 手册,写了下面这个简单的脚本:
#!/bin/bash -e [[ -n $(xmodmap -pk | awk '$1 == 66 && $3 == "(Escape)"') ]] || xmodmap ~/.Xmodmap
如果 Esc 键已经交换过了,就不要再交换一次了。
再设置 fcitx 执行这个我自己的脚本就可以了:
2013年8月28日更新:csslayer 最近已经修复了 fcitx 多次调用 xmodmap 的问题,不再需要这样特别的设置了。感谢 csslayer 的及时修正=w=
Aug 23, 2013 07:54:17 PM
我用 setxkbmap -option ctrl:nocaps; caps -> ctrl; xcape https://github.com/alols/xcape 在 ctrl 被單獨按時作爲 esc 處理……但是 vim 裏識別 ctrl->esc 的延時有點大,不知怎麼處理
Aug 23, 2013 08:33:07 PM
我只想换 Esc 和 Caps 啦……
Aug 23, 2013 08:42:48 PM
喵, 咱想知道这个干嘛用?
Aug 23, 2013 10:40:02 PM
交换 Esc 和 Caps 键,不要让它在切换键盘布局时或者莫名其妙地失效……
Aug 23, 2013 11:22:06 PM
原来是fcitx搞的鬼!我说怎么有时候Esc突然不好使了呢……
然后开一个终端又变回去了233
Aug 25, 2013 11:24:16 AM
ˊ_>ˋ 调用多次什么的应该早就修复了啊
而且我在调用之前都会故意重置一次
Aug 25, 2013 01:26:19 PM
我从来没发现那个问题修复了,而且我遇到的问题是怎么回事呢?
Aug 26, 2013 02:16:03 PM
ˊ_>ˋ 不知道,你的锁屏程序为啥还会触发键盘事件
我今年1月的时候fix的
你在 xkb.c 的 855 行那加个
if (xkbEvent->any.xkb_type == XkbNewKeyboardNotify) {
FcitxLog(INFO, "serial:%d", xkbEvent->new_kbd.serial);
}
来 debug 看看
Aug 26, 2013 03:21:18 PM
ˊ_>ˋ 似乎我还是对那个 event 理解有点问题……我换个方式实现一下…
你有空来试试 master…
Aug 26, 2013 08:57:09 PM
好像现在终于好了耶~我再多用用。
对了,xmodmap 配置文件里扩展下 ~ 吧 :-)
Aug 26, 2013 10:39:49 PM
你不加参数的话默认就用 ~/.Xmodmap 了,如果存在的话