修改 Macbook 上的 Linux 修飾鍵功能及鍵盤佈局

早前在下在 Macbook 上安裝 Linux 操作上很快適應,唯獨使用 fn鍵 則比較麻煩
使用 Mac OS 當然可以到設定修改預設為 F1 至 F12 或 特殊功能鍵
但使用 Linux 預設定卻是 特殊功能鍵,比起 特殊功能鍵 ,在下還是比較常用 F1 至 F12
Apple鍵盤 與 一般的 105鍵盤 按鍵佈局有些微分別
但這些簡單的分別,對在下經常要輸入文字,編寫程式偶然會有對操作上的不習慣

Apple鍵盤 修飾鍵佈局

由於 Apple鍵盤 的空白鍵左邊的 修飾鍵(Modifier) 的佈局由左至右是:
  • Fn鍵 - 切換使用 F1 至 F12 及 特殊功能鍵
  • Control鍵 - 會變成 Ctrl鍵
  • Option鍵 - 會變成 Alt鍵
  • Command鍵 - 會變成 Super鍵

105鍵盤 修飾鍵佈局

而一般 105鍵盤 的佈局為:
  • Ctrl鍵
  • Fn鍵
  • Super鍵
  • Alt鍵

Fn鍵

/sys/module/hid_apple/parameters/fnmode 來處理 Fn鍵 的預設值
  • 0 - 取消 Fn鍵 的功能,即是例如按下 Fn鍵 + F1 ,仍然只是 F1 功能
  • 1 - 預設使用 Fn鍵 的功能,例如按下 F1 會變成 Fn鍵 + F1 的功能 (Magic Keyboard 佈局)
  • 2 - 預設不使用 Fn鍵 的功能,例如按下 F1 就是 F1 的功能 (105鍵盤 佈局)
可以 Terminal 輸入
sudo bash -c "echo -n 2 >'/sys/module/hid_apple/parameters/fnmode'"
改變設定

互換按鍵

互換 Fn鍵 及 左Control鍵
/sys/module/hid_apple/parameters/swap_fn_leftctrl 來互換 Fn鍵 及 左Control鍵 的位置
  • 0 - 左為 Fn鍵 ,右為 左Control鍵 (Magic Keyboard 佈局)
  • 1 - 左為 左Control鍵 ,右為 Fn鍵 (105鍵盤 佈局)
可以 Terminal 輸入
sudo bash -c "echo -n 1 >'/sys/module/hid_apple/parameters/swap_fn_leftctrl'"
改變設定

互換 Option鍵 及 Command鍵
/sys/module/hid_apple/parameters/swap_opt_cmd 來互換 Option鍵 及 Command鍵 的位置
  • 0 - 左為 Option鍵 ,右為 Command鍵 (Magic Keyboard 佈局)
  • 1 - 左為 Command鍵 ,右為 Option鍵 (105鍵盤 佈局)
可以 Terminal 輸入
sudo bash -c "echo -n 1 >'/sys/module/hid_apple/parameters/swap_opt_cmd'"
改變設定

以上操作最大的好處是即時生效
但這些設定只會保存在當前的起動狀態,當重新開機後便會復原,每次開機都修改設定並不是有效率的操作
若果需要長期保存新設定,需要加入設定檔到 /etc/modprobe.d/

更新 initramfs

見下文
系統未必有建立 hid_apple 的起動設定,因此要自行建立檔案
hid_apple 的設定檔不一定使用 hid_apple.conf ,只是方便了解檔案用途
設定檔寫入
options hid_apple fnmode=2
options hid_apple swap_fn_leftctrl=1
options hid_apple swap_opt_cmd=1

見下文
建立設定檔後,更新 initramfs ,在 Terminal 輸入
sudo update-initramfs -u
重新開機後,鍵盤佈局便會以新設定起動

自訂鍵盤佈局

