ฉันจะตั้งค่าปุ่มบนเมาส์ใหม่โดยอัตโนมัติเมื่อเริ่มต้นได้อย่างไร


30

ฉันต้องดิ้นรนกับสิ่งนี้ในช่วงสุดสัปดาห์และจำเป็นต้องทำการแมปปุ่มเมาส์ใหม่

คำตอบ:


47

ฉันมีเมาส์ Logitech ที่มี 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 ปัจจุบัน

เมื่อคุณรู้ชื่อแล้วคุณสามารถใช้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

บรรทัดแรกที่นี่กำหนดตัวแปรเซสชั่นชั่วคราวเท่ากับ ID xinputของเมาส์ตามที่รายงานโดย สิ่งนี้ทำได้โดยgrepการใช้ชื่อเมาส์ที่รู้จักในรายงานจากxinputนั้นใช้sedเพื่อแยกหมายเลข ID จากid=xxxโทเค็นนั้นในรายงาน ค่านี้จะใช้ในxinput set-button-mapคำสั่งซึ่งดำเนินการทำแผนที่ใหม่ ในตัวอย่างข้างต้นการเปลี่ยนแปลงอย่างเดียวคือปุ่ม # 9 กำลังถูกแมปซ้ำกับปุ่มเลียนแบบ # 2 อื่น ๆ ทั้งหมดยังคงอยู่ในการตั้งค่าเริ่มต้นของพวกเขา

ปรับปรุง:ในฐานะที่เป็น @Lokasenna ชี้ให้เห็นด้านล่างหากอุปกรณ์ของคุณรายงานตัวเองเป็นทั้งเมาส์และแป้นพิมพ์ที่คุณอาจจำเป็นต้อง จำกัด จำนวนผลมาจากการใช้grep-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 (ตามทฤษฎีแล้วฉันเดาว่าคุณสามารถแมปคำสั่งใด ๆกับปุ่มเมาส์ได้ แต่นี่เป็นกรณีที่พบบ่อยที่สุดดูคำตอบนี้สำหรับตัวอย่างที่ใช้งานได้จริง)

อัปเดตสำหรับ 16.04 Ubuntu

สำหรับผู้ใช้ที่มีเมาส์หลายตัวต่ออยู่กับระบบของคุณคุณจะต้องส่ง 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)]

จากนั้นแก้ไขไฟล์. xbindkeysrc โดยอ้างอิง id = value จากเอาต์พุตคำสั่ง (id = 9 ในตัวอย่างนี้):

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

7
ขอบคุณสำหรับข้อมูล. awk ของคุณดูเหมือนจะต้องเปลี่ยนตามจำนวนคำในอุปกรณ์ ฉันใช้sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112

ตามการทดสอบนิ้วหัวแม่มือ xinput ทริกเกอร์การกดปุ่มที่แตกต่างกันสามแบบ - วิธีการรวมทั้งหมดเข้าด้วยกันใน. xbindkeysrc?
axltop

@ jbo5112 ฉันเพิ่งเริ่มใช้หนูหลายตัวบนแล็ปท็อปที่ทำงานของฉันและมีสาเหตุที่ดีในการทบทวนความคิดเห็นของคุณอีกครั้ง ตอนนี้ฉันแทนที่awkคำสั่งเก่าด้วยsedคำสั่งของคุณในตัวอย่างของฉัน ขอบคุณสำหรับการปรับปรุง!
zerobandwidth

2
ไม่จำเป็นต้องใช้ id ใน set-button-map; เช่น:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin

ปัญหาที่ผิดปกติฉันเดา: xinputไม่แสดงเมาส์ของฉันสองครั้งเช่นนี้↳ USB OPTICAL MOUSE id = 12 [ชี้ทาส (2)] ↳ USB OPTICAL MOUSE id = 13 [ชี้ทาส (2)] เฉพาะหมายเลข 13 xinput testจะจับคำสั่งด้วย สคริปต์จะจับ ID แรกเสมอ แต่ทำไมมันถึงสองครั้งล่ะ ทั้งสองหายไปเมื่อฉันยกเลิกการเชื่อมต่อเมาส์นี้และปรากฏขึ้นอีกครั้งเมื่อเชื่อมต่อ
w-sky

6

ขั้นตอนสั้น ๆ สำหรับสิ่งนี้คือ:

xinputมียูทิลิตี้ที่เรียกว่าเป็น xinput listหรือเพียงแค่xinputจะแสดงอุปกรณ์อินพุต X และรหัสประจำตัวของพวกเขาทั้งหมด ที่นี่คุณจะพบ 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 

สุดท้ายให้เพิ่มสิ่งนี้ลงใน Statrtup Application ด้วยตนเองจาก GUI หรือถ้าคุณต้องการจาก CLI ให้ใส่ข้อความด้านล่าง (เปลี่ยนเส้นทางของคุณ) ใส่ไฟล์ไว้ในไฟล์ของคุณ~/.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

