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 xev
và 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.