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.
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:
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.
Bạn sẽ cần xinput
cài đặt cho nhiệm vụ này. Điều này có thể được thực hiện hoàn toàn trong .xsessionrc
tậ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 Mouse
và đượ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 xinput
bá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 ~/.xsessionrc
tậ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 grep
lấ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=xxx
mã 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 grep
sử dụng -m 1
.
Xem thêm câu trả lời này .
Bạn sẽ cần xinput
, xbindkeys
và xautomation
(bao gồm xte
) cài đặt cho nhiệm vụ này.
Sử dụng xinput list
và xinput 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 xte
thà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.)
Đố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
awk
tuyên bố cũ của tôi bằng sed
tuyên bố của bạn trong các ví dụ của tôi. Cảm ơn sự cải thiện!
xinput set-button-map "Logitech Trackball" 1 3 3
xinput
khô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.
Các bước ngắn cho việc này là:
Có một tiện ích gọi là xinput
. xinput list
hoặc chỉ xinput
hiể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 21
sẽ 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
.
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
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.
xinput
với các nút không hiển thị khi sử dụng xinput list <devID>
.
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 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)
sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'