使用左手鼠标的用户往往习惯交换鼠标的左右键功能。然而,系统设置并不能针对某个具体的鼠标单独设置按键的功能,交换左右键会对所有的鼠标都生效。对于台式机而言,绝大部分情况下一台电脑只会接一个鼠标,因此这个限制并不会带来什么不方便。但对于笔记本电脑而言,本身已经带有一个内置鼠标,如果再插上一个 USB 外置鼠标,就同时有两个鼠标可以工作了。

滇狐使用外接鼠标的时候,一般习惯左手习惯,会交换鼠标的左右键功能。但在使用笔记本内置的“小红点”的时候,更习惯使用右手,因此不希望交换鼠标左右键的功能。通过系统设置我们是无法只针对某个鼠标交换左右键的,但通过命令行,我们可以实现这一点。

首先,我们需要使用一个命令行工具 xinput,在 Debian 下可以通过 apt install xinput 安装。

然后,我们运行这个命令,列出系统里的所有输入设备。正常情况下,这里会包含已连接的所有鼠标和键盘:

$ xinput
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=11   [slave  pointer  (2)]
⎜   ↳ TPPS/2 Elan TrackPoint                    id=12   [slave  pointer  (2)]
⎜   ↳ Logitech T400                             id=14   [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=15   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C           id=9    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=10   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=13   [slave  keyboard (3)]
    ↳ Logitech T400                             id=16   [slave  keyboard (3)]

如果想要交换某个鼠标的左右键,只要在上表中找到鼠标对应的 ID,然后运行 xinput set-button-map <id> 3 2 1 就可以了。譬如,如果我们想交换 Logitech USB 鼠标的左右键,我们可以运行:

$ xinput set-button-map 15 3 2 1

为了方便地交换外接鼠标的左右键,滇狐写了以下脚本,自动查找所有名称中包含“USB”的设备,并交换左右键:

#!/bin/sh

for mouse in `xinput list | grep 'USB.*Mouse' | sed -e 's/.*id=//' | \
    awk '{ print $1 }'`do
  xinput set-button-map $mouse 3 2 1
done