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。結束語
有搜商,愛折騰,是攻城獅標配。
因此不放任何參考資料。