在 Fedora 上生成多個掃描碼的映射鍵
我擁有一台 MSI 筆記型電腦,它在 F 鍵上有一些特殊功能,例如,在 F4 鍵上切換觸摸板。
在 Windows 中,此鍵按預期工作:啟用/禁用觸摸板。但在 Linux (Fedora) 中它不起作用。
showkey -s
當我按下鍵時產生以下結果:0x1d 0xe0 0x5b 0x76 0x9d 0xe0 0xdb 0xf6
showkey
沒有參數會產生這個:keycode 28 release keycode 29 press keycode 125 press keycode 85 press keycode 29 release keycode 125 release keycode 85 release
我得到的幾乎一樣
xev
:KeyPress event, serial 28, synthetic NO, window 0x6200001, root 0x7e7, subw 0x0, time 1277257, (692,1239), root:(692,1314), state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False KeyPress event, serial 28, synthetic NO, window 0x6200001, root 0x7e7, subw 0x0, time 1277259, (692,1239), root:(692,1314), state 0x4, keycode 133 (keysym 0xffeb, Super_L), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False KeyPress event, serial 28, synthetic NO, window 0x6200001, root 0x7e7, subw 0x0, time 1277261, (692,1239), root:(692,1314), state 0x44, keycode 93 (keysym 0x0, NoSymbol), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False KeyRelease event, serial 28, synthetic NO, window 0x6200001, root 0x7e7, subw 0x0, time 1277262, (692,1239), root:(692,1314), state 0x44, keycode 37 (keysym 0xffe3, Control_L), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False KeyRelease event, serial 28, synthetic NO, window 0x6200001, root 0x7e7, subw 0x0, time 1277265, (692,1239), root:(692,1314), state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False KeyRelease event, serial 28, synthetic NO, window 0x6200001, root 0x7e7, subw 0x0, time 1277266, (692,1239), root:(692,1314), state 0x0, keycode 93 (keysym 0x0, NoSymbol), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False
總共 3 個 KeyPress 事件和 3 個 KeyRelease 事件。
並
xbindkeys --multikey
在一次 F4 按鍵上給出以下內容:"(Scheme function)" m:0x44 + c:37 Control+Mod4 + Control_L "(Scheme function)" m:0x40 + c:133 Mod4 + Super_L "(Scheme function)" m:0x0 + c:93 NoSymbol
我嘗試使用
xbindkeys
第一部分在 .xbindkeysrc 文件中重新映射我喜歡的密鑰:"xdotool key --clearmodifiers XF86TouchpadToggle" m:0x44 + c:37 + Release
但它沒有用。
請指出正確的方向/工具如何在 Fedora 上實現它。我的第一個候選人是
xchainkeys
,但它在受信任/融合儲存庫中不可用。有沒有其他方法可以用一長串掃描碼重新映射密鑰?
從定義涉及 Fn 鍵的鍵盤快捷鍵中,有一些見解可以回答這個問題:
在大多數係統上,無法檢測到
Fn
密鑰本身,但您可以嘗試使用:$ xev | grep --line-buffered keysym
找出什麼鍵
Fn-Left
並Fn-Right
發送。(grep
只是減少了噪音。)如果幸運的話,這些按鍵會將不重要的按鍵發送到機器,然後您可以重新映射。
例如,在我的系統上,
xev
顯示我的Fn-Left
按鍵實際上發送了一個XF86AudioPrev
事件:state 0x0, keycode 173 (keysym 0x1008ff16, XF86AudioPrev), same_screen YES,
我可以輕鬆地重新映射它以轉換為
Home
關鍵事件:$ xmodmap -e 'keysym XF86AudioPrev = Home'
希望您能夠對 End、PageUp 和 PageDown 執行相同的操作。
不幸的是,如果 xev 在您按下時沒有收到任何獨特的東西,
Fn-Left
那麼您就不走運了。
Fn
按鍵沒有像其他修飾鍵那樣直接發送,真是太可惜了。如果它們是,我們將有更多的能力通過軟體來配置它們的含義。
我在 msi p15 (a10sc) 筆記型電腦上遇到了完全相同的問題。
我製作了一個名為
toggleTouchpad.sh
映射到相同鍵組合的腳本,顯示xbindkeys --key
當我按下
F4
鍵並更改LeftCtrl
為因為按該順序( + + )RightCtrl
對我來說更自然Ctrl``Mod4``RightCtrl
- 劇本:
#!/usr/bin/bash touchpadId=$(xinput list | grep -o 'Touchpad.*id=[0-9]*' | awk 'NF{print $NF}' | sed 's/id=//') propId=$(xinput list-props $touchpadId | awk '/Device Enabled \([0-9]+\)/{print $3}' | sed 's/[():]//g') propVal=$(xinput list-props $touchpadId | awk '/Device Enabled \([0-9]+\)/{print $4}') if [ "$propVal" -eq "1" ]; then xinput set-prop $touchpadId $propId 0 else xinput set-prop $touchpadId $propId 1 fi
- 我的
.xbindkeysrc
"toggleTouchpad.sh" Control+Mod4 + Control_R
如果您使用該腳本,請確保它正確獲取了觸摸板 ID(我不是 bash 專家),我使用Arch Wiki來執行此操作。
顯然,您可以將腳本綁定到任何其他組合鍵。
筆記
- 這不能解決
F4
密鑰的問題,但在找到解決方案時可能很有用。Mod4
是Windows
關鍵