這個答案顯示交換滑鼠主按鈕和輔助按鈕的命令列。但是,我希望有一個腳本在每次執行時自動交換滑鼠按鈕。有人可以提示我如何執行此操作,我對 bash 腳本幾乎一無所知。
答案1
xinput list
不提供on的輸出你的系統中,沒有人可以提供您可以直接使用的答案。這是因為xinput
可以顯示與所示不同的設備如何從終端將滑鼠按鈕切換為左手按鈕?。
例如,以下是 OSX 上的輸出:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ xquartz virtual pointer id=6 [slave pointer (2)]
⎜ ↳ pen id=8 [slave pointer (2)]
⎜ ↳ cursor id=9 [slave pointer (2)]
⎜ ↳ eraser id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ xquartz virtual keyboard id=7 [slave keyboard (3)]
這是我的 Debian/testing 上的輸出:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ VMware VMware Virtual USB Mouse id=7 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=9 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=8 [slave keyboard (3)]
因此,在一個系統上,可能有一個 id 可供選擇(xquartz 虛擬指標),而在另一個系統上則有三種可能性。如果你仔細閱讀這些內容,你會發現這裡引用的例子並不是做作的:
鑑於變化(和模糊的文檔xinput
),您可能無法自動化取得滑鼠裝置 ID 的部分。
假設您確實選擇了一個可用的標識符,並且為了討論起見,將其稱為“12”。腳本可以讀取輸出
xinput get-button-map 12
到一個數組中。有些腳本語言提供數組,例如bash
.但也有幾個陷阱:
- 在我的 OSX 系統上,返回清單“1 2 3”,而在 Debian 系統上返回清單“1 2 3 4 5 6 7 8 9 10 11 12”。
- 你必須猜測額外的按鈕是否意味著什麼,並且
- 甚至三個按鈕編號的分配也可能不是明顯的左/中/右。
然後,切換按鍵的腳本必須將其狀態保存在某個地方,例如主目錄中的檔案。一個管理腳本必須
- 使用當前按鈕初始化文件
- 根據您的切換按鈕方案更新它(3 個按鈕有「3!」可能的安排)
假設您有最簡單的配置(和解釋),您可以在腳本中執行以下操作:
#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
mode=reverse
else
mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id
此腳本接受一個參數(滑鼠裝置的識別碼)。對於給定的範例(並將腳本命名為“toggle-buttons”,使其可執行並將其放入您的$PATH
):
toggle-buttons 12
應該做這項工作。
答案2
我將添加我自己的解決方案,因為其他答案有時對於交換滑鼠主按鈕(1 和 3)的簡單任務來說似乎過於複雜。
#!/bin/bash
set -e
# To get the name of a devices, do "xinput list --name-only"
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"
current_button_map=$(xinput get-button-map "$DEVICE_NAME")
if [[ $current_button_map =~ "1 2 3" ]]; then
echo "Making the mouse a lefty"
xinput set-button-map "$DEVICE_NAME" 3 2 1
else
echo "Making the mouse a righty"
xinput set-button-map "$DEVICE_NAME" 1 2 3
fi
答案3
我會做類似的事情:
#!/bin/sh
mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap
這假設您知道滑鼠的“名稱”(在我的例子中是Razer
)並且您知道您獲得的預設按鈕映射(即哪些按鈕在左側和右側,以便您可以交換它們)xinput list $mxid
:
Button labels: "Button Left" "Button Middle" "Button Right"....
和xinput get-button-map $mxid
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
正如您所看到的,在我的例子中1 =>> left
,3 =>> right
上面的腳本只是讀取當前映射並交換第一個和第三個值,然後設定新的映射。
答案4
如果您需要切換裝置的狀態(並且反轉/取消反轉滑鼠鍵的順序就是這樣的狀態),您要么必須能夠查詢裝置的當前狀態,要么將狀態保留在某個檔案中。
由於我找不到是否xinput
有辦法向滑鼠詢問按鈕映射,因此您可能應該將狀態存儲在文件中,例如~/.config/mousebuttons
.您的腳本在執行時應向檔案寫入「reverse」:
xinput set-button-map 12 3 2 1 並在執行時將「正常」寫入該檔案:
xinput set-button-map 12 2 3 實際執行的操作取決於讀取檔案:如果腳本啟動時檔案內容為normal
(或檔案不存在),則執行第一步,如果內容為,則執行第二步是reverse
。
每次呼叫時文件內容都會翻轉reverse
。normal
您的實際狀態可能不會反映文件的內容,例如重新啟動後,因此將新狀態列印到螢幕上以進行視覺提醒。如果檔案與狀態不同步,只需呼叫一次腳本即可再次同步。