Làm cách nào để tự động ánh xạ lại các nút trên chuột khi khởi động?


30

Tôi đã vật lộn với điều này vào cuối tuần, và cần phải ánh xạ lại các nút chuột của tôi.

Câu trả lời:


47

Tôi có một con chuột Logitech với 9 nút và nhấn "nút giữa" (số 2) liên quan đến việc nhấp vào bánh xe cuộn. Tôi không thích điều này bởi vì tôi vụng về và thường kết thúc việc cuộn cửa sổ khi tôi cố bấm vào bánh xe. Vì vậy, tôi muốn tự động ánh xạ lại nút phía trên (số 9 trong trường hợp này) sang nút giữa (số 2). Tôi cũng muốn ánh xạ nút phía dưới (# 8) để nó thực hiện nhấp đúp vào nút bên trái (# 1).

Mặc dù mục đích của tôi là cụ thể, các giải pháp bên dưới có thể được khái quát cho mọi tình huống mà bạn muốn tự động ánh xạ lại các nút chuột khi khởi động.

Ánh xạ các nút chuột sang các nút chuột khác

Bạn sẽ cần xinputcài đặt cho nhiệm vụ này. Điều này có thể được thực hiện hoàn toàn trong .xsessionrctập tin của bạn . Đầu tiên, sử dụng xinputđể khám phá tên được gán cho chuột của bạn, sau đó tương quan với ID thiết bị đầu vào. Dưới đây là một số mẫu đầu ra từ máy tính xách tay của tôi:

⎡ 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)]

Chuột của tôi gọi chính nó Logitech USB Laser Mousevà được hiển thị như id=11. Chuột của bạn sẽ có một tên khác; chỉ ra rằng đó là một bài tập cho người đọc.

Mặc dù bạn vẫn biết ID của thiết bị trong phiên này , hãy tìm hiểu xem có bao nhiêu nút mà trình xử lý đầu vào nghĩ rằng chuột của bạn có, bằng cách sử dụng . Điều này có thể khác với số lượng nút rõ ràng trên thiết bị.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"

Với chuột của tôi, chỉ có 9 nút vật lý rõ ràng, nhưng xinputbáo cáo 16.

Với bản chất của USB, ID này có thể thay đổi mỗi khi bạn khởi động lại, do đó, nó không đủ để tạo ra một cái gì đó được khóa tĩnh với ID mà bạn khám phá một lần. Bạn sẽ phải tự động phân tích cú pháp này khi khởi động và thực hiện bản đồ lại của bạn dựa trên ID hiện tại.

Bây giờ bạn đã biết tên của nó, bạn có thể sử dụng xinput testđể tìm ra phím nào để ánh xạ lại. Nhấn các nút chuột mà bạn muốn ánh xạ từ và tới, để có được chỉ số của chúng. (Để tham khảo, 1, 2 và 3 "luôn luôn" (nghĩa là thường) tham khảo các nút trái, giữa và phải của chuột 3 nút. )

button press   2
button release 2
button press   9
button release 9

Trong trường hợp này, tôi thấy rằng tôi muốn ánh xạ nút số 9 (bên cạnh, trên cùng) sang nút số 2 (giữa).

Bây giờ bạn đã biết con chuột của bạn được gọi là gì và bạn muốn thay đổi nút nào, bạn có thể viết một ~/.xsessionrctập lệnh gọi xinputđể thực hiện việc ánh xạ lại nút khi khởi động. Dưới đây là kịch bản hoàn chỉnh của tôi.

# 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

Dòng đầu tiên ở đây đặt biến phiên tạm thời bằng ID của chuột như được báo cáo bởi xinput. Điều này được thực hiện bằng cách greplấy tên chuột đã biết trong báo cáo từ xinputđó, sau đó sử dụng sedđể trích xuất số ID từ id=xxxmã thông báo đó trong báo cáo. Giá trị này sau đó được sử dụng trong một lệnh xinput set-button-map, thực thi ánh xạ lại. Trong ví dụ trên, thay đổi duy nhất là nút số 9 đang được ánh xạ lại thành nút bắt chước # 2. Tất cả những người khác vẫn ở cài đặt mặc định của họ.

Cập nhật: Như @Lokasenna chỉ ra bên dưới , nếu thiết bị của bạn báo cáo cả chuột và bàn phím, bạn có thể cần phải giới hạn số lượng kết quả của việc grepsử dụng -m 1.

Các nút chuột ánh xạ tới các hàm tùy ý

Xem thêm câu trả lời này .

Bạn sẽ cần xinput, xbindkeysxautomation(bao gồm xte) cài đặt cho nhiệm vụ này.

