2024-06-20

修改 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 原鍵 組合鍵
Shift Caps Lock Control Alt Num Lock Super Alt Gr
8
9 Escape Escape
10 1 exclam 1 exclam
11 2 at 2 at
12 3 numbersign 3 numbersign
13 4 dollar 4 dollar
14 5 percent 5 percent
15 6 asciicircum 6 asciicircum
16 7 ampersand 7 ampersand
17 8 asterisk 8 asterisk
18 9 parenleft 9 parenleft
19 0 parenright 0 parenright
20 minus underscore minus underscore
21 equal plus equal plus
22 BackSpace BackSpace BackSpace BackSpace Terminate_Server
23 Tab ISO_Left_Tab Tab ISO_Left_Tab
24 q Q q Q
25 w W w W
26 e E e E
27 r R r R
28 t T t T
29 y Y y Y
30 u U u U
31 i I i I
32 o O o O
33 p P p P
34 bracketleft braceleft bracketleft braceleft
35 bracketright braceright bracketright braceright
36 Return Return
37 Control_L Control_L
38 a A a A
39 s S s S
40 d D d D
41 f F f F
42 g G g G
43 h H h H
44 j J j J
45 k K k K
46 l L l L
47 semicolon colon semicolon colon
48 apostrophe quotedbl apostrophe quotedbl
49 grave asciitilde grave asciitilde
50 Shift_L Shift_L
51 backslash bar backslash bar
52 z Z z Z
53 x X x X
54 c C c C
55 v V v V
56 b B b B
57 n N n N
58 m M m M
59 comma less comma less
60 period greater period greater
61 slash question slash question
62 Shift_R Shift_R
63 KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply XF86ClearGrab
64 Alt_L Meta_L Alt_L Meta_L
65 space space
66 Caps_Lock Caps_Lock
67 F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
68 F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
69 F3 F3 F3 F3 F3 F3 XF86Switch_VT_3
70 F4 F4 F4 F4 F4 F4 XF86Switch_VT_4
71 F5 F5 F5 F5 F5 F5 XF86Switch_VT_5
72 F6 F6 F6 F6 F6 F6 XF86Switch_VT_6
73 F7 F7 F7 F7 F7 F7 XF86Switch_VT_7
74 F8 F8 F8 F8 F8 F8 XF86Switch_VT_8
75 F9 F9 F9 F9 F9 F9 XF86Switch_VT_9
76 F10 F10 F10 F10 F10 F10 XF86Switch_VT_10
77 Num_Lock Num_Lock
78 Scroll_Lock Scroll_Lock
79 KP_Home KP_7 KP_Home KP_7
80 KP_Up KP_8 KP_Up KP_8
81 KP_Prior KP_9 KP_Prior KP_9
82 KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract XF86Prev_VMode
83 KP_Left KP_4 KP_Left KP_4
84 KP_Begin KP_5 KP_Begin KP_5
85 KP_Right KP_6 KP_Right KP_6
86 KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add XF86Next_VMode
87 KP_End KP_1 KP_End KP_1
88 KP_Down KP_2 KP_Down KP_2
89 KP_Next KP_3 KP_Next KP_3
90 KP_Insert KP_0 KP_Insert KP_0
91 KP_Delete KP_Decimal KP_Delete KP_Decimal
92 ISO_Level3_Shift ISO_Level3_Shift
93
94 less greater less greater bar brokenbar bar
95 F11 F11 F11 F11 F11 F11 XF86Switch_VT_11
96 F12 F12 F12 F12 F12 F12 XF86Switch_VT_12
97
98 Katakana Katakana
99 Hiragana Hiragana
100 Henkan_Mode Henkan_Mode
101 Hiragana_Katakana Hiragana_Katakana
102 Muhenkan Muhenkan
103
104 KP_Enter KP_Enter
105 Control_R Control_R
106 KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide XF86Ungrab
107 Print Sys_Req Print Sys_Req
108 Alt_R Meta_R Alt_R Meta_R
109 Linefeed Linefeed
110 Home Home
111 Up Up
112 Prior Prior
113 Left Left
114 Right Right
115 End End
116 Down Down
117 Next Next
118 Insert Insert
119 Delete Delete
120
121 XF86AudioMute XF86AudioMute
122 XF86AudioLowerVolume XF86AudioLowerVolume
123 XF86AudioRaiseVolume XF86AudioRaiseVolume
124 XF86PowerOff XF86PowerOff
125 KP_Equal KP_Equal
126 plusminus plusminus
127 Pause Break Pause Break
128 XF86LaunchA XF86LaunchA
129 KP_Decimal KP_Decimal KP_Decimal KP_Decimal
130 Hangul Hangul
131 Hangul_Hanja Hangul_Hanja
132
133 Super_L Super_L
134 Super_R Super_R
135 Menu Menu
136 Cancel Cancel
137 Redo Redo
138 SunProps SunProps
139 Undo Undo
140 SunFront SunFront
141 XF86Copy XF86Copy
142 XF86Open XF86Open
143 XF86Paste XF86Paste
144 Find Find
145 XF86Cut XF86Cut
146 Help Help
147 XF86MenuKB XF86MenuKB
148 XF86Calculator XF86Calculator
149
150 XF86Sleep XF86Sleep
151 XF86WakeUp XF86WakeUp
152 XF86Explorer XF86Explorer
153 XF86Send XF86Send
154
155 XF86Xfer XF86Xfer
156 XF86Launch1 XF86Launch1
157 XF86Launch2 XF86Launch2
158 XF86WWW XF86WWW
159 XF86DOS XF86DOS
160 XF86ScreenSaver XF86ScreenSaver
161 XF86RotateWindows XF86RotateWindows
162 XF86TaskPane XF86TaskPane
163 XF86Mail XF86Mail
164 XF86Favorites XF86Favorites
165 XF86MyComputer XF86MyComputer
166 XF86Back XF86Back
167 XF86Forward XF86Forward
168
169 XF86Eject XF86Eject
170 XF86Eject XF86Eject XF86Eject XF86Eject
171 XF86AudioNext XF86AudioNext
172 XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause
173 XF86AudioPrev XF86AudioPrev
174 XF86AudioStop XF86Eject XF86AudioStop XF86Eject
175 XF86AudioRecord XF86AudioRecord
176 XF86AudioRewind XF86AudioRewind
177 XF86Phone XF86Phone
178
179 XF86Tools XF86Tools
180 XF86HomePage XF86HomePage
181 XF86Reload XF86Reload
182 XF86Close XF86Close
183
184
185 XF86ScrollUp XF86ScrollUp
186 XF86ScrollDown XF86ScrollDown
187 parenleft parenleft
188 parenright parenright
189 XF86New XF86New
190 Redo Redo
191 XF86Tools XF86Tools
192 XF86Launch5 XF86Launch5
193 XF86Launch6 XF86Launch6
194 XF86Launch7 XF86Launch7
195 XF86Launch8 XF86Launch8
196 XF86Launch9 XF86Launch9
197
198 XF86AudioMicMute XF86AudioMicMute
199 XF86TouchpadToggle XF86TouchpadToggle
200 XF86TouchpadOn XF86TouchpadOn
201 XF86TouchpadOff XF86TouchpadOff
202
203 Mode_switch Mode_switch
204 Alt_L Alt_L
205 Meta_L Meta_L
206 Super_L Super_L
207 Hyper_L Hyper_L
208 XF86AudioPlay XF86AudioPlay
209 XF86AudioPause XF86AudioPause
210 XF86Launch3 XF86Launch3
211 XF86Launch4 XF86Launch4
212 XF86LaunchB XF86LaunchB
213 XF86Suspend XF86Suspend
214 XF86Close XF86Close
215 XF86AudioPlay XF86AudioPlay
216 XF86AudioForward XF86AudioForward
217
218 Print Print
219
220 XF86WebCam XF86WebCam
221 XF86AudioPreset XF86AudioPreset
222
223 XF86Mail XF86Mail
224 XF86Messenger XF86Messenger
225 XF86Search XF86Search
226 XF86Go XF86Go
227 XF86Finance XF86Finance
228 XF86Game XF86Game
229 XF86Shop XF86Shop
230
231 Cancel Cancel
232 XF86MonBrightnessDown XF86MonBrightnessDown
233 XF86MonBrightnessUp XF86MonBrightnessUp
234 XF86AudioMedia XF86AudioMedia
235 XF86Display XF86Display
236 XF86KbdLightOnOff XF86KbdLightOnOff
237 XF86KbdBrightnessDown XF86KbdBrightnessDown
238 XF86KbdBrightnessUp XF86KbdBrightnessUp
239 XF86Send XF86Send
240 XF86Reply XF86Reply
241 XF86MailForward XF86MailForward
242 XF86Save XF86Save
243 XF86Documents XF86Documents
244 XF86Battery XF86Battery
245 XF86Bluetooth XF86Bluetooth
246 XF86WLAN XF86WLAN
247
248
249
250
251 XF86MonBrightnessCycle XF86MonBrightnessCycle
252
253
254 XF86WWAN XF86WWAN
255 XF86RFKill XF86RFKill
閣下可能會發現,在下的列表沒有 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鍵盤 又要時間

參考資料

沒有留言 :

張貼留言