我周末一直在努力解决这个问题,需要重新映射我的鼠标按钮。
答案1
我有一个带有 9 个按钮的 Logitech 鼠标,按下“中间按钮”(#2)需要点击滚轮。我不喜欢这样,因为我很笨拙,当我尝试点击滚轮时,通常会滚动我所在的窗口。所以我想自动将顶部按钮(在本例中为 #9)重新映射到中间按钮(#2)。我还想映射底部按钮(#8),以便它执行双击左键(#1)。
虽然我的目的很具体,但下面的解决方案可以推广到您想要在启动时自动重新映射鼠标按钮的任何情况。
将鼠标按钮映射到其他鼠标按钮
你会需要xinput
为完成此任务而安装。这完全可以在您的.xsessionrc
文件。首先,使用它xinput
来发现分配给鼠标的名称,然后将其与输入设备 ID 关联。以下是我的笔记本电脑的一些示例输出:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Laser Mouse id=11 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
我的鼠标调用自身Logitech USB Laser Mouse
并显示为id=11
。您的鼠标将具有不同的名称;弄清楚这一点留给读者作为练习。
虽然您仍然知道设备的 ID,这会话中,通过使用以下方法找出输入处理程序认为你的鼠标有多少个按钮xinput list
deviceID
。这可能与设备上显示的按钮数量不同。
Logitech USB Laser Mouse id=11 [slave pointer (2)]
Reporting 7 classes:
Class originated from: 11. Type: XIButtonClass
Buttons supported: 16
Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
我的鼠标只有 9 个明显的物理按钮,但xinput
报告有 16 个。
鉴于 USB 的特性,此 ID 每次重新启动时都会发生变化,因此仅编写静态地键入您一次发现的 ID 的脚本是不够的。您必须在启动时动态解析它并根据当前 ID 执行重新映射。
现在您知道了它的名字,您可以使用xinput test
deviceID
找出要重新映射的键。按下要映射的鼠标按钮,以获取它们的索引。(作为参考,1、2 和 3“始终”(即通常)指的是 3 键鼠标的左键、中键和右键。常见的重新映射会反转这些按钮,使鼠标成为左手鼠标。)
button press 2
button release 2
button press 9
button release 9
在这种情况下,我发现我想将按钮#9(侧面,顶部)映射到按钮#2(中间)。
现在您知道了鼠标的名称以及要更改哪些按钮,您可以编写一个~/.xsessionrc
脚本,xinput
在启动时调用该脚本来执行按钮重新映射。下面是我的完整脚本。
# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep -m 1 "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
此处的第一行设置了一个临时会话变量,该变量等于 报告的鼠标 ID xinput
。这是通过grep
为 报告中的鼠标已知名称进行设置xinput
,然后使用sed
从报告中的该标记中提取 ID 号来完成的id=xxx
。然后,此值用于xinput set-button-map
执行重新映射的指令中。在上面的示例中,唯一的变化是按钮 #9 被重新映射以模仿按钮 #2。所有其他按钮均保留其默认设置。
更新:正如@Lokasenna 指出的那样以下,如果您的设备将自己报告为鼠标和键盘,则可能需要限制grep
使用的结果数-m 1
。如果鼠标没有报告本身为两者,因此它已包含在脚本中。
将鼠标按钮映射到任意功能
也可以看看这个答案。
你会需要xinput
,xbindkeys
, 和xautomation
(包括xte
) 为此任务安装。
使用xinput list
和xinput test
来查找鼠标的设备 ID 和要分配的按钮编号。就我而言,我想将底部按钮 (#8) 映射到双击左键 (#1)。
创建或编辑~/.xbindkeysrc
。该文件的格式是一系列成对的行。第一行是针对事件执行的命令;第二行是事件描述。我们将使用 的组件xte
将xautomation
事件直接发送到输入处理程序。
为了在释放按钮时创建双击事件,我添加了以下内容:
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
此配置将鼠标单击按钮 #1 两次的序列映射到释放按钮 #8。(理论上,我猜你可以映射任何命令到鼠标按钮,但这是最常见的情况。请参阅这个答案请参阅其他实际示例。
针对 16.04 Ubuntu 的更新
对于系统上连接了多个鼠标的用户,您还需要传入设备的 ID。这可能不适用于所有用户,并且是在使用 Unity 的 Ubuntu 16.04 上发现的。
xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Kensington Kensington Expert Mouse id=9 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=13 [slave pointer (2)]
⎜ ↳ TPPS/2 IBM TrackPoint id=14 [slave pointer (2)]
然后通过引用命令输出中的 id= 值来修改 .xbindkeysrc 文件(此示例中为 id=9):
"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
答案2
简要步骤如下:
有一个名为 的实用程序xinput
。xinput list
或者xinput
只会显示所有 X 输入设备及其 ID。在这里您可以找到要重新映射的鼠标的 ID。
我将使用我的 ID 作为示例,从我的设置来看,它是 21,然后xinput --get-button-map 21
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
现在,如果你想交换左右按钮,只需运行
xinput --set-button-map 21 3 2 1
到这里,重新映射已经完成。
要在启动时运行它,只需将其放入文件中:
echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh
赋予它可执行权限
chmod +x leftmouseremap.sh
最后,从 GUI 手动将其添加到 Statrtup Application,或者,如果您希望从 CLI 添加到 Statrtup Application,请将下面的文本(将路径更改为您的路径)放入您的文件中~/.config/autostart
,这是我的(less .config/autostart/leftmouseremap.sh.desktop
):
[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=
请记住,对于 KDE,路径将类似于~/.kde/Autosart
,对于其他桌面管理器,路径可能略有不同。或者,可以使用 以常规方法完成启动运行/etc/rc.local
。
答案3
使用时zerobandwidth 的精彩回答,某些设备(例如 Logitech 的 MX Ergo)会同时显示为指针和一个键盘设备:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech MX Ergo id=10 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=14 [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)]
...
↳ Logitech MX Ergo id=15 [slave keyboard (3)]
因此,grep "Logitech MX Ergo"
最终返回两个值。后者最终被包含在映射字符串中作为第一个项目,并搞砸了所有鼠标按钮。
修复很简单 - 只需使用的grep
最大计数参数-m 1
:
my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
答案4
在 12.04 之前,标准存储库中有一个名为“btnx”的简单图形工具,它作为“按钮属性”添加到系统配置中。但遗憾的是它被删除了。目前为 14.04、16.04 和 18.04 维护的“不受信任”PPA 如下:https://launchpad.net/~oliverstar/+archive/ubuntu/ppa(发现于https://launchpad.net/ubuntu/xenial/+source/btnx)
它不会与系统设置集成,但在我的笔记本电脑上使用便宜的 5 键鼠标时效果很好。它还可以重新映射到按键和命令,并且配置比任何其他方法都简单得多!