Comment remapper définitivement le verrouillage des majuscules pour échapper dans X11?

9

Je veux remapper le verrouillage des majuscules pour qu'il s'échappe dans X11 (c'est-à-dire que le fait d'appuyer sur le bouton de verrouillage des majuscules physiques sera interprété comme esc par les applications et le comportement de esc ne changera pas). La solution doit survivre à un redémarrage de X . xmodmap et setxkbmap sont des solutions acceptables (tout comme des programmes similaires). Je ne veux pas traiter avec une interface graphique, car je veux que la solution soit portable et fasse partie de mes fichiers dot. Si je manque une solution meilleure / plus facile / plus évidente, dites-le-moi, mais notez que je n'utilise pas de DE (j'essaye i3wm).

Jusqu'à présent, j'ai essayé d'utiliser xmodmap et setxkbmap avec peu de succès.

Voici ma tentative d'utilisation de xmodmap:

# ~/.xinitrc
xmodmap ~/.xmodmap

et

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

Exécuter à $ xmodmap ~/.xmodmappartir de la ligne de commande fonctionne et fait ce que je veux. Le problème est que cela est réinitialisé à chaque redémarrage de x. C'est là que je m'attends à ce que le xinitrc entre - ne devrait-il pas se charger à chaque démarrage de x et exécuter la commande xmodmap? Si la commande fonctionne, pourquoi ne fait-elle rien lorsqu'elle est lue à partir d'un fichier?

J'ai essayé deux ou trois choses avec setxkbmap, mais aucune n'a fonctionné. Les deux tentatives ci-dessous figuraient dans le dossier à des moments différents.

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

Aucune des commandes n'a fait quoi que ce soit de perceptible à partir de la ligne de commande, donc je suppose que j'ai mal la commande. J'aime l'idée de cette solution car elle est monoligne et ne nécessite rien dans un autre fichier. Si seulement ça marchait.

Est-ce que .xinitrc est le mauvais fichier à utiliser? Je sais que startx se charge depuis ~ / .xinitrc.