除了修飾鍵的佈局 Macbook 亦缺少了 105鍵盤 的 Delete鍵
在下經常要編寫程式,缺少了 Delete鍵 其實非常影響編寫效率,因此在下將一個不常使用的按鍵取代為 Delete鍵
見下文
先在 Terminal 輸入
xmodmap -pke
會顯示所有鍵盤佈局

見下文
但要了解鍵盤佈局前,還要了解鍵盤按鍵及組合鍵的對照,輸入
xmodmap
資料顯示鍵盤按鍵及不同組合鍵的對照,例如在下的 Macbook 上的 Linux
  1. Shift
  2. Caps Lock
  3. Control
  4. Alt
  5. Num Lock
  6. Super
  7. Alt Gr
共有 7種組合鍵

以下是在下的 Macbook 上的 Linux 的鍵盤佈局
跳至表格後
keycode原鍵組合鍵
ShiftCaps LockControlAltNum LockSuperAlt Gr
8
9EscapeEscape
101exclam1exclam
112at2at
123numbersign3numbersign
134dollar4dollar
145percent5percent
156asciicircum6asciicircum
167ampersand7ampersand
178asterisk8asterisk
189parenleft9parenleft
190parenright0parenright
20minusunderscoreminusunderscore
21equalplusequalplus
22BackSpaceBackSpaceBackSpaceBackSpaceTerminate_Server
23TabISO_Left_TabTabISO_Left_Tab
24qQqQ
25wWwW
26eEeE
27rRrR
28tTtT
29yYyY
30uUuU
31iIiI
32oOoO
33pPpP
34bracketleftbraceleftbracketleftbraceleft
35bracketrightbracerightbracketrightbraceright
36ReturnReturn
37Control_LControl_L
38aAaA
39sSsS
40dDdD
41fFfF
42gGgG
43hHhH
44jJjJ
45kKkK
46lLlL
47semicoloncolonsemicoloncolon
48apostrophequotedblapostrophequotedbl
49graveasciitildegraveasciitilde
50Shift_LShift_L
51backslashbarbackslashbar
52zZzZ
53xXxX
54cCcC
55vVvV
56bBbB
57nNnN
58mMmM
59commalesscommaless
60periodgreaterperiodgreater
61slashquestionslashquestion
62Shift_RShift_R
63KP_MultiplyKP_MultiplyKP_MultiplyKP_MultiplyKP_MultiplyKP_MultiplyXF86ClearGrab
64Alt_LMeta_LAlt_LMeta_L
65spacespace
66Caps_LockCaps_Lock
67F1F1F1F1F1F1XF86Switch_VT_1
68F2F2F2F2F2F2XF86Switch_VT_2
69F3F3F3F3F3F3XF86Switch_VT_3
70F4F4F4F4F4F4XF86Switch_VT_4
71F5F5F5F5F5F5XF86Switch_VT_5
72F6F6F6F6F6F6XF86Switch_VT_6
73F7F7F7F7F7F7XF86Switch_VT_7
74F8F8F8F8F8F8XF86Switch_VT_8
75F9F9F9F9F9F9XF86Switch_VT_9
76F10F10F10F10F10F10XF86Switch_VT_10
77Num_LockNum_Lock
78Scroll_LockScroll_Lock
79KP_HomeKP_7KP_HomeKP_7
80KP_UpKP_8KP_UpKP_8
81KP_PriorKP_9KP_PriorKP_9
82KP_SubtractKP_SubtractKP_SubtractKP_SubtractKP_SubtractKP_SubtractXF86Prev_VMode
83KP_LeftKP_4KP_LeftKP_4
84KP_BeginKP_5KP_BeginKP_5
85KP_RightKP_6KP_RightKP_6
86KP_AddKP_AddKP_AddKP_AddKP_AddKP_AddXF86Next_VMode
87KP_EndKP_1KP_EndKP_1
88KP_DownKP_2KP_DownKP_2
89KP_NextKP_3KP_NextKP_3
90KP_InsertKP_0KP_InsertKP_0
91KP_DeleteKP_DecimalKP_DeleteKP_Decimal
92ISO_Level3_ShiftISO_Level3_Shift
93
94lessgreaterlessgreaterbarbrokenbarbar
95F11F11F11F11F11F11XF86Switch_VT_11
96F12F12F12F12F12F12XF86Switch_VT_12
97
98KatakanaKatakana
99HiraganaHiragana
100Henkan_ModeHenkan_Mode
101Hiragana_KatakanaHiragana_Katakana
102MuhenkanMuhenkan
103
104KP_EnterKP_Enter
105Control_RControl_R
106KP_DivideKP_DivideKP_DivideKP_DivideKP_DivideKP_DivideXF86Ungrab
107PrintSys_ReqPrintSys_Req
108Alt_RMeta_RAlt_RMeta_R
109LinefeedLinefeed
110HomeHome
111UpUp
112PriorPrior
113LeftLeft
114RightRight
115EndEnd
116DownDown
117NextNext
118InsertInsert
119DeleteDelete
120
121XF86AudioMuteXF86AudioMute
122XF86AudioLowerVolumeXF86AudioLowerVolume
123XF86AudioRaiseVolumeXF86AudioRaiseVolume
124XF86PowerOffXF86PowerOff
125KP_EqualKP_Equal
126plusminusplusminus
127PauseBreakPauseBreak
128XF86LaunchAXF86LaunchA
129KP_DecimalKP_DecimalKP_DecimalKP_Decimal
130HangulHangul
131Hangul_HanjaHangul_Hanja
132
133Super_LSuper_L
134Super_RSuper_R
135MenuMenu
136CancelCancel
137RedoRedo
138SunPropsSunProps
139UndoUndo
140SunFrontSunFront
141XF86CopyXF86Copy
142XF86OpenXF86Open
143XF86PasteXF86Paste
144FindFind
145XF86CutXF86Cut
146HelpHelp
147XF86MenuKBXF86MenuKB
148XF86CalculatorXF86Calculator
149
150XF86SleepXF86Sleep
151XF86WakeUpXF86WakeUp
152XF86ExplorerXF86Explorer
153XF86SendXF86Send
154
155XF86XferXF86Xfer
156XF86Launch1XF86Launch1
157XF86Launch2XF86Launch2
158XF86WWWXF86WWW
159XF86DOSXF86DOS
160XF86ScreenSaverXF86ScreenSaver
161XF86RotateWindowsXF86RotateWindows
162XF86TaskPaneXF86TaskPane
163XF86MailXF86Mail
164XF86FavoritesXF86Favorites
165XF86MyComputerXF86MyComputer
166XF86BackXF86Back
167XF86ForwardXF86Forward
168
169XF86EjectXF86Eject
170XF86EjectXF86EjectXF86EjectXF86Eject
171XF86AudioNextXF86AudioNext
172XF86AudioPlayXF86AudioPauseXF86AudioPlayXF86AudioPause
173XF86AudioPrevXF86AudioPrev
174XF86AudioStopXF86EjectXF86AudioStopXF86Eject
175XF86AudioRecordXF86AudioRecord
176XF86AudioRewindXF86AudioRewind
177XF86PhoneXF86Phone
178
179XF86ToolsXF86Tools
180XF86HomePageXF86HomePage
181XF86ReloadXF86Reload
182XF86CloseXF86Close
183
184
185XF86ScrollUpXF86ScrollUp
186XF86ScrollDownXF86ScrollDown
187parenleftparenleft
188parenrightparenright
189XF86NewXF86New
190RedoRedo
191XF86ToolsXF86Tools
192XF86Launch5XF86Launch5
193XF86Launch6XF86Launch6
194XF86Launch7XF86Launch7
195XF86Launch8XF86Launch8
196XF86Launch9XF86Launch9
197
198XF86AudioMicMuteXF86AudioMicMute
199XF86TouchpadToggleXF86TouchpadToggle
200XF86TouchpadOnXF86TouchpadOn
201XF86TouchpadOffXF86TouchpadOff
202
203Mode_switchMode_switch
204Alt_LAlt_L
205Meta_LMeta_L
206Super_LSuper_L
207Hyper_LHyper_L
208XF86AudioPlayXF86AudioPlay
209XF86AudioPauseXF86AudioPause
210XF86Launch3XF86Launch3
211XF86Launch4XF86Launch4
212XF86LaunchBXF86LaunchB
213XF86SuspendXF86Suspend
214XF86CloseXF86Close
215XF86AudioPlayXF86AudioPlay
216XF86AudioForwardXF86AudioForward
217
218PrintPrint
219
220XF86WebCamXF86WebCam
221XF86AudioPresetXF86AudioPreset
222
223XF86MailXF86Mail
224XF86MessengerXF86Messenger
225XF86SearchXF86Search
226XF86GoXF86Go
227XF86FinanceXF86Finance
228XF86GameXF86Game
229XF86ShopXF86Shop
230
231CancelCancel
232XF86MonBrightnessDownXF86MonBrightnessDown
233XF86MonBrightnessUpXF86MonBrightnessUp
234XF86AudioMediaXF86AudioMedia
235XF86DisplayXF86Display
236XF86KbdLightOnOffXF86KbdLightOnOff
237XF86KbdBrightnessDownXF86KbdBrightnessDown
238XF86KbdBrightnessUpXF86KbdBrightnessUp
239XF86SendXF86Send
240XF86ReplyXF86Reply
241XF86MailForwardXF86MailForward
242XF86SaveXF86Save
243XF86DocumentsXF86Documents
244XF86BatteryXF86Battery
245XF86BluetoothXF86Bluetooth
246XF86WLANXF86WLAN
247
248
249
250
251XF86MonBrightnessCycleXF86MonBrightnessCycle
252
253
254XF86WWANXF86WWAN
255XF86RFKillXF86RFKill
閣下可能會發現,在下的列表沒有 NoSymbol
NoSymbol 意思即是該輸入沒有效果,因此在下沒有列出,以免混亂
另外,這些鍵盤佈局稱為 keysym 即是 Key Symbol ,必須大小寫相符才能生效

