iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 13
0
自我挑戰組

M157q 的待業程式生活日誌系列 第 13

[2018 iThome 鐵人賽] Day 13: Linux 上如何透過指令更改鍵盤鍵位


TL;DR


前言

這邊提到的都會是在 X Window 環境下的設定方式為主,這是我目前正在使用也確定可行的方法。非 X Window 的環境下則是放在補充,但因為這部份我沒有親自試過,所以僅供參考。

之前都是用 xmodmap 這個指令,搭配一份已經預先寫好的設定檔:dotfiles/Xmodmap at master · M157q/dotfiles · GitHub,讓 xmodmap 去執行這份設定檔,它會依照設定檔把鍵位更換掉。但因為我有時候是使用 Mac Book Air 的 Mac 鍵盤,有時候是外接 Filco 的鍵盤,差別最大的地方在於左下角。Mac 的鍵盤會多了一顆 Command 鍵,然後在桌面環境下,無論是我之前使用的 AwesomeWM 或是現在使用的 i3wm,在使用 Mac 鍵盤的時候會以 Command 鍵來當作 Mod4 鍵,但在非 Mac 鍵盤上,則會以 Win 鍵來當作 Mod4 鍵。

問題就在於我已經習慣 Mac 鍵盤上的設定,覺得 Mod4 鍵在空白鍵的左邊比較順手,如果使用非 Mac 鍵盤的話,Mod4 鍵則會在空白鍵左邊的左邊,按起來比較抝手。所以針對不同的鍵盤我得有不同鍵位的改變設定,讓我的操作習慣一致。

之前就覺得 xmodmap 的設定檔有點冗長,我只是要單純切換 CapsLock 和左邊的 Ctrl 鍵就要 6 行,等於是我要寫另外一份設定檔,加上我去看了設定檔的文件,覺得挺麻煩的,我也常常搞混。於是就花了點時間找尋看看有沒有比較方便的方式,後來找到 setxkbmap 這個指令,可以直接一行指令解決,利用這篇文章紀錄一下。

不管是 Mac 鍵盤上的 Command 鍵,或是非 Mac 鍵盤上的 Win 鍵,在 X Window 的鍵位判定上都會被當作是 "Super" 鍵,即這兩個會被當成是一樣作用的按鈕,但是他們在鍵盤上排列的位置卻不相同:

  • Mac 鍵盤,Command 鍵都是在空白鍵隔壁。
  • 非 Mac 鍵盤,Win 鍵都是在空白鍵隔壁的隔壁,中間隔著一個 Alt 鍵。

也就是只要我使用非 Mac 鍵盤的話,我就會需要把 Super 鍵和 Alt 鍵對調。


正文

首先當然是得安裝 setxkbmap 這個程式,如果是使用 Arch Linux 的話,可以用以下指令安裝:
sudo pacman -S xorg-setxkbmap

安裝好了之後,使用方式也很簡單,就只要一行指令就行,然後每一個設定就使用 -option 參數來設定,有三個設定就會有三個 -option。切換的規則可以在 /usr/share/X11/xkb/rules/base 找到,我覺得名稱還算好懂,但裏面其實有滿多規則的,這篇文章裏面不會一一介紹,只會講到我有用到的。

舉例來說,如果我要單純把 Ctrl 和 CapsLock 對調的話,就使用以下指令:
setxkbmap -option ctrl:swapcaps

如果要把 Ctrl 和 CapsLock 對調還要把 Alt 和 Win 鍵對調的話,就使用以下指令:
setxkbmap -option ctrl:swapcaps -option altwin:swap_alt_win

可以透過 -device 這個參數來做到只針對特定的鍵盤來更改鍵位,不會同時更 MacBook Air 本身的鍵盤和 USB 外接鍵盤。至於這個參數要接的 device id 則可以透過 xinput 這個指令來察看。而原先使用的 xmodmap 則貌似無法針對個別鍵盤來做設定。

但每次要從已經更改後的鍵位,換到另外一個更改鍵位的時候,不能直接使用指令切換,而是得先用 setxkbmap -option 來重置鍵位,然後才能再下另外一個指令來切換到另外一種鍵位,因為 setxkbmap 預設是會繼續新增 -option 到目前的設定,這也是為什麼我上面自己整理的兩個 script 的第一行都要先用 setxkbmap -option 的原因。如果不這樣做的話,可能會出現很奇怪的狀況,這點是要注意的。在 man setxkbmap 裡頭關於 -option 的說明部份也有提到這點:

setxkbmap-option


補充:xkbcomp

其實在 X Window 底下,除了使用 xmodmapsetxkbmap 兩個指令以外,還有一個 xkbcomp 指令可以使用,但因為我覺得這個指令還是沒有 setxkbmap 來得方便,所以後來沒有採用。xkbcomp 一樣可以透過 -i 來針對個別鍵盤做設定,而 device id 也是一樣透過 xinput 這個指令來察看。

有關於 xkbcomp 的設定:


補充:在無 X Window 的 virtual console 環境下切換鍵位

其實也有找到方法,在這篇文章有提到:EmacsWiki: Moving The Ctrl Key,可以使用 dumpkeysloadkeys 這兩個指令來辦到,但目前沒有強烈需求,如果哪天真的有在非 X Window 的環境下做到這件事不可的動機的話,應該就會花點時間來設定,看起來其實也是以下這樣的步驟,只是是在非 X Window 的環境下使用:

  1. dumpkeys 匯出鍵位設定檔
  2. 修改設定檔
  3. 再用 loadkeys 匯入鍵位設定檔

參考來源


如果覺得我的文章不錯的話,
請幫我按讚、追蹤、訂閱、留言、分享,
有任何問題也都歡迎留言討論,
也可以利用像是 Feedly 等 RSS Reader,
直接訂閱我的部落格:https://blog.m157q.tw
iThome 這邊我應該只有鐵人賽的時候會使用。


上一篇
[2018 iThome 鐵人賽] Day 12: Linux 上如何拿 iPhone 裡的資料
下一篇
[2018 iThome 鐵人賽] Day 14: Facebook 網址的一些黑魔法
系列文
M157q 的待業程式生活日誌31

尚未有邦友留言

立即登入留言