如何在启动时自动重新映射鼠标上的按钮?

我在周末挣扎于此,需要重新映射我的鼠标按钮。

我有一个带9个按钮的罗技鼠标,按下“中间按钮”(#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来确定要重映射的键。 按下要从中和从中映射的鼠标按钮,以获取其索引。 (作为参考,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 "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 

这里的第一行设置一个临时会话变量,该变量等于xinput报告的鼠标ID。 这是通过在xinput中报告报告中鼠标的已知名称,然后使用sed从报告中的id=xxx标记中提取ID号来完成的。 然后在xinput set-button-map指令中使用该值,该指令执行重新映射。 在上面的示例中,唯一的变化是按钮#9被重新映射到模拟按钮#2。 所有其他设置保持默认设置。

更新:正如@Lokasenna所指出的,如果您的设备将自身报告为鼠标和键盘,则可能需要使用-m 1限制grep的结果计数。

将鼠标按钮映射到任意函数

另见这个答案 。

您将需要为此任务安装xinputxbindkeysxautomation (包括xautomation )。

使用xinput listxinput test来发现鼠标的设备ID和要分配的按钮的编号。 在我的例子中,我想将底部按钮(#8)映射到双击左键(#1)。

创建或编辑~/.xbindkeysrc 。 此文件的格式是一系列成对的行。 第一行是要为事件执行的命令; 第二行是事件描述。 我们将使用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 = value来修改.xbindkeysrc文件(在此示例中为id = 9):

 "/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &" b:8 + Release 

简短的步骤是:

有一个名为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应用程序中,或者,如果您想从CLI中将其添加到文件中,请将文本放在下面(将路径更改为您的文件)in_ ~/.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通过一般方法完成启动运行。

我可以使用从Ubuntu软件中心下载的Easystroke手势识别function将Logitech鼠标中间按钮的映射更改为“返回”。 编辑:在应用程序中,您可以选择添加操作,为其命名,选择密钥类型,单击详细信息并按Enter,单击记录笔划,然后在提示期间按下中间按钮。

使用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的maximum-count参数, -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 

在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键鼠标工作得很好。 它也可以重新映射到击键和命令,配置比任何其他方法简单得多!