Answers:
我有一个带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在下面指出,如果您的设备将自己报告为鼠标和键盘,则可能需要限制grep
using 的结果数-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的释放。(理论上我想您可以将任何命令映射到鼠标按钮,但这是最常见的情况。有关其他实际示例,请参见此答案。)
对于将多个鼠标连接到系统的用户,您还需要输入设备的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
awk
,sed
在示例中,我用您的陈述替换了旧的陈述。感谢您的改进!
xinput set-button-map "Logitech Trackball" 1 3 3
xinput
是异常的问题:确实两次显示鼠标,如下所示:↳USB OPTICAL MOUSE id = 12 [从属指针(2)]↳USB OPTICAL MOUSE id = 13 [从属指针(2)]只有ID 13才能捕获带有的命令xinput test
。该脚本将始终捕获第一个ID。但是为什么还是两次呢?当我断开此鼠标的连接时,两者都会消失,而在连接时会重新出现。
简短的步骤是:
有一个名为的实用程序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
。
当使用零带宽的好答案时,某些设备(例如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
我可以使用从Ubuntu软件中心下载的Easystroke手势识别将Logitech鼠标的中键映射更改为“ Return”。编辑:在应用程序中,您将选择“添加操作”,“为其命名”,选择键类型,单击“详细信息”并按Enter,然后单击“记录笔划”,然后在提示期间按下中间按钮。
xinput
按钮时不显示按钮时,这很有用xinput list <devID>
。
在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键鼠标的笔记本电脑上可以正常工作。它也可以重新映射到击键和命令,并且配置比任何其他方法都简单得多!
我有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)按钮都设置了任何操作
sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'