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

阿九是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。結束語

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

因此不放任何參考資料。