Bagaimana cara memetakan kembali caps lock secara permanen ke esc di X11?

9

Saya ingin memetakan ulang caps lock untuk melarikan diri di X11 (yaitu dengan menekan tombol caps lock fisik akan diartikan sebagai esc oleh aplikasi dan perilaku esc tidak akan berubah). Solusinya harus bertahan X restart . xmodmap dan setxkbmap adalah solusi yang dapat diterima (seperti halnya program serupa). Saya tidak ingin berurusan dengan GUI, karena saya ingin solusi menjadi portabel dan merupakan bagian dari dotfile saya. Jika saya melewatkan solusi yang lebih baik / lebih mudah / lebih jelas, tolong katakan padaku, meskipun perlu dicatat bahwa saya tidak menggunakan DE (mencoba i3wm).

Sejauh ini saya sudah mencoba menggunakan xmodmap dan setxkbmap dengan sedikit keberhasilan.

Inilah upaya saya menggunakan xmodmap:

# ~/.xinitrc
xmodmap ~/.xmodmap

dan

# ~/.xmodmap
remove Lock = Caps_Lock
keysym Caps_Lock = Escape

Menjalankan $ xmodmap ~/.xmodmapdari baris perintah berfungsi dan melakukan apa yang saya inginkan. Masalahnya adalah ini akan diset ulang setiap kali x restart. Di situlah saya mengharapkan xinitrc masuk - bukankah seharusnya memuat setiap kali x memulai dan menjalankan perintah xmodmap? Jika perintah itu berfungsi, mengapa tidak melakukan apa-apa saat membaca dari sebuah file?

Saya sudah mencoba beberapa hal dengan setxkbmap, tidak ada yang berhasil. Dua upaya di bawah ini ada di file pada waktu yang berbeda.

# ~/.xinitrc
setxkbmap -option caps:esc     # attempt 1
setxkbmap -option esc:nocaps   # attempt 2

Tidak ada perintah yang melakukan sesuatu yang dapat dilihat dari baris perintah, jadi saya berasumsi bahwa saya salah mengartikannya. Saya suka ide solusi ini karena ini adalah one-liner dan tidak memerlukan apa pun di beberapa file lain. Kalau saja itu berhasil.

Apakah .xinitrc file yang salah untuk digunakan? Saya tahu startx sedang memuat dari ~ / .xinitrc.

Saya meminta solusi yang mungkin berisi seluruh file, bukan hanya satu baris (jika lebih dari satu diperlukan dalam file) jadi saya tidak mengacaukan beberapa langkah perantara. Misalnya, jika saya memerlukan sesuatu di .xinitrc dan sesuatu di .xcapsrebind, tolong tunjukkan kedua file dan semua konten yang diperlukan (saya juga dapat menangani diberitahu untuk menambahkan sesuatu sampai akhir, tetapi jika & & sejenisnya mungkin diperlukan, tolong beritahu aku).

ethanmad
sumber
2
Dalam .xinitrc:setxkbmap -option caps:escape
jasonwryan
1
Menjalankan xmodmapdi .xinitrcharus bekerja. Itu yang saya lakukan. Mungkin memetakan sesuatu yang tidak biasa, untuk memastikan bahwa itu benar-benar berjalan ketika Anda mulai x? Juga, window manager / lingkungan desktop apa yang Anda gunakan? KDE secara berkala “mengoreksi” pemetaan keyboard saya tanpa saya beri tahu. Mungkin periksa pengaturan desktop Anda untuk memastikan tidak ada yang berjalan di xmodmapbelakang Anda.
yellowantphil
jasonwryan: Mencoba itu di kedua .xinitrc; tidak bekerja Itu berhasil dari baris perintah! Jadi ada awal. Saya pikir yellowantphil benar - ~/.xinitrctidak dijalankan. Saya menggunakan i3wm dan tidak ada DE sekarang, meskipun hal yang sama terjadi di Pantheon ketika saya mencoba. Sejauh yang saya tahu, i3 tidak mengacaukan xinitrc atau memuat sendiri (tapi saya seorang noob, jadi apa yang saya tahu?).
ethanmad
Anda juga dapat mencoba memasukkan Option "XkbOptions" "caps:escape"dalam Xfile konfigurasi keyboard, mis./etc/X11/xorg.conf.d/10-keyboard.conf
don_crissti

Jawaban:

5

EDIT: Seperti yang ditunjukkan oleh pengguna yang membantu, solusi awal saya tidak akan bertahan dari pembaruan. Solusi-nya dalam komentar harus bekerja. Jika Anda lebih suka menukar Caps Lock dan Escape sebagai gantinya, saya akan merekomendasikan menambahkan perintah berikut dari .xinitrc atau dari konfigurasi i3 Anda:

.xinitrc:

xmodmap -e "clear lock"
xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
xmodmap -e "keycode 66 = Escape NoSymbol Escape"

file konfigurasi i3 (biasanya terletak di .config / i3 / config atau di .i3 / config)

# swap caps lock and escape
exec_always --no-startup-id xmodmap -e "clear lock"
exec_always --no-startup-id xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
exec_always --no-startup-id xmodmap -e "keycode 66 = Escape NoSymbol Escape"

Saya menyadari pertanyaan ini sudah cukup lama, tetapi saya pikir saya mungkin menambahkan jawaban bagi kita yang masih mencoba mencari tahu.

Setelah mengalami masalah serupa dengan beberapa DE yang tidak dimuat ~/.xinitrc, saya menghindari xmodmap sama sekali, pergi ke /usr/share/X11/xkb/symbolsdan memodifikasi pemetaan simbol key => secara langsung.

Untuk melakukannya, saya mengedit file konfigurasi untuk keyboard saya yang terletak di /usr/share/X11/xkb/symbols. Untuk sebagian besar keyboard, ini harus berupa pcfile.

Setelah membuka file, saya secara manual beralih Escape dan Caps_Lock untuk kunci masing-masing hasilnya ditunjukkan di bawah). Karena ini memengaruhi bagaimana X memetakan perangkat keras ke simbol utama, itu harus berfungsi terlepas dari apakah Anda menggunakan GNOME atau i3 atau semacamnya.

Cuplikan dari file yang saya hasilkan adalah sebagai berikut:

default  partial alphanumeric_keys modifier_keys

xkb_symbols "pc105" {

    key <ESC>  {        [ Caps_Lock             ]       };

    // The extra key on many European keyboards:
    key <LSGT> {        [ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {        [ backslash,    bar     ]       };
    key <SPCE> {        [        space          ]       };

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {        [ BackSpace, BackSpace  ]       };

    key  <TAB> {        [ Tab,  ISO_Left_Tab    ]       };
    key <RTRN> {        [ Return                ]       };

    key <CAPS> {        [ Escape                ]       };
    key <NMLK> {        [ Num_Lock              ]       };

    key <LFSH> {        [ Shift_L               ]       };
    key <LCTL> {        [ Control_L             ]       };
    key <LWIN> {        [ Super_L               ]       };

    key <RTSH> {        [ Shift_R               ]       };
    key <RCTL> {        [ Control_R             ]       };
    key <RWIN> {        [ Super_R               ]       };
    key <MENU> {        [ Menu                  ]       };

Ini bekerja seperti pesona bagi saya.

Saat melihat-lihat file terkait, saya menemukan menyebutkan berulang dan implementasi parsial semacam bendera yang digunakan untuk beralih di sekitar tombol tertentu, seperti bertukar Escape dan Caps Lock. Saya berasumsi inilah yang digunakan oleh Gnome Tweak Tool dan setxkbmap; Namun, saya tidak tahu bagaimana menjaga bendera ini tetap menyala dengan i3 window manager. Solusi di atas seharusnya bekerja dengan baik.

Semoga ini memperbaiki masalah!

capsloch
sumber
dalam konfigurasi i3 Anda:exec --no-startup-id setxkbmap -layout whatever -variant whatever -option caps:escape
quixotic
perhatikan bahwa perubahan Anda pada ...xkb/symbols/pcfile sistem akan ditimpa saat berikutnya xkeyboard-configatau xkb-datapaket diperbarui.
quixotic
1

Dua kemungkinan:

1) .xinitrctidak dijalankan - ini digunakan oleh xinit, startx, dan beberapa metode lain untuk memulai sesi X, tetapi tidak didukung secara universal - Anda mungkin menggunakan manajer tampilan yang tidak menjalankannya. Menambahkan sesuatu ke .xinitrc seperti touch /tmp/xinitrc-was-rundapat membantu menentukan apakah itu masalahnya.

2) Xorg secara otomatis me-reset ke pengaturan default ketika tidak ada klien yang terhubung - jika .xinitrc selesai sebelum window manager atau apa pun mulai berjalan, maka perubahan xmodmap atau setxkbmap akan hilang.

Jika ada opsi XKB yang sudah ditentukan yang ingin Anda gunakan, alih-alih menjalankan program untuk mengubah pengaturan setiap kali Xorg dimulai, Anda bisa memberi tahu Xorg untuk memulai dengan pengaturan yang tepat. Misalnya, untuk mengaktifkan kunci Ctrl-Alt-Backspace untuk membunuh Xserver saya, saya telah menginstal file bernama /etc/X11/xorg.conf.d/90-zap.confyang berisi:

# This configuration snippet enables the Ctrl-Alt-Backspace server kill key
# 
# To use it, link or copy into /etc/X11/xorg.conf.d/
#
# Note that only the last XkbOptions setting seen for a device will be used,
# so to use multiple options, copy this file and add options into the Option
# string, such as "terminate:ctrl_alt_bksp,ctrl:swapcaps"

Section "InputClass"
    Identifier "keyboard zap by default"
    MatchIsKeyboard "on"

    Option "XKbOptions" "terminate:ctrl_alt_bksp"
EndSection

Anda dapat membaca lebih lanjut tentang ini di dokumen X.Org di https://www.x.org/releases/X11R7.7/doc/xorg-docs/input/XKB-Config.html .

alanc
sumber