Ganti beberapa kode kunci dengan XKB

10

Saya ingin mengocok beberapa tombol dengan XKB. (Kenapa? Di laptop di mana beberapa tombol berada dengan nyaman.) Saat ini saya menggunakan xmodmap:

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

Alih-alih, saya ingin menggunakan XKB dan menetapkan nama simbolis yang berbeda untuk kunci fisik tertentu, daripada menetapkan keyyms yang berbeda untuk kode kunci tertentu. ( Inilah sebabnya.) Saya ingin mengirim keycode 110 PGUPalih-alih HOME, keycode 115 untuk mengirim DELEalih-alih END, dll. Sisa konfigurasi tidak boleh terpengaruh (demikian PGUPjuga untuk tetap mengirim keysym Prior, dll., Dan semua kunci lainnya tetap ada sebagaimana mereka).

Bagaimana saya bisa mengubah tugas kode kunci tertentu ini? Saya akan memuat file dengan xkbcomp somefile.xkb $DISPLAY, apa yang harus saya masukkan somefile.xkb?

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

14

Buat file yang berisi perubahan kode kunci Anda, dan simpan sebagai (misalnya) ~/.xkb/keycodes/local. ( keycodesDirektori ini hard-coded; direktori dasar dapat menjadi sesuatu yang lain, dan nama file juga.) Ini akan berisi dalam kasus Anda

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

Untuk memuat ini, jalankan

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

Ini output pengaturan Anda saat ini, menambahkan +localuntuk xkb_keycodes includepernyataan, dan beban itu ke dalam compiler XKB, menambahkan ~/.xkbke path include. (Jika Anda memberi nama file Anda sesuatu selain ~/.xkb/keycodes/local, Anda jelas perlu mengubah +localdan -I${HOME}/.xkb}.) Dengan begitu semua pengaturan lainnya dipertahankan.

Stephen Kitt
sumber
1
Jadi ini adalah jalan yang diharapkan dan cara untuk meneruskannya ke -Isakelar! Terima kasih, saya tidak dapat menemukan ini dari halaman manual.
L. Levrel
bekerja seperti pesona! itu berfungsi jika ingin memperbarui xkb_symbols, cukup ganti xkb_keycodes dengan itu, berhasil
zw963
5

Anda dapat mulai dengan setxkbmap -print > somefile.xkbmendapatkan keymap yang Anda gunakan sebagai basis, dan kemudian mendefinisikan kembali nama-nama kunci yang Anda inginkan di xkb_keycodesbagian seperti ini:

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)"};
};

Ini menghasilkan peringatan bahwa beberapa nama kunci diberikan beberapa kali, tetapi ini berfungsi karena hanya yang terakhir yang dihitung (jadi penting untuk menempatkan pengaturan khusus setelah penyertaan). Dan file tersebut memiliki keuntungan dibaca.

Cara lain adalah dengan membuang keymap yang Anda gunakan ke dalam file: xkbcomp $DISPLAY somefile.xkbdan memodifikasi baris yang sama (itu adalah keymap yang sama dengan menyertakan dievaluasi). Dengan cara ini tidak ada peringatan untuk banyak definisi, tetapi tidak terlalu mudah dibaca.

Leiaz
sumber
1
Dari mana semua nama ini ( evdev+aliases(azerty), dll.) Berasal? Saya secara eksplisit ingin melakukan perubahan relatif, bukan konfigurasi ulang penuh. Kunci selain 6 yang tercantum dalam pertanyaan tidak boleh terpengaruh, mereka harus tetap dalam keadaan ketika saya mengeluarkan perintah.
Gilles 'SO- stop being evil'
1
Mereka berasal dari setxkbmap -print, mereka adalah file dari /usr/share/X11/xkb/. Saya pikir Anda harus memberikan seluruh keymap xkbcomptapi saya bisa saja salah ...
Leiaz