Je demande que les solutions possibles contiennent le (s) fichier (s) entier (s), pas seulement une ligne (si plus d'un est requis dans le fichier) donc je ne gâche pas une étape intermédiaire. Par exemple, si j'ai besoin de quelque chose en .xinitrc et de quelque chose en .xcapsrebind, veuillez montrer les deux fichiers et tout le contenu requis (je peux aussi gérer qu'on me dise d'ajouter quelque chose à la fin, mais si un & ou similaire peut être requis, s'il vous plaît dites-moi).

ethanmad
la source
2
Dans .xinitrc:setxkbmap -option caps:escape
jasonwryan
1
Courir xmodmapen .xinitrcdevrait fonctionner. C'est ce que je fais. Peut-être mappez-vous quelque chose d'inhabituel, pour vous assurer qu'il fonctionne réellement lorsque vous démarrez x? De plus, quel gestionnaire de fenêtres / environnement de bureau utilisez-vous? KDE «corrige» périodiquement le mappage de mon clavier sans que je le lui dise. Vérifiez peut-être les paramètres de votre bureau pour vous assurer que rien ne tourne xmodmapderrière votre dos.
yellowantphil
jasonwryan: J'ai essayé cela dans les deux .xinitrc; n'a pas fonctionné. Cela a fonctionné à partir de la ligne de commande! Il y a donc un début. Je pense que le yellowantphil a raison - ~/.xinitrcne se fait pas fuir. J'utilise i3wm et aucun DE en ce moment, bien que la même chose se produise au Panthéon lorsque j'ai essayé. Pour autant que je sache, i3 ne joue pas avec le xinitrc ou ne charge pas le sien (mais je suis un noob, alors qu'est-ce que je sais?).
ethanmad
Vous pouvez aussi essayer d'inclure Option "XkbOptions" "caps:escape"dans un Xfichier de configuration du clavier, par exemple/etc/X11/xorg.conf.d/10-keyboard.conf
don_crissti

Réponses:

5

EDIT: Comme l'a souligné un utilisateur utile, ma solution initiale ne survivra pas à une mise à jour. Sa solution dans les commentaires devrait fonctionner. Si vous préférez permuter Caps Lock et Escape à la place, je recommanderais d'ajouter les commandes suivantes à partir de votre configuration .xinitrc ou i3:

.xinitrc:

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

Fichier de configuration i3 (généralement situé dans .config / i3 / config ou dans .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"

Je me rends compte que cette question est assez ancienne, mais j'ai pensé que je pourrais ajouter une réponse pour ceux d'entre nous qui essayent encore de comprendre cela.

Après avoir rencontré des problèmes similaires avec certains DE qui ne se chargeaient pas ~/.xinitrc, j'ai complètement évité xmodmap, je suis allé directement et j'ai /usr/share/X11/xkb/symbolsmodifié le mappage key => symbol.

Pour ce faire, j'ai édité le fichier de configuration de mon clavier situé à /usr/share/X11/xkb/symbols. Pour la plupart des claviers, ce devrait être le pcfichier.

Après avoir ouvert le fichier, j'ai basculé manuellement autour de Escape et Caps_Lock pour leurs clés respectives, le résultat est indiqué ci-dessous). Comme cela affecte la façon dont X mappe le matériel au symbole clé, cela devrait fonctionner, que vous soyez sur GNOME ou i3 ou quelque chose comme ça.

Un extrait de mon fichier résultant est le suivant:

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                  ]       };

Cela a fonctionné comme un charme pour moi.

En parcourant les fichiers associés, j'ai trouvé des mentions répétées et des implémentations partielles d'une sorte d'indicateur utilisé pour basculer autour de certaines clés, telles que l'échange Escape et Caps Lock. Je suppose que c'est ce que Gnome Tweak Tool et setxkbmap utilisent; cependant, je ne pouvais pas comprendre comment garder ces drapeaux avec le gestionnaire de fenêtres i3. La solution ci-dessus devrait fonctionner correctement.

J'espère que cela résout le problème!

capsloch
la source
dans votre configuration i3:exec --no-startup-id setxkbmap -layout whatever -variant whatever -option caps:escape
quixotic
notez que vos modifications apportées au ...xkb/symbols/pcfichier système seront écrasées la prochaine fois xkeyboard-configou que les xkb-datapackages seront mis à jour.
Don Quichotte
1

Deux possibilités:

1) .xinitrcn'est pas en cours d'exécution - il est utilisé par xinit, startx et quelques autres méthodes pour démarrer des sessions X, mais n'est pas universellement pris en charge - vous utilisez peut-être un gestionnaire d'affichage qui ne l'exécute pas. Ajouter quelque chose à .xinitrc comme cela touch /tmp/xinitrc-was-runpeut aider à déterminer si c'est le cas.

2) Xorg réinitialise automatiquement les paramètres par défaut lorsqu'aucun client n'est connecté - si le .xinitrc se termine avant que le gestionnaire de fenêtres ou quoi que ce soit ne démarre, les modifications de xmodmap ou setxkbmap seront perdues.

S'il y a une option XKB déjà définie que vous souhaitez utiliser, au lieu d'exécuter des programmes pour changer le paramètre à chaque démarrage de Xorg, vous pouvez simplement dire à Xorg de démarrer avec les bons paramètres déjà. Par exemple, afin d'activer les touches Ctrl-Alt-Backspace pour tuer mon Xserver, j'ai installé un fichier nommé /etc/X11/xorg.conf.d/90-zap.confqui contient:

# 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

Vous pouvez en savoir plus à ce sujet dans les documents X.Org à https://www.x.org/releases/X11R7.7/doc/xorg-docs/input/XKB-Config.html .

alanc
la source