Linux鍵盤流-改鍵手冊
對於攻城獅來講,長期敲鍵盤擼代碼,改鍵必不可少,能防關節炎,又節約生命。
阿九是ubuntu用戶,平時虛擬機跑Win,外接機械鍵盤,普通改鍵都有瑕疵。
- 桌面X下改鍵,Console(Ctrl+Alt+F1)下不生效。
- 主機下改鍵,虛擬機中Win不生效。
- 新插入或插拔的外接鍵盤不生效。
Linux系統,每個輸入設備(ls -l /dev/input
)都有以下的過程。
/keyboard/ → scancode → /input driver/ → keycode → /X server XKB/ → keysym`
本文的改鍵手冊,從底層下手,改變scancode,因此能完美解決以上三個瑕疵。
1.改鍵內容
QWERT鍵盤已經大行其道,如果改的太別緻,會面臨一個尷尬的場景,就是別人用不了你的電腦,你也不能到別人電腦上去裝逼,無法流暢輸入,想個傻瓜一樣。
交換大小寫
(CapsLock)和左Ctrl
(scancode完成) 。
右Alt
變成左Ctrl
(scancode完成)。左Ctrl
變成功能鍵Mod4
,形成Emacs
,Vim
移動鍵位(Xmod完成)。pnbf
,kjhl
分別對應方向鍵上下左右
(Xmod完成)。ae
,io
分別對應Home
和End
(Xmod完成)。rv
,,.
分別對應上下翻頁
(Xmod完成)。dcg
分別對應Delete
,BackSpace
,Escape
先上對應的配置腳本,後面章節再長篇敘述腳本生成過程。
hwdb配置
,修改scancode,每次變更好需要執行以下命令,才可生效。
sudo udevadm hwdb --update
和sudo udevadm trigger
#/etc/udev/hwdb.d/79-a9-keyboard.hwdb
evdev:input:b0011v0001p0001* # buitlin keyboard
KEYBOARD_KEY_3a=leftctrl # caps -> ctrl_l
KEYBOARD_KEY_1d=capslock # ctrl_l -> caps
KEYBOARD_KEY_b8=leftctrl # alt_r -> ctrl_l
evdev:input:b0003v046Ap0011* # usb keyboard
KEYBOARD_KEY_70039=leftctrl # caps -> ctrl_l
KEYBOARD_KEY_700e0=capslock # ctrl_l -> caps
KEYBOARD_KEY_700e6=leftctrl # alt_r -> ctrl_l
xmodmap配置
,修改後直接 xmodmap ~/.xmodmaprc
即可 。
!~/.xmodmaprc
! /etc/udev/hwdb.d/79-a9-keyboard.hwdb
remove Lock = Caps_Lock
keycode 66 = Mode_switch NoSymbol
keycode 33 = p P Up Up
keycode 57 = n N Down Down
keycode 56 = b B Left Left
keycode 41 = f F Right Right
keycode 38 = a A Home Home
keycode 26 = e E End End
keycode 45 = k K Up Up
keycode 44 = j J Down Down
keycode 43 = h H Left Left
keycode 46 = l L Right Right
keycode 31 = i I Home Home
keycode 32 = o O End End
keycode 27 = r R Prior Prior
keycode 55 = v V Next Next
keycode 59 = comma less Prior Prior
keycode 60 = period greater Next Next
keycode 40 = d D Delete Delete
keycode 54 = c C BackSpace BackSpace
keycode 42 = g G Escape Escape
2.hwdb配置
製作此配置文件,需要evtest
命令,sudo apt-get install evtest
首先記錄 KEYBOARD_KEY_
,然後在記錄設備
# root許可權執行,或直接輸入device路徑,如/dev/input/event4
sudo evtest
# 輸出如下
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: Lid Switch
/dev/input/event1: Power Button
/dev/input/event2: Sleep Button
/dev/input/event3: Power Button
/dev/input/event4: AT Translated Set 2 keyboard
/dev/input/event5: Video Bus
/dev/input/event6: Video Bus
/dev/input/event7: SynPS/2 Synaptics TouchPad
/dev/input/event8: Intel HID events
/dev/input/event9: Integrated_Webcam_HD: Integrate
/dev/input/event10: Dell WMI hotkeys
/dev/input/event11: DLL06E5:01 06CB:7A13 Touchpad
/dev/input/event12: HDA Intel PCH Headphone Mic
/dev/input/event13: HDA Intel PCH HDMI/DP,pcm=3
/dev/input/event14: HDA Intel PCH HDMI/DP,pcm=7
/dev/input/event15: HDA Intel PCH HDMI/DP,pcm=8
/dev/input/event16: HDA Intel PCH HDMI/DP,pcm=9
/dev/input/event17: HDA Intel PCH HDMI/DP,pcm=10
/dev/input/event18: Bluetooth Mouse M557
Select the device event number [0-18]:
# 選擇4,這是內置鍵盤,此時按需要修改的鍵,如Caps,Ctrl_L,Alt_R
Event: time 1532248945.036950, -------------- SYN_REPORT ------------
Event: time 1532248945.174908, type 4 (EV_MSC), code 4 (MSC_SCAN), value 3a
Event: time 1532248945.174908, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
Event: time 1532248948.101240, -------------- SYN_REPORT ------------
Event: time 1532248948.245571, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
Event: time 1532248948.245571, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0
Event: time 1532248948.245571, -------------- SYN_REPORT ------------
Event: time 1532248951.262652, type 4 (EV_MSC), code 4 (MSC_SCAN), value b8
Event: time 1532248951.262652, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
# 其中 value部分,就是對應的 KEYBOARD_KEY_,是16進位
接下來記錄evdev:input:
# 選擇上面的設備編號,event4,代入以下命令
grep "" /sys/class/input/event4/device/id/*
# 得到以下輸出
/sys/class/input/event4/device/id/bustype:0011
/sys/class/input/event4/device/id/product:0001
/sys/class/input/event4/device/id/vendor:0001
/sys/class/input/event4/device/id/version:ab41
把上面的信息,都代入以下的格式
evdev:input:b[bustype]v[vendor]p[product]*
KEYBOARD_KEY_[scancode]=[key code identifier]
注意,[bustype], [vendor], [product]都是4字元的,不夠時前面補零。
同樣的步驟,我們取得USB外接鍵盤的配置,一般來講可以直接列出來,如果不存在,則
lsusb
# 大概如下輸出,記住名字
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0a2b Intel Corp.
ls -l /dev/input/by-id
# 大概如下輸出,找到usb相配的名字,記住編號,如evnet9
usb-XXXXX -> ../event9
sudo evtest /dev/input/event9
以上配置完成後,一定要記得執行以下命令,
sudo udevadm hwdb --update
sudo udevadm trigger
3.xmodmap配置
這個配置是否簡單,通過xev
可以找到對應的 keycode
xev
# 大概輸出如下,記住 keycode 37
KeyPress event, serial 37, synthetic NO, window 0x5400001,
root 0x18e, subw 0x0, time 1990777, (-662,-200), root:(686,365),
state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
關於鍵的名字,如Right
BackSpace
,按下那個鍵,直接看xev輸出即可。
更複雜的名字,需要自行搜索下資料,關鍵詞是keycode
xmodmap
完成後,執行xmodmap ~/.xmodmaprc
即可生效,有辦法做到自啟的,我不說:)
通過xmodmap -pke|grep -E Control|Home|Next
可以查看對應配置。
4.結束語
有搜商,愛折騰,是攻城獅標配。
因此不放任何參考資料。
推薦閱讀: