Linux 控制台/鍵盤配置

出自 Arch Linux 中文维基

用於 Linux 控制台的鍵盤映射(keymaps)、控制台字體和控制台映射由 kbd 包(systemd 的依賴)提供,它還提供了許多管理文本控制台的低級工具。此外,systemd 還提供了 localectl 工具,可以控制控制台和 Xorg 的系統區域和鍵盤布局設置。

查看鍵盤設置[編輯 | 編輯原始碼]

使用 localectl status 查看當前的鍵盤配置。

鍵盤映射[編輯 | 編輯原始碼]

鍵盤映射文件存儲在 /usr/share/kbd/keymaps/ 目錄樹中。通常一個鍵盤映射文件對應一個鍵盤布局(include 語句可用於共享通用的部分,一個鍵盤映射文件可以包含多個布局,其中一些按鍵組合用於切換)。更多細節請參見 keymaps(5)

列出鍵盤映射[編輯 | 編輯原始碼]

控制台鍵盤映射的命名約定有些隨意,但它們通常基於:

使用以下命令查看可用鍵盤映射的列表:

$ 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.confKEYMAP 變量值也可以為當前會話設置臨時值。

# 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),重新映射相應的kaycodes。
keycode 1 = Caps_Lock
keycode 58 = Escape
  • 切換Caps_lock作為額外的Control鍵,重新映射相應的kaycodes。
keycode 58 = Control
  • 互換Caps_lock和左側Control鍵,重新映射相應的kaycodes。
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 服務。