เขียนทับโค้ดสองสามตัวด้วย XKB


10

ฉันต้องการสับเปลี่ยนปุ่มสองสามปุ่มด้วย XKB (เพราะเหตุใดบนแล็ปท็อปที่มีปุ่มบางปุ่มอยู่ไม่สะดวก) ปัจจุบันฉันใช้ xmodmap:

keycode 110 = Prior
keycode 115 = Delete
keycode 112 = Next
keycode 117 = Insert
keycode 119 = End
keycode 118 = Home

แต่ฉันต้องการใช้ XKB และกำหนดชื่อสัญลักษณ์ที่แตกต่างกันสำหรับฟิสิคัลคีย์บางตัวแทนที่จะกำหนด keysyms ที่แตกต่างให้กับคีย์โค้ดบางตัว ( นี่คือเหตุผลว่าทำไม.) ฉันต้องการ keycode 110 เพื่อส่งPGUPแทนHOME, keycode 115 เพื่อส่งDELEแทนENDฯลฯ ส่วนที่เหลือของการกำหนดค่าจะต้องไม่ได้รับผลกระทบ (ดังนั้นPGUPเพื่อให้การส่ง keysym Priorฯลฯ และกุญแจอื่น ๆ ทั้งหมดยังคงอยู่ ที่พวกเขาเป็น).

ฉันจะเปลี่ยนการกำหนดรหัสคีย์เฉพาะเหล่านี้ได้อย่างไร ฉันจะโหลดไฟล์ด้วยxkbcomp somefile.xkb $DISPLAYฉันต้องใส่somefile.xkbอะไรลงไป

คำตอบ:


14

สร้างไฟล์ที่มีการเปลี่ยนแปลง keycode ของคุณและบันทึกเป็น ~/.xkb/keycodes/local(ตัวอย่าง) ( keycodesไดเรกทอรีนั้นเข้ารหัสไว้ยากไดเรกทอรีฐานอาจเป็นอย่างอื่นและชื่อไฟล์ก็ได้) สิ่งนี้จะมีอยู่ในกรณีของคุณ

xkb_keycodes {
  <PGUP> = 110;
  <PGDN> = 112;
  <DELE> = 115;
  <INS> = 117;
  <HOME> = 118;
  <END> = 119;
};

หากต้องการโหลดสิ่งนี้ให้เรียกใช้

setxkbmap -print | sed -e '/xkb_keycodes/s/"[[:space:]]/+local&/' | xkbcomp -I${HOME}/.xkb - $DISPLAY

สิ่งนี้จะออกการตั้งค่าปัจจุบันของคุณเพิ่ม+localลงในxkb_keycodes includeคำสั่งและโหลดลงในคอมไพเลอร์ XKB เพิ่ม~/.xkbไปยังเส้นทางรวม (หากคุณตั้งชื่อไฟล์เป็นอย่างอื่น~/.xkb/keycodes/localคุณจะต้องเปลี่ยน+localและ-I${HOME}/.xkb}.) วิธีการตั้งค่าอื่น ๆ ทั้งหมดจะถูกเก็บรักษาไว้


1
ดังนั้นนี้เป็นเส้นทางที่คาดหวังและวิธีการที่จะผ่านไปยัง-Iสวิทช์! ขอบคุณฉันไม่สามารถเข้าใจสิ่งนี้จาก manpage
L. Levrel

ทำงานเหมือนจับใจ! มันทำงานได้ถ้าต้องการอัปเดต xkb_symbols เพียงแทนที่ xkb_keycodes ด้วยทำงานได้
zw963

5

คุณสามารถเริ่มต้นsetxkbmap -print > somefile.xkbเพื่อรับ keymap ที่คุณใช้เป็นฐานแล้วกำหนดชื่อคีย์ที่คุณต้องการในxkb_keycodesส่วนดังนี้:

xkb_keymap {
 xkb_keycodes {
  include "evdev+aliases(azerty)"
  // Custom <key name> = keycode
  <INS> = 117;
  <HOME> = 118;
  <PGUP> = 110;
  <DELE> = 115;
  <END> = 119;
  <PGDN> = 112;
 };
 xkb_types { include "complete"};
 xkb_compatibility { include "complete"};
 xkb_symbols { include "pc+fr+inet(evdev)"};
 xkb_geometry { include "pc(pc104)"};
};

สิ่งนี้สร้างคำเตือนว่าชื่อคีย์บางรายการได้รับมอบหมายหลายครั้ง แต่ใช้งานได้เพราะมีเพียงหนึ่งครั้งที่ผ่านมาเท่านั้น และไฟล์มีข้อได้เปรียบในการอ่าน

อีกวิธีหนึ่งคือการดัมพ์ keymap ที่คุณใช้เป็นไฟล์: xkbcomp $DISPLAY somefile.xkbและแก้ไขบรรทัดเดียวกัน (เป็น keymap เดียวกันกับการประเมินรวม) วิธีนี้ไม่มีคำเตือนสำหรับหลายคำนิยาม แต่อ่านได้น้อยกว่า


1
ชื่อเหล่านี้ ( evdev+aliases(azerty)ฯลฯ ) มาจากไหน ฉันต้องการดำเนินการเปลี่ยนแปลงสัมพัทธ์อย่างชัดเจนไม่ใช่การกำหนดค่าใหม่ทั้งหมด คีย์อื่นที่ไม่ใช่ 6 ที่อยู่ในคำถามจะต้องไม่ได้รับผลกระทบพวกเขาจะต้องอยู่ในสถานะที่พวกเขาอยู่เมื่อฉันออกคำสั่ง
Gilles 'หยุดความชั่วร้าย'

1
พวกเขามาจากพวกเขาเป็นไฟล์จากsetxkbmap -print /usr/share/X11/xkb/ฉันคิดว่าคุณต้องให้ keymap ทั้งหมดxkbcompแต่ฉันอาจผิด ...
Leiaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.