對於攻城獅來講,長期敲鍵盤擼代碼,改鍵必不可少,能防關節炎,又節約生命。

阿九是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,形成EmacsVim移動鍵位(Xmod完成)。
  • pnbf,kjhl 分別對應方向鍵上下左右(Xmod完成)。
  • ae,io 分別對應 HomeEnd (Xmod完成)。
  • rv,,. 分別對應 上下翻頁(Xmod完成)。
  • dcg分別對應Delete,BackSpace,Escape

先上對應的配置腳本,後面章節再長篇敘述腳本生成過程。

hwdb配置,修改scancode,每次變更好需要執行以下命令,才可生效。

sudo udevadm hwdb --updatesudo 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.結束語

有搜商,愛折騰,是攻城獅標配。

因此不放任何參考資料。


推薦閱讀:
查看原文 >>
相关文章