1. 程式人生 > 其它 >linux 按鍵修改簡單示例

linux 按鍵修改簡單示例

技術標籤:linux學習記錄linux

1、修改方法

文字介面和圖形介面的keycode是不一樣的,按鍵對映方式不同,因此修改方法不同。

1.1 文字介面

1.1.1 修改命令

在文字介面,dumpkeys 可以查詢當前keycode。在文字或圖形介面loadkeys 可以修改,例如將ctrl+alt+g修改為開啟虛擬終端tty1的快捷鍵。g的keycode是35。

[email protected]-os:/etc/systemd$ sudo loadkeys -u
[sudo] kylin 的密碼:
正在載入 <stdin>
contron alt keycode 35
= Console_1

ctrl+d確認修改。
但是用命令會在重啟後失效,要不在啟動的某個指令碼中新增該命令,要不就修改對映檔案;

1.1.2 修改對映檔案

/etc/console-setup下 cached.kmap.gz 解壓,根據dumpkeys的結果找到對應的設定項後修改。

這是dumpkeys的部分結果:

keycode  35 = +h              
	shift	keycode  35 = +H              
	shift	altgr	keycode  35 = +H              
	control	keycode  35 = BackSpace       
	shift	control	keycode  35
= BackSpace altgr control keycode 35 = BackSpace shift altgr control keycode 35 = BackSpace alt keycode 35 = Meta_h shift alt keycode 35 = Meta_H altgr alt keycode 35 = Meta_h shift altgr alt keycode 35 = Meta_H control alt keycode 35
= Meta_BackSpace shift control alt keycode 35 = Meta_BackSpace altgr control alt keycode 35 = Meta_BackSpace

cached.kmap檔案的部分內容:

keycode 35 = +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0048 +U+0068 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace

希望得到control alt keycode 35 = Console_1的話, cached.kmap檔案修改為:

keycode 35 = +U+0068 +U+0048 +U+0068 +U+0048 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H  Console_1 Meta_BackSpace Meta_BackSpace Meta_BackSpace ...

1.2 圖形介面

可以通過xev來獲取相應按鍵的keycode和keysym值。

1.2.1 通過xmodmap修改

xmodmap -pk 檢視當前對映規則;
xmodmap修改本人只實驗修改單獨按鍵和shift+單個按鍵的兩種,其他情況沒搞清楚,這兩種設定方式有其他文章說明,此處不細說;

1.2.2 通過xkb修改相應檔案

[email protected]-os:/etc/console-setup$ cd /usr/share/X11/xkb/
[email protected]-os:/usr/share/X11/xkb$ ls
compat  geometry  keycodes  rules  symbols  types

xkb下有6個資料夾,此處關注symbols資料夾下

檔名簡介
pc修飾鍵對應規則
usEnglish us 鍵盤佈局規則
srvr_ctrlfkey 對應 vt 的規則
未完待續
xkbcomp $DISPLAY filename

檢視xkb keymap資訊,包括keycodes、types、compatibility、symbols、geometry,根據名稱查詢該條目在哪個檔案中設定。

例如將ctrl+alt+g修改為開啟虛擬終端tty1的快捷鍵,
在/usr/share/X11/xkb/symbols/us檔案,xkb_symbols “basic” 中

key <AC05> {	[	  g,	G		]	};

改為:

key <AC05> {type[Group1] = "CTRL+ALT",
            symbols[Group1] = [ g, G, NoSympol, NoSympol, XF86Switch_VT_1 ] };

參考:
1、https://www.charvolant.org/doug/xkb/html/xkb.html
2、https://github.com/Chunlin-Li/Chunlin-Li.github.io/blob/master/blogs/linux/ubuntu-xkb-keyboard-remap.md