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


Answers:


47

我有一个带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它找出要重新映射的键。按下要从其映射到的鼠标按钮,以获取其索引。(作为参考,1、2和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

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

更新: @Lokasenna在下面指出,如果您的设备将自己报告为鼠标和键盘,则可能需要限制grepusing 的结果数-m 1

将鼠标按钮映射到任意功能

另请参阅此答案

你需要xinputxbindkeysxautomation(包括xte)安装了这个任务。

使用xinput listxinput test查找鼠标的设备ID和要分配的按钮编号。就我而言,我想将底部按钮(#8)映射到左按钮(#1)的双击。

创建或编辑~/.xbindkeysrc。该文件的格式是一系列成对的行。第一行是要为事件执行的命令;第二行是事件描述。我们将使用的xte组件xautomation将事件直接发送到输入处理程序。

为了在释放按钮时创建双击事件,我添加了以下内容:

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

此配置将两次在按钮#1上的鼠标单击序列映射到按钮#8的释放。(理论上我想您可以将任何命令映射到鼠标按钮,但这是最常见的情况。有关其他实际示例,请参见此答案。)

Ubuntu 16.04的更新

对于将多个鼠标连接到系统的用户,您还需要输入设备的ID。这可能并不适用于所有用户,并且是在Ubuntu 16.04和Unity上发现的。

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 =值(在本示例中为id = 9)来修改.xbindkeysrc文件:

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

7
感谢您的信息。您的awk看起来需要根据设备中的单词数进行更改。我用过sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112 '23

根据xinput测试,拇指键会触发三种不同的按键-如何在.xbindkeysrc中将它们全部绑定在一起?
axltop

@ jbo5112我刚刚开始在工作笔记本电脑上使用多只鼠标,并且有充分的理由重新审视您的评论。现在awksed在示例中,我用您的陈述替换了旧的陈述。感谢您的改进!
零带宽,

2
无需在set-button-map中使用id;例如:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin

我猜xinput是异常的问题:确实两次显示鼠标,如下所示:↳USB OPTICAL MOUSE id = 12 [从属指针(2)]↳USB OPTICAL MOUSE id = 13 [从属指针(2)]只有ID 13才能捕获带有的命令xinput test。该脚本将始终捕获第一个ID。但是为什么还是两次呢?当我断开此鼠标的连接时,两者都会消失,而在连接时会重新出现。
w天空

6

简短的步骤是:

有一个名为的实用程序xinputxinput 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


这解决了我的漏水问题。我在笔记本电脑触摸板下方有左/右键单击按钮。我洒了水,现在两个按钮都向操作系统发送了一个中键单击信号(我是使用“ keymon”应用程序发现的)。我使用您的方法将中键单击重新映射为左键单击,因此至少可以享受左键单击的体验。我从不使用单击鼠标中键,因此对我来说非常合适:)感谢您的简单说明。我的输入设备ID为11,所以我运行了“ xinput --set-button-map 11 1 1 3”,谢谢!
Vahid Pazirandeh

3

当使用零带宽的好答案时,某些设备(例如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

大提示;我已经编辑了答案以包含它。谢谢!
zerobandwidth

1

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


1
欢迎来到AskUbuntu。您需要在答案中提供更多细节。
大卫

好的,请参见上面的编辑。
atr15

接得好。但是您所描述的内容并没有按照您的指示进行操作:实际上,中间按钮是使该应用程序进入“手势识别模式”的默认按钮:按下该按钮时,该应用程序将开始识别您所做的手势。但是,+ 1是因为该应用程序具有显示鼠标按钮ID的模块;当我们想使用xinput按钮时不显示按钮时,这很有用xinput list <devID>
1111161171159459134 2015年

1
哦,是一年后才来的-您的答案
值得

1

在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键鼠标的笔记本电脑上可以正常工作。它也可以重新映射到击键和命令,并且配置比任何其他方法都简单得多!


我想知道该工具是否仅在后台进行了相同的更改。^ _ ^
zerobandwidth '18 -10-10

0

我有HP Elitebook 2570p,Ubuntu 18.04.2。这里我有一个对我无用的跟踪点,这是空格下方的2个无用跟踪点按钮

我不使用这些键,因为我将其放在触摸板下。我想将这些按钮重新映射到left = back_button(Alt_L + Left),右边一个= middle_mouse_button。“ xinput”中的跟踪点是id = 11,左键是数字1,右是3。

有人可以给我写正确的代码以复制到终端吗?我已经与xbindkeysrc结合使用,但是这将对(trackpoint和touchpad)按钮都设置了任何操作


我已经完成并简单地做到了:<code> echo xinput set-button-map 11 8 1 2 >>〜/ .xsessionrc </ code>它使我的接触点按钮(id 11)成为左侧的第8个按钮,中间为左键单击(否1),右边为中间键1,然后“编码”回显-e“ \” / usr / bin / xte'keydown Alt_L''key Left''keyup Alt_L'&amp; \ “ \ nb:8” >>〜/ .xbindkeysrc'代码'它将8号按钮(b:8)设置为Alt_L + Left =>返回:)现在,我有2个鼠标按钮
Atom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.