Linux 控制台/鍵盤配置
用於 Linux 控制台的鍵盤映射(keymaps)、控制台字體和控制台映射由 kbd包 包(systemd 的依賴)提供,它還提供了許多管理文本控制台的低級工具。此外,systemd 還提供了 localectl 工具,可以控制控制台和 Xorg 的系統區域和鍵盤布局設置。
查看鍵盤設置[編輯 | 編輯原始碼]
使用 localectl status
查看當前的鍵盤配置。
鍵盤映射[編輯 | 編輯原始碼]
鍵盤映射文件存儲在 /usr/share/kbd/keymaps/
目錄樹中。通常一個鍵盤映射文件對應一個鍵盤布局(include
語句可用於共享通用的部分,一個鍵盤映射文件可以包含多個布局,其中一些按鍵組合用於切換)。更多細節請參見 keymaps(5)。
列出鍵盤映射[編輯 | 編輯原始碼]
控制台鍵盤映射的命名約定有些隨意,但它們通常基於:
- 語言代碼:語言代碼與國家代碼相同(例如
de
表示德語,fr
表示法語)。 - 國家代碼:不同國家使用相同語言的不同變體(例如,
uk
用於英國英語,us
用於美國英語);國家代碼列表也可以在 wikipedia:ISO 3166-1#Officially assigned code elements 中找到。 - 鍵盤布局:布局與國家或語言無關(例如
dvorak
用於 Dvorak 鍵盤布局)。
使用以下命令查看可用鍵盤映射的列表:
$ localectl list-keymaps
要搜索鍵盤映射,請使用以下命令,將 search_term
替換為您的語言、國家或布局代碼:
$ localectl list-keymaps | grep -i search_term
或者,使用 find:
$ find /usr/share/kbd/keymaps/ -type f -name "*search_term*"
Loadkeys[編輯 | 編輯原始碼]
可以只為當前會話設置一個鍵盤映射。這在測試不同的鍵盤映射、解決問題等的時候非常有用。
loadkeys 工具用於此目的,它由 systemd 在加載 /etc/vconsole.conf
中配置的鍵盤映射時在內部使用。用法很簡單:
# loadkeys 键盘映射
詳情請參閱 loadkeys(1)。
持久化設置[編輯 | 編輯原始碼]
持久鍵盤映射可以在/etc/vconsole.conf
中設置,systemd 可以在啟動時加載。 KEYMAP
變量來明確定義鍵盤映射。如果此變量是空的或沒有設置, us
鍵盤映射作為默認值。參見 vconsole.conf(5) 詳細設置。 例如:
/etc/vconsole.conf
KEYMAP=uk ...
localectl 可以方便設置終端鍵盤映射。既可以改變在/etc/vconsole.conf
裡 KEYMAP
變量值也可以為當前會話設置臨時值。
# localectl set-keymap --no-convert keymap
--no-convert
選項可以阻止localectl
自動的安裝最近似的適配改變 Xorg keymap (不會影響xwindows下鍵盤布局)。參見 localectl(1) 獲得更多細節。
如果有需求,可以在早期用戶空間時,使用 keymap
鈎子從 /etc/vconsole.conf
設置中讀取鍵盤映射 mkinitcpio hook。
/usr/share/kbd/keymaps/
以外的目錄中,在設置vconsole.conf
或使用上面提到的 localectl命令時使用完整的絕對路徑。創建自定義鍵盤映射[編輯 | 編輯原始碼]
當使用終端時,你可以使用熱鍵輸出特殊字符。然而我們還可以輸出一系列字符和一些轉義字符。如果我們輸出一系列字符組成命令,之後轉義字符換一個新行,這個命令將被執行。
編輯鍵盤映射文件可以實現上述方法。但是,由於更新系統原因鍵盤映射文件會被重寫,不鼓勵編輯上述鍵盤映射文件。一個更好的解決方案時整合現存的鍵盤映射文件和個人設置的鍵盤映射文件,loadkeys
命令工具可以做到這一點。
首先,創建一個鍵盤映射文件,這個鍵盤映射文件可以存放在任何地方,但是推薦的方法是在/usr/local
: create裡面模擬目錄結構:創建/usr/usr/local/share/kbd/keymaps
目錄,編輯edit /usr/local/share/kbd/keymaps/personal.map
文件。
PS:值得注意的是,這樣的個人鍵盤映射文件對於重新定義已經是默認的鍵盤映射的按鍵行為也非常有用:當使用loadkeys
指令時,默認的鍵盤映射和新的指令相衝突時,默認鍵盤映射被取代,反之則保留。這種方法僅僅會改變在個人鍵盤映射裡面必須被改變的鍵盤映射。
- 你也可以編輯一個現存的鍵盤映射,它在
/usr/share/kbd/keymaps/
目錄裡面。鍵盤映射文件的擴展名是.map.gz,比如 us.map.gz 是美國鍵盤映射。複製這個鍵盤映射到/usr/local/share/kbd/keymaps/personal.map.gz
並且使用gunzip解壓縮之。
- 通過設置
/etc/vconsole.conf
文件自定義的個人鍵盤映射可以持久化。鑑於此,如果你在mkinitcpio hook中使用的sd-vconsole
來代替keymap
,你應該把你的自定義鍵盤映射文件放入/usr/share/kbd/keymaps/
中。這種方法它的來自/usr/share/kbd/keymaps
的依賴關係會被鈎子自動的加載到初始內存鏡像中去。另一方面,如果你把自定義的鍵盤映射放在了/usr/local/
下,它的依賴需要在mkinitcpio.conf
文件中FILES
行手工明確加載。
增加映射命令[編輯 | 編輯原始碼]
個人鍵盤映射包括2種指令。首先,keycode 命令,這和默認鍵盤映射看到的格式相匹配。這指令把 keycode 和 keysym 聯繫在一起。keysyms 代表鍵盤的動作。這個可用的動作包括:輸出字符碼或轉義字符,切換終端和鍵盤映射,啟動機器等許多其他動作。全部的當前活動的鍵盤映射可以從以下命令獲得:
# dumpkeys -l
大部分的鍵盤動作都很直觀。例如,設置 112鍵輸出「e」,這個命令是:
keycode 112 = e
設置112輸出 euro符號,這個命令是:
keycode 112 = euro
一些鍵盤動作不能立即和某個鍵盤按鍵聯繫起來。尤其是鍵盤動作前綴是大寫的F後面是1-3位數字,F1-F246構成大於30的總是空白的。定義一個熱鍵輸出一系列字符或其他動作是非常有用:
keycode 112 = F70
此時F70可以綁定輸出特定的字符串:
string F70 = "Hello"
當112鍵被按下時,會輸出F70的內容。為了在終端執行可以輸出的命令,換行符必須附加到命令字符串的後面。例如:輸出系統休眠命令enter a system into hibernation ,加入下面的鍵盤映射。
string F70 = "sudo systemctl hibernate\n"
其他例子[編輯 | 編輯原始碼]
- 對於 emacs 用右側的 Alt 行使和左側 Alt 同樣的功能,用下面的命令在你的鍵盤映射裡。它將會包含
/usr/share/kbd/keymaps/i386/include/linux-with-two-alt-keys.inc
,可以查看它的實現細節。
include "linux-with-two-alt-keys"
- 切換 Caps_lock 和 Escape 鍵(為vim),重新映射相應的 keycodes。
keycode 1 = Caps_Lock keycode 58 = Escape
- 切換 Caps_lock 作為額外的 Control 鍵,重新映射相應的 keycodes。
keycode 58 = Control
- 互換 Caps_lock 和左側 Control 鍵,重新映射相應的 keycodes。
keycode 29 = Caps_Lock keycode 58 = Control
儲存更改[編輯 | 編輯原始碼]
為了使用個人鍵盤映射,必須使用 loadkeys。
# loadkeys /usr/local/share/kbd/keymaps/personal.map
然而,這個鍵盤映射只能在當前會話被激活。為了在啟動時使用這個鍵盤映射,需要在 /etc/vconsole.conf 中設置KEYMAP
,並且明確寫出個人鍵盤映射文件絕對路徑。這個文件不必想被 kbd包 提供的官方的鍵盤映射一樣使用gunzip壓縮。
KEYMAP=/usr/local/share/kbd/keymaps/personal.map
修改按鍵延時和重複頻率[編輯 | 編輯原始碼]
按鍵延時是只長按一個按鍵多少時間(通常以毫秒為單位)才會開始重複這個按鍵。開始重複過程後,字符會以一定頻率重複(通常以赫茲單位),也就是重複頻率。這些值可以通過 kbdrate 設置。請注意,這些設置需要為控制台和 Xorg 分別配置。
# kbdrate [-d delay] [-r rate]
例如,要將延時設置為 200 毫秒,將重複頻率設置為 30Hz,請使用以下命令:
# kbdrate -d 200 -r 30
若不指定延時和重複頻率,延時和重複頻率將被重置為各自的默認值:延時 250ms,重複頻率 11Hz:
# kbdrate
Systemd 服務[編輯 | 編輯原始碼]
可以使用 systemd 服務設置重複頻率。例如:
/etc/systemd/system/kbdrate.service
[Unit] Description=Keyboard repeat rate in tty. [Service] Type=oneshot RemainAfterExit=yes StandardInput=tty StandardOutput=tty ExecStart=/usr/bin/kbdrate --silent --delay 250 --rate 30 [Install] WantedBy=multi-user.target
然後啟動/啟用 kbdrate.service
systemd 服務。