Cách ánh xạ lại các phím trong Linux cho một bàn phím cụ thể


17

Gần đây tôi đã mua một bàn phím Unicomp đi kèm với các phím Windows và phím phải được hoán đổi. Bàn phím xác định như thế này trên lsusb:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

Có cách nào để nhân (không phải dựa trên xmodmap) trao đổi các phím bên phải và cửa sổ để mọi ứng dụng nhìn thấy chúng ở những nơi bị tráo đổi ngay cả khi chúng nhận được đầu vào bàn phím thô (hoán đổi công cụ với xmodmap sẽ không làm điều đó) ? Có cách nào để chỉ có một bàn phím này không?


Tôi nghi ngờ bạn có thể làm điều này với udev bằng cách khớp số sê-ri của bàn phím và sau đó gọi một tập lệnh thực hiện ánh xạ lại. Bạn có thể cần một tập lệnh tương tự để được gọi tách ra cho thiết bị để đặt lại.
kẹt

1
@jam Điều này sẽ ánh xạ lại tất cả các bàn phím đính kèm? Tôi không thể tưởng tượng rằng Linux không linh hoạt đến mức nó chỉ có thể quản lý một bảng ánh xạ cho tất cả các bàn phím (USB) được đính kèm.
FUZxxl

@jam Ngoài ra, bạn thực sự sẽ giúp tôi nếu bạn có thể mô tả cách thực hiện trao đổi thực tế. Tôi đã không quản lý để tìm thấy bất cứ điều gì hữu ích về điều này, chỉ những thứ xmodmap (mà tôi không muốn sử dụng).
FUZxxl

Nếu bạn không muốn sử dụng xmodmap, những gì bạn đang hỏi dường như quá cụ thể đối với kiến ​​thức của tôi để giúp bạn xin lỗi. Phương pháp tôi đề xuất sẽ sử dụng xmodmap để trao đổi mã phím cho các phím đó cho tất cả các thiết bị, trong thời gian bàn phím cụ thể của bạn được gắn vào, sau đó đặt lại. Bạn đang mong đợi được sử dụng đồng thời nhiều bàn phím?
mứt

@jam Nếu tôi đã sử dụng Xmodmap, các chương trình X vẫn sẽ thấy các mã khóa sai vì máy chủ X cũng gửi mã khóa chưa được dịch cho máy khách. Điều này quan trọng ví dụ cho các trò chơi video. Có một giải pháp trong kernel không khiến cuộc sống của tôi trở nên phức tạp hơn với các ứng dụng đọc mã quét.
FUZxxl

Câu trả lời:


27

Có, có thể sử dụng XKB. Không giống như xmodmap, XKB có thể sắp xếp lại các phím của bạn cho từng thiết bị.

Lưu ý: Đảm bảo bạn có xkbcomp> 1.2.0

Đầu tiên liệt kê các thiết bị của bạn với:

xinput list

Bạn sẽ nhận được một cái gì đó như thế này:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [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)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

Xác định chuỗi thiết bị của bạn và chỉnh sửa tập lệnh shell sau, thay đổi dòng sed bằng một chuỗi phù hợp với tên thiết bị của bạn. Sau đó thay đổi các phím bạn cần ánh xạ lại.

Ví dụ: Tải xevvà bấm phím bạn muốn ánh xạ lại. Giả sử bạn tìm hiểu nó keycode 84. Lookup 84 https://gist.github.com/zoqaeski/3880640 . Tên chính là <KP5>. Sau đó tra cứu khóa mà bạn muốn nó được thay thế bằng (trong cùng một liên kết, xa hơn bên dưới ) và sao chép những gì bên trong dấu ngoặc. Lặp lại quy trình cho tất cả các phím bạn muốn.

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Sau đó, nguồn nó (bạn có thể thêm nó vào .xinitrc của bạn). Tất cả đã được làm xong! Bây giờ nhấn các phím sẽ tạo đầu ra mong muốn, chỉ cho thiết bị bạn đã chỉ định.