見下文
假設在下認為 F12 並不是經常使用的按鍵,輸入
xmodmap -pke | grep "F12"
以在下為例子,顯示 F12 的 keycode 為 96 後,輸入
xmodmap -e "keycode 96 = Delete"
便會將 F12鍵 修改為 Delete ,而且立即生效

使用 .bashrc
見下文
同樣這種修改只是暫時性,當重新開機便會還原
不過重新配置鍵盤佈局,屬於使用者的設定,只需要修改 ${HOME}/.bashrc
xmodmap -e "keycode 96 = Delete" 加入到 ${HOME}/.bashrc 便可以在下次登入時生效

使用 啟動
見下文
有時 .bashrc 需要先開啟動 Terminal 才能產生效果,便顯示有點贅聚
可以改用 系統 > 偏好設定 > 個人 > 啟動應用程式 來處理

見下文
初始啟動程式 分頁,按 加入

見下文
名稱 註解 不需要完全指定內容
指令 輸入有效的指令
有時新加入的指令未能在起動後立即啟動,可以在 延遲 設定延遲時間
(在下需要 延遲1秒)

見下文
加入啟動應用程式後,可以重新啟動測試

總結

由於 Mac OS 的鍵盤佈局與 Linux, Windows 等不同,最初使用時都需要一段時間適應
查資料時發現可以很簡單地將鍵盤重新佈局,因此便設定為一般 105鍵盤 的佈局
其實兩者的佈局在下已經可以隨時切換,已經不需要時間熟習,反而要在 Macbook 重新熟習一般 105鍵盤 又要時間

參考資料