Diese Antwortzeigt die Befehlszeilen zum Vertauschen der primären und sekundären Maustaste an. Ich hätte jedoch gerne ein Skript, das bei jeder Ausführung automatisch die Maustasten vertauscht. Kann mir jemand einen Tipp geben, wie das geht? Ich weiß so gut wie nichts über Bash-Skripte.
Antwort1
xinput list
Ohne die Ausgabe von on bereitzustellendeinSystem, kann niemand eine Antwort anbieten, die Sie direkt verwenden könnten. Das liegt daran, dass xinput
andere Geräte angezeigt werden können als inWie tausche ich die Maustasten am Terminal so aus, dass sie für Linkshänder geeignet sind?.
Hier ist beispielsweise die Ausgabe unter OSX:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ xquartz virtual pointer id=6 [slave pointer (2)]
⎜ ↳ pen id=8 [slave pointer (2)]
⎜ ↳ cursor id=9 [slave pointer (2)]
⎜ ↳ eraser id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ xquartz virtual keyboard id=7 [slave keyboard (3)]
und hier ist die Ausgabe auf meinem Debian/testing:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ VMware VMware Virtual USB Mouse id=7 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=9 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=10 [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)]
↳ AT Translated Set 2 keyboard id=8 [slave keyboard (3)]
so dass auf einem System möglicherweise eine ID zur Auswahl steht (virtueller Zeiger von xquartz), während es auf einem anderen System drei Möglichkeiten gibt. Wenn Sie diese durchlesen, werden Sie feststellen, dass die hier angeführten Beispiele nicht konstruiert sind:
- Wie kann ich die Tastenbelegung der Maus ändern?
- „xinput list“ zeigt dasselbe Gerät zweimal an und die Geräte-IDs ändern sich: Wie verwende ich „set-prop“ in einem Skript?
Angesichts der Variation (und vagenDokumentation fürxinput
), können Sie den Teil zum Abrufen der ID des Mausgeräts wahrscheinlich nicht automatisieren.
Angenommen, Sie wählen einen verwendbaren Bezeichner und nennen diesen der Diskussion halber "12". Ein Skript kann die Ausgabe von
xinput get-button-map 12
in ein Array. Einige Skriptsprachen bieten Arrays an, z. B. bash
. Es gibt jedoch mehrere Fallstricke:
- Auf meinem OSX-System wird eine Liste „1 2 3“ zurückgegeben, während es auf dem Debian-System eine Liste „1 2 3 4 5 6 7 8 9 10 11 12“ zurückgibt.
- Sie müssen raten, ob die zusätzlichen Schaltflächen etwas bedeuten, und
- selbst die Zuordnung dreier Tastennummern kann unter Umständen nicht eindeutig links/mitte/rechts sein.
Dann muss das Skript zum Umschalten der Tasten seinen Zustand irgendwo speichern, z. B. in einer Datei in Ihrem Home-Verzeichnis. Ein Skript, das das verwaltet, müsste
- Initialisieren Sie die Datei mit den aktuellen Schaltflächen
- aktualisiere es entsprechend deinem Schema der Umschaltflächen (bei 3 gibt es "3!" mögliche Anordnungen)
Angenommen, Sie verfügen über die einfachste Konfiguration (und Interpretation), könnten Sie in einem Skript etwa Folgendes tun:
#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
mode=reverse
else
mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id
Das Skript akzeptiert einen Parameter (die Kennung des Mausgeräts). Für das angegebene Beispiel (und indem Sie das Skript „toggle-buttons“ nennen, es ausführbar machen und in Ihr packen $PATH
):
toggle-buttons 12
sollte den Job machen.
Antwort2
Ich werde meine eigene Lösung hinzufügen, da die anderen Antworten für die einfache Aufgabe, die primären Tasten (1 und 3) einer Maus zu vertauschen, manchmal zu kompliziert erscheinen.
#!/bin/bash
set -e
# To get the name of a devices, do "xinput list --name-only"
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"
current_button_map=$(xinput get-button-map "$DEVICE_NAME")
if [[ $current_button_map =~ "1 2 3" ]]; then
echo "Making the mouse a lefty"
xinput set-button-map "$DEVICE_NAME" 3 2 1
else
echo "Making the mouse a righty"
xinput set-button-map "$DEVICE_NAME" 1 2 3
fi
Antwort3
Ich würde so etwas tun wie:
#!/bin/sh
mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap
Dies setzt voraus, dass Sie den „Namen“ Ihrer Maus kennen (in meinem Fall ist es Razer
) und dass Sie die Standard-Tastenbelegung kennen (d. h. welche Tasten links und rechts sind, damit Sie sie vertauschen können), die Sie mit erhalten xinput list $mxid
:
Button labels: "Button Left" "Button Middle" "Button Right"....
Und xinput get-button-map $mxid
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Wie Sie in meinem Fall sehen, liest das obige 1 =>> left
Skript 3 =>> right
einfach die aktuelle Zuordnung, vertauscht den ersten und dritten Wert und legt dann die neue Zuordnung fest.
Antwort4
Wenn Sie einen Zustand umschalten müssen (und das Umkehren/Aufheben der Reihenfolge der Maustasten ist ein solcher Zustand), müssen Sie entweder den aktuellen Zustand des Geräts abfragen können oder den Zustand in einer Datei speichern.
Da ich nicht herausfinden konnte, ob xinput
es eine Möglichkeit gibt, die Tastenbelegung einer Maus abzufragen, sollten Sie den Status wahrscheinlich in einer Datei speichern, z. B. ~/.config/mousebuttons
. Ihr Skript sollte bei der Ausführung „reverse“ in die Datei schreiben:
xinput set-button-map 12 3 2 1 und schreibe „normal“ in diese Datei, wenn du Folgendes ausführst:
xinput set-button-map 12 2 3 Die tatsächlich auszuführende Aktion hängt vom Lesen der Datei ab: Führen Sie den ersten Schritt aus, wenn der Dateiinhalt beim Starten des Skripts lautet normal
(oder die Datei nicht existiert), und führen Sie den zweiten Schritt aus, wenn der Inhalt lautet reverse
.
Der Dateiinhalt wechselt bei jedem Aufruf von reverse
zu normal
. Ihr tatsächlicher Status spiegelt möglicherweise nicht den Inhalt der Datei wider, z. B. nach einem Neustart. Drucken Sie daher den neuen Status auch auf dem Bildschirm aus, um eine visuelle Erinnerung zu haben. Wenn die Datei nicht mit dem Status synchronisiert ist, wird sie durch einen einzigen Aufruf Ihres Skripts wieder synchronisiert.