Chỉnh sửa : Gần đây, tôi nhận thấy rằng, vì một số lý do, cấu hình mới không được áp dụng ngay lập tức. Trước tiên, bạn phải nhấn một phím trên bàn phím khác , sau đó kiểm tra các phím được định cấu hình trên bàn phím đã sửa đổi của bạn. Tôi không biết tại sao điều này xảy ra, có thể là một số loại bộ đệm.


Hãy để tôi thử điều này vào thứ hai khi tôi quay lại máy tính nơi tôi sử dụng bàn phím này.
FUZxxl

1
a) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c) Có, bạn chắc chắn nên kiểm tra trước khi thay thế $remote_idbằng số id. Lưu ý có hai tài liệu tham khảo $remote_idở đó, bạn đã thay đổi cả hai?
Watcom

1
Ồ, và khi kiểm tra mã hóa cứng $remote_id, hãy đảm bảo bạn nhận xét dòng [ "$remote_id" ] || exitnếu bạn chưa có nếu không nó sẽ được bảo lãnh.
Watcom

1
@ stats-hb $9sẽ không hoạt động, ý bạn là 9gì?
Watcom

1
cái này hoạt động với tôi lampjs.wordpress.com/2015/06/26/ từ
usil

6

Đối với bất kỳ ai khác đến đây từ Google và muốn có câu trả lời phù hợp hơn với những gì người hỏi ban đầu hy vọng, tôi biết hai cách để ánh xạ lại các sự kiện ở evdevcấp độ để thay đổi áp dụng cho tất cả các ứng dụng:

  1. udev cung cấp một API để sửa đổi các mục cơ sở dữ liệu phần cứng điều khiển ánh xạ giữa các mã và mã khóa. Trang ArchiWiki này , chứa các hướng dẫn, nói rõ ràng rằng nó sẽ hoạt động cho cả đầu vào X11 và bảng điều khiển.

    Ý chính là bạn tạo một mục tùy chỉnh trong /etc/udev/hwdb.d/đó bao gồm một mẫu khớp với thiết bị và một số định nghĩa ánh xạ lại mã khóa từ mã khóa đến mã khóa, sau đó chạy systemd-hwdb updateđể xây dựng lại cơ sở dữ liệu và udevadm triggeráp dụng nó mà không cần khởi động lại.

  2. Do Wayland không sử dụng hệ thống con bàn phím của X11 và các bộ tổng hợp Wayland lớn như Gnome Shell và Weston không triển khai UI để định cấu hình các khía cạnh liên quan của libinput, ai đó đã viết một daemon có tên evdevremapkeys để giải quyết vấn đề tương tự như trình điều khiển không gian người dùng G15Daemon cho Logitech Bàn phím chơi game G15.

    (Nó nuốt các sự kiện mà nó dự định sắp xếp lại, vì vậy không có gì khác nghe trên thiết bị có thể nhìn thấy chúng, sau đó phát ra các sự kiện đã sửa thông qua uinputAPI để tạo các thiết bị đầu vào cấp kernel từ không gian người dùng.)


Tôi sẽ đến đây ngoài DuckDuckGo, nhưng dù sao cũng cảm ơn câu trả lời (:
sm4rk0

0

Đối với những người không thành công với tùy chọn @Watcom, chỉ cần đặt tệp ánh xạ mới của bạn, như:

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};

to / usr / share / X11 / xkb / biểu tượng / có thể là root (ubfox, có thể khác nhau cho bản phân phối của bạn), gọi tệp 'tùy chỉnh'. Yêu cầu chuỗi bố cục hiện tại của bạn với setxkbmap -device <device id> -print | grep xkb_symbolsvà thêm +customvào nó. Đặt bố cục mới với các phím được ánh xạ lại và chuỗi bố cục được sửa đổi:

setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"

Hiệu ứng không phải là vĩnh viễn và không may đặt lại khi bàn phím khác được kết nối, chưa tìm cách khắc phục. Bạn có thể thêm lệnh ở trên vào .bashrcmặc dù, vì vậy các phím được hoán đổi khi khởi động lại nếu cần thiết.

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.