这个答案显示交换鼠标主按钮和辅助按钮的命令行。但是,我希望有一个脚本在每次执行时自动交换鼠标按钮。有人可以提示我如何执行此操作,我对 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
您的实际状态可能不会反映文件的内容,例如重新启动后,因此将新状态打印到屏幕上以进行视觉提醒。如果文件与状态不同步,只需调用一次脚本即可再次同步。