เมื่อใช้คำตอบที่ยอดเยี่ยมของ zerobandwidthอุปกรณ์บางอย่างเช่น MX Ergo ของ Logitech จะปรากฏเป็นทั้งตัวชี้และอุปกรณ์คีย์บอร์ด :

⎡ 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อาร์กิวเมนต์การนับที่มากที่สุด-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

ฉันสามารถเปลี่ยนการแมปของปุ่มกลางของเมาส์ Logitech เป็น 'Return' โดยใช้ Easystroke Gesture Recognition ซึ่งฉันดาวน์โหลดจาก Ubuntu Software Center แก้ไข: ในแอปพลิเคชันคุณจะต้องเลือกเพิ่มการกระทำตั้งชื่อให้เลือกประเภทคีย์คลิกที่รายละเอียดแล้วกด Enter กดปุ่ม Record Stroke และในระหว่างที่กดพร้อมท์กดที่ปุ่มกลาง


1
ยินดีต้อนรับสู่ AskUbuntu คุณต้องให้รายละเอียดเพิ่มเติมกับคำตอบของคุณ
เดวิด

ตกลงโปรดดูการแก้ไขด้านบน
atr15

จับดี. แต่สิ่งที่คุณอธิบายไม่ได้เป็น xork ตามที่คุณได้รับคำสั่ง: จริง ๆ แล้วปุ่มกลางเป็นปุ่มเริ่มต้นที่จะทำให้แอพนั้นอยู่ใน 'โหมดการจดจำท่าทาง' เมื่อกดแอปนั้น ยัง +1 เพราะแอปนั้นมีโมดูลที่จะเปิดเผย ID ของปุ่มเมาส์; นี้จะช่วยให้เมื่อเราต้องการใช้ที่มีปุ่มไม่ปรากฏขึ้นเมื่อใช้xinput xinput list <devID>
1111161171159459134

1
โอ้นี่เกิดขึ้นอีก 1 ปีต่อมา - คำตอบของคุณมีค่า +1
1111161171159459134

1

ก่อนหน้า 12.04 มีเครื่องมือกราฟิกอย่างง่ายที่เรียกว่า "btnx" ในที่เก็บมาตรฐานซึ่งเพิ่มเป็น "คุณสมบัติปุ่ม" ในการกำหนดค่าระบบ น่าเศร้าอย่างไรก็ตามมันถูกทิ้ง PPA "ที่ไม่น่าเชื่อถือ" ได้รับการบำรุงรักษาในปัจจุบันสำหรับ 14.04, 16.04 และ 18.04 อยู่ที่นี่: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (ดูได้ที่https://launchpad.net/ubuntu/xenial/+source / btnx )

มันจะไม่รวมเข้ากับการตั้งค่าระบบ แต่ทำงานได้ค่อนข้างดีบนแล็ปท็อปของฉันด้วยเมาส์ 5 ปุ่มราคาถูก มันสามารถทำการแมปไปยังการกดแป้นและคำสั่งได้อีกด้วยและการกำหนดค่านั้นง่ายกว่าวิธีอื่น ๆ !


ฉันสงสัยว่าเครื่องมือกำลังทำการเปลี่ยนแปลงแบบเดียวกันหรือไม่ในพื้นหลัง ^ _ ^
zerobandwidth

0

ฉันมี HP elitebook 2570p, Ubuntu 18.04.2 ที่นี่ฉันมี trackpoint ที่ไร้ประโยชน์สำหรับฉันและนี่คือปุ่ม trackpoint ที่ไร้ประโยชน์ 2 อันใต้พื้นที่

ฉันไม่ได้ใช้กุญแจเหล่านี้เพราะฉันมีมันใต้ทัชแพด ฉันต้องการแมปปุ่มเหล่านี้อีกครั้งเพื่อ left = back_button (Alt_L + Left) ทางขวาหนึ่ง = middle_mouse_button trackpoint ใน "xinput" คือ id = 11 และปุ่มซ้ายคือหมายเลข 1 ทางขวาคือ 3

มีใครบางคนสามารถเขียนรหัสที่ถูกต้องให้ฉันเพื่อคัดลอกไปยังเทอร์มินัลได้ไหม ฉันได้รวมกับ xbindkeysrc แต่นั่นเป็นการตั้งค่าการดำเนินการใด ๆ กับปุ่มทั้งสอง (trackpoint และ touchpad)


ฉันทำสิ่งนี้และทำให้มันง่ายขึ้น: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> มันทำให้ปุ่ม touchpoint ของฉัน (id 11) ทำให้ปุ่มซ้ายเป็นปุ่มที่ 8 ตรงกลางเป็นคลิกซ้าย (ไม่ใช่ 1) และคลิกขวาที่ปุ่มกลางแล้วกด 'รหัส' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'ปุ่มซ้าย' keyup Alt_L '& amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' มันตั้งค่าปุ่ม no 8 (b: 8) เป็น Alt_L + Left => ย้อนกลับไป :) ตอนนี้ฉันมีปุ่มเมาส์ 2 ปุ่มที่มีประโยชน์
Atom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.