Sử dụng xinput listxinput testđể khám phá ID thiết bị của chuột và số nút bạn muốn chỉ định. Trong trường hợp của tôi, tôi muốn ánh xạ nút bên dưới (# 8) sang một lần bấm đúp của nút bên trái (# 1).

Tạo hoặc chỉnh sửa ~/.xbindkeysrc. Định dạng của tập tin này là một loạt các dòng được ghép nối. Dòng đầu tiên là một lệnh được thực thi cho một sự kiện; dòng thứ hai là mô tả sự kiện. Chúng tôi sẽ sử dụng xtethành phần của xautomationđể gửi các sự kiện trực tiếp đến trình xử lý đầu vào.

Để tạo một sự kiện nhấn đúp khi một nút được phát hành, tôi đã thêm vào như sau:

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

Cấu hình này ánh xạ một chuỗi hai lần nhấp chuột vào nút số 1 đến việc phát hành nút số 8. (Về lý thuyết tôi đoán bạn có thể ánh xạ bất kỳ lệnh nào tới nút chuột, nhưng đây là trường hợp phổ biến nhất. Xem câu trả lời này để biết các ví dụ thực tế khác.)

Cập nhật cho 16.04 Ubuntu

Đối với người dùng có nhiều chuột được gắn vào hệ thống của bạn, bạn cũng cần phải nhập ID của thiết bị. Điều này có thể không áp dụng cho tất cả người dùng và được phát hiện trên Ubuntu 16.04 với 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)]

Sau đó sửa đổi tệp .xbindkeysrc bằng cách tham chiếu id = value từ lệnh đầu ra (id = 9 trong ví dụ này):

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

7
Cảm ơn vì thông tin. Awk của bạn có vẻ như sẽ cần thay đổi dựa trên số lượng từ trong thiết bị. Tôi đã sử dụngsed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112

Theo khóa kiểm tra xinput kích hoạt ba phím bấm khác nhau - làm thế nào để liên kết tất cả chúng lại với nhau trong .xbindkeysrc?
axltop

@ jbo5112 Tôi mới bắt đầu sử dụng nhiều chuột trên máy tính xách tay của mình và có lý do chính đáng để xem lại nhận xét của bạn. Bây giờ tôi đã thay thế awktuyên bố cũ của tôi bằng sedtuyên bố của bạn trong các ví dụ của tôi. Cảm ơn sự cải thiện!
zerobandference

2
Không cần sử dụng id trong set-button-map; ví dụ:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin

Vấn đề bất thường tôi đoán: xinputkhông hiển thị chuột của tôi hai lần, như thế này: USB OPTIC MOUSE id = 12 [con trỏ nô lệ (2)] USB OPTIC MOUSE id = 13 [con trỏ nô lệ (2)] Chỉ ID 13 mới bắt được lệnh xinput test. Kịch bản sẽ luôn bắt ID đầu tiên. Nhưng tại sao nó lại hai lần? Cả hai biến mất khi tôi ngắt kết nối con chuột này và xuất hiện lại khi được kết nối.
w-sky

6

Các bước ngắn cho việc này là:

Có một tiện ích gọi là xinput. xinput listhoặc chỉ xinputhiển thị tất cả các thiết bị đầu vào X và ID của chúng. Ở đây bạn tìm thấy ID của con chuột mà bạn muốn ánh xạ lại.

Tôi sẽ sử dụng ID của mình làm ví dụ, từ thiết lập của tôi, là 21, sau đó xinput --get-button-map 21sẽ xuất ra

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Bây giờ, nếu bạn muốn, giả sử, hoán đổi các nút trái và phải bạn chỉ cần chạy

xinput --set-button-map 21 3 2 1

Ở đây chúng tôi, ánh xạ lại được thực hiện.

Để chạy nó khi khởi động, chỉ cần đặt nó vào một tệp:

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

cho phép nó thực thi

chmod +x leftmouseremap.sh 

Cuối cùng, thêm ứng dụng này vào Ứng dụng Statrtup theo cách thủ công từ GUI hoặc, nếu bạn muốn nó từ CLI, hãy đặt văn bản bên dưới (thay đổi đường dẫn thành của bạn) trong một tệp của bạn ~/.config/autostart, đây là của tôi ( 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=

Hãy nhớ rằng, với KDE, đường dẫn sẽ như thế nào ~/.kde/Autosart, đối với những người khác Trình quản lý máy tính để bàn có thể khác biệt rõ rệt. Ngoài ra, khởi động chạy có thể được thực hiện với cách tiếp cận chung bằng cách sử dụng /etc/rc.local.


Điều này giải quyết vấn đề tràn nước của tôi. Tôi có các nút bấm trái / phải bên dưới bàn di chuột của máy tính xách tay. Tôi đã làm đổ nước và bây giờ cả hai nút đều gửi tín hiệu nhấp chuột đến HĐH (Tôi đã phát hiện ra điều này bằng ứng dụng 'keymon'). Tôi đã sử dụng phương pháp của bạn để ánh xạ lại nhấp chuột giữa để nhấp chuột trái, vì vậy tôi ít nhất có thể tận hưởng trải nghiệm nhấp chuột trái. Tôi không bao giờ sử dụng nhấp chuột giữa để điều này hoạt động hoàn hảo cho tôi :) Cảm ơn các hướng dẫn đơn giản. ID thiết bị đầu vào của tôi là 11, vì vậy tôi đã chạy "xinput --set-button-map 11 1 1 3" Cảm ơn !!
Vahid Pazirandeh

3

Khi sử dụng câu trả lời tuyệt vời của zerobandference , một số thiết bị, chẳng hạn như MX Ergo của Logitech, hiển thị dưới dạng cả con trỏ và thiết bị bàn phím :

⎡ 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)]

Do đó, grep "Logitech MX Ergo"kết thúc trả lại hai giá trị. Cái cuối cùng được đưa vào làm mục đầu tiên trong chuỗi ánh xạ và vặn tất cả các nút chuột của bạn.

Cách khắc phục rất dễ dàng - chỉ cần sử dụng grepđối số đếm tối đa , -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

Mẹo tuyệt vời; Tôi đã chỉnh sửa câu trả lời để đưa nó vào. Cảm ơn!
zerobandference

1

Tôi đã có thể thay đổi ánh xạ của nút giữa chuột Logitech của mình thành 'Quay trở lại' bằng cách sử dụng Nhận dạng cử chỉ Easystroke mà tôi đã tải xuống từ Trung tâm phần mềm Ubuntu. Chỉnh sửa: Trong ứng dụng, bạn sẽ chọn Thêm hành động, Đặt tên cho nó, chọn loại khóa, nhấp vào Chi tiết và nhấn Enter, nhấn Record Stroke và trong khi nhắc xuống, nhấn vào nút giữa.


1
Chào mừng bạn đến với AskUbfox. Bạn cần cung cấp thêm chi tiết với câu trả lời của bạn.
David

Ok, xin vui lòng xem chỉnh sửa ở trên.
atr15

Nắm bắt tốt. Nhưng những gì bạn mô tả không xork như bạn đã hướng dẫn: thực ra nút giữa là nút mặc định để đưa ứng dụng đó vào mode chế độ nhận dạng cử chỉ ': khi nhấn vào ứng dụng, ứng dụng bắt đầu nhận ra cử chỉ bạn đang thực hiện. Tuy nhiên, +1 vì ứng dụng đó có mô-đun để hiển thị ID nút chuột; Điều này giúp khi chúng ta muốn sử dụng xinputvới các nút không hiển thị khi sử dụng xinput list <devID>.
1111161171159459134

1
Ồ, điều này đã đến 1 năm sau - câu trả lời của bạn có giá trị +1
1111161171159459134

1

Trước ngày 12.04, có một công cụ đồ họa dễ gọi là "btnx" trong kho lưu trữ tiêu chuẩn, được thêm vào dưới dạng "Thuộc tính nút" trong Cấu hình hệ thống. Đáng buồn là tuy nhiên nó đã bị loại bỏ. Một PPA "không đáng tin cậy" hiện được duy trì cho 14.04, 16.04 và 18.04 tại đây: https://launchpad.net/~oliverstar/+archive/ubfox/ppa (được tìm thấy tại https://launchpad.net/ubfox/xenial/+source / btnx )

Nó sẽ không tích hợp với cài đặt Hệ thống nhưng hoạt động khá tốt trên máy tính xách tay của tôi với chuột 5 nút giá rẻ. Nó cũng có thể ánh xạ lại với tổ hợp phím và các lệnh và cấu hình đơn giản hơn nhiều so với bất kỳ phương pháp nào khác!


Tôi tự hỏi nếu công cụ đang thực hiện các thay đổi tương tự, chỉ trong nền. ^ _ ^
zerobandference

0

Tôi có HP elitebook 2570p, Ubuntu 18.04.2. Ở đây tôi có một trackpoint vô dụng đối với tôi và đây là 2 nút trackpoint vô dụng dưới không gian

Tôi không sử dụng các phím này vì tôi có nó dưới bàn di chuột. Tôi muốn sắp xếp lại các nút này sang trái = back_button (Alt_L + Trái), nút phải = middle_mouse_button. Điểm theo dõi trong "xinput" là id = 11 và nút bên trái là số 1, bên phải là 3.

Ai đó có thể viết cho tôi mã đúng để chỉ sao chép vào thiết bị đầu cuối? Tôi đã kết hợp với xbindkeysrc nhưng điều đó đặt bất kỳ hành động nào cho cả hai nút (trackpoint và touchpad)


Tôi đã thực hiện điều này và thực hiện nó một cách đơn giản: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </ code> Nó làm cho các nút cảm ứng của tôi (id 11) làm cho nút bên trái là nút thứ 8, ở giữa khi nhấp chuột trái (số 1) và nhấp chuột phải dưới dạng trung gian và sau đó 'code' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'Phím trái' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'mã' Nó đặt nút số 8 (b: 8) thành Alt_L + Left => quay lại :) Bây giờ tôi có 2 nút chuột hữu ích
Atom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.