Liaison Super + C Super + V pour copier et coller

23

Depuis un certain temps, je suis intéressé à lier la clé Windows (Super_L) de mon clavier à copier et coller pour aucune autre raison que la commodité et la cohérence entre mon bureau et mon MacBook.

Je pensais que j'étais proche après avoir lu sur xmodmap et exécuté ce qui suit:

$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode  133 = Mode_switch"

$ # map Mode_switch+c to copy
$ xmodmap -e "keycode  54 = c C XF86_Copy C"

$ # map Mode_switch+v to paste
$ xmodmap -e "keycode  55 = v V XF86_Paste V"

Malheureusement, XF86Copy et XF86Paste ne semblent pas fonctionner du tout. Ils sont répertoriés dans /usr/include/X11/XF86keysym.het xevmontrent que la séquence de touches est interprétée par X comme XF86Paste et XF86Copy, ces symboles fonctionnent-ils réellement? Doivent-ils avoir une prise en charge au niveau de l'application?

solo
la source

Réponses:

18

Liaison de Super à Ctrl

Qu'en est-il de lier votre Windows/Logo/Supertouche gauche pour agir comme une autre Ctrlclé?

Vous pouvez y parvenir avec les commandes xmodmap suivantes:

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L

En supposant que vous avez enregistré les lignes ci-dessus, super_as_ctrl.xmodmapvous pouvez tester l'effet en exécutant

xmodmap super_as_ctrl.xmodmap

Pour rendre la modification permanente (reconnexion / redémarrage survivante), renommez le fichier .Xmodmapdans votre dossier personnel.

(Ce qui précède a été testé sur le système live Ubuntu 11.10, mais il devrait être le même pour les autres distributions Linux)


Réglage des raccourcis Copier / Coller pour votre programme de terminal

Ayant lié Superà Ctrlvous pouvez maintenant utiliser Super-Cpour copier presque partout. La seule exception courante est votre programme de terminal. Cependant, vous pouvez y redéfinir les raccourcis.

J'ai découvert que même gnome-terminalcette option était disponible (je n'en avais pas jusqu'à ce que je m'y habitue de Ctrl-Shift-Ctoute façon). Dans le cas où vous l'utilisez, allez Edit / Keyboard Shortcuts...dans le menu et affectez-le Ctrl-Cà copier et Ctrl-Và coller. Devrait être similaire pour konsoleetc.

Et ne vous inquiétez pas, vous ne perdrez pas la possibilité de terminer un programme à l'aide d'un raccourci. Après avoir lié à nouveau le raccourci de copie pour le terminal, vous pouvez simplement l'utiliser Ctrl-Shift-Ccomme vous l'avez utilisé Ctrl-Cauparavant. Le terminal ne distingue pas ici si Shift est enfoncé ou non. Et le raccourci n'est plus pris pour la copie. Vous pouvez également relier la terminaison à un autre raccourci, comme le suggère MountainX dans sa réponse.


XF86Copy etc. ne fonctionne pas

Concernant les symboles clés du copier-coller: Apparemment, ils n'ont aucun effet. Je l'ai testé rapidement en affectant l'action de copie à Shift-ScrollLock (elle n'était pas utilisée et je voulais tester avec une touche non modificatrice):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Le presser n'a eu aucun effet, ni avec XF86AudioMute. Cependant, cela a fonctionné lors de l'attribution de la lettre «a». Je suppose donc qu'il y a un problème spécifique avec ces symboles clés spéciaux XF86.

zpea
la source
3
Malheureusement, même si je lie Super à Ctrl, je devrai toujours utiliser Ctrl / Super + Shift + C pour copier et coller à l'intérieur du terminal, ce qui est une incitation principale. Merci de confirmer que les clés XF86 ne fonctionnent pas.
solo
Quel programme terminal utilisez-vous? J'ai ajouté une solution qui fonctionne au moins avec gnome-terminal. Et cela devrait être similaire pour les autres.
zpea
4
Le contrôle de liaison à Meta n'est pas identique au changement de raccourci pour copier / coller à Meta + c / v. Je veux faire des raccourcis kboard pour MacOs comme Linux, donc cette réponse n'est pas superbe ...
Sonique
1
Shift + ctrl + c ou tout ce qui est trop maladroit, et le simple fait de relier Super à Ctrl enverra le signal de mise à mort avec Super + c de sorte que cela ne résout pas vraiment grand
rien333
la première étape est approximativement ce que j'ai fait pour transformer super / command en contrôle. Cela corrige la plupart des choses, mais j'aimerais toujours que cmd-c et ctrl-c aient des fonctions différentes, même si cmd signifie ctrl ailleurs. Je ne sais pas si je peux le faire avec xmodmap et les raccourcis spécifiques aux terminaux.
tedder42
10

Si vous voulez lier seulement quelques séquences de la forme Super + x, Super + c, Super + v à d'autres séquences comme Ctrl + x, Ctrl + c, Ctrl + v, par exemple pour que (comme l'OP le souhaite) ces certaines séquences de Super-clés seront généralement mappées pour couper et coller sans affecter les autres utilisations de la Super clé sur votre système, il est possible d'utiliser uniquement l'extension XKB. La procédure ci-dessous décrit les étapes et donne deux exemples différents des détails de deux configurations de clavier de démarrage différentes; nous espérons que cela fournira suffisamment d'informations pour s'adapter à votre système. Il suppose que vous êtes à l'aise avec la création et la modification de fichiers sur votre système, y compris ceux qui se trouvent dans des emplacements système comme /usr/share/X11/xkb.

  1. Décidez où vous souhaitez que votre arborescence de configuration XKB réside. Trouvez d'abord le système. Il se trouve généralement dans / usr / share / X11 / xkb, et je ne sais pas trop comment le trouver s'il n'est pas là; vous pouvez simplement rechercher dans votre système des répertoires nommés "xkb". Quoi qu'il en soit, une fois que vous l'avez trouvé, vous pouvez soit modifier le système en place, soit utiliser n'importe quel répertoire de votre choix. L'avantage d'utiliser le répertoire système est que vous pouvez invoquer vos modifications beaucoup plus facilement, mais l'inconvénient est que les futures mises à jour du système peuvent écraser vos modifications (vous avez été averti). Dans tous les cas, tous les noms de fichiers mentionnés ci-après sont relatifs à ce répertoire, que j'appellerai en cas de besoin $ XKBLOCAL $, et toutes les commandes supposent que c'est votre répertoire actuel.

  2. Déterminez quel "type" de clé XKB sont les clés x, c, v actuelles. La façon la plus simple de le faire est via la commande xkbcomp -a $DISPLAY - | grep -C 6 c,(notez que la virgule est intentionnellement incluse dans le modèle). Dans mon premier exemple d'installation, cela produit:

    key <AB02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               x,               X ]
    };
    key <AB03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               c,               C ]
    };
    key <AB04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               v,               V ]
    };
    key <AB05> {
    

    alors que dans mon autre exemple de configuration, cela produit

    key <AB02> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               x,               X, approxeq,     dead_ogonek ]
    };
    key <AB03> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               c,               C, ccedilla,        Ccedilla ]
    };
    key <AB04> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               v,               V, squareroot,           U25CA ]
    };
    key <AB05> {
    

    Le résultat est que dans le premier exemple, les clés pertinentes sont de type "ALPHABETIC" tandis que dans le deuxième exemple, elles sont de type "FOUR_LEVEL". Selon la configuration de votre clavier, vous constaterez peut-être qu'ils sont d'un autre type. Dans ce qui suit, le type sera appelé $ TYPE $, que vous devez remplacer par la chaîne réelle ALPHABETIC ou autre dans les commandes ci-dessous.

  3. Recherchez la définition de $ TYPE $ et copiez-la dans un nouveau fichier dans le répertoire $ XKBLOCAL $ / types. Voici une commande qui fait exactement cela: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. Le nom du fichier "cutpaste" que j'ai choisi est arbitraire, utilisez le nom que vous voulez, mais notez que vous devrez vous référer systématiquement à ce fichier dans les étapes ultérieures. Dans la première configuration, ce fichier obtient le contenu

    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    

    et dans l'autre exemple, il obtient le contenu

    type "FOUR_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    
  4. Modifiez les types de fichiers / cutpaste pour faire deux choses: ajoutez un préambule et un postambule qui en font une clause XKB appropriée, et modifiez le nom du type et la définition de type pour ajouter un niveau supplémentaire produit par le modificateur correspondant à Super. Vous devriez vérifier ce que ce modificateur est sur votre système, il s'agit probablement de Mod4 tel qu'utilisé ci-dessous. Les modifications nécessaires doivent être évidentes à partir des deux exemples de versions finales de types / cutpaste, à savoir:

    default partial xkb_types "addsuper" {
        type "ALPHABETIC_SUPER" {
            modifiers= Shift+Lock+Mod4;
            map[Shift]= Level2;
            map[Lock]= Level2;
            map[Mod4]= Level3;
            map[Shift+Mod4]= Level3;
            map[Lock+Mod4]= Level3;
            level_name[Level1]= "Base";
            level_name[Level2]= "Caps";
            level_name[Level3]= "With Super";
        };
    };
    

    et

    default partial xkb_types "addsuper" {
        type "FOUR_LEVEL_SUPER" {
            modifiers= Shift+LevelThree+Mod4;
            map[Shift]= Level2;
            map[LevelThree]= Level3;
            map[Shift+LevelThree]= Level4;
            map[Mod4]= Level5;
            map[Shift+Mod4] = Level5;
            map[LevelThree+Mod4] = Level5;
            map[Shift+LevelThree+Mod4] = Level5;
            level_name[Level1]= "Base";
            level_name[Level2]= "Shift";
            level_name[Level3]= "Alt Base";
            level_name[Level4]= "Shift Alt";
            level_name[Level5]= "With Super"';
       };
    };
    
  5. Copiez les définitions de symboles clés qui ont été générées par grep dans la deuxième étape dans un deuxième nouveau fichier de symboles / coupe-pâte, et ajoutez un préambule et un postambule similaires, et modifiez les définitions pour utiliser les nouveaux types et ajoutez des actions à la définition pour gérer la clé souhaitée produite par les versions Super. Les résultats de ceci dans nos deux exemples sont:

    default partial xkb_symbols "superversions" {
        replace key <AB02> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               x,               X, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               c,               C, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               v,               V, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    et

    default partial xkb_symbols "superversions" {
        replace key <AB02> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    Notez que dans le deuxième exemple, j'ai également supprimé certains des espaces (non significatifs) pour garder la longueur de la ligne sous un peu de contrôle.

  6. Recherchez le nom de l'ensemble de règles que XKB utilise actuellement. C'est facile, c'est montré dans le résultat de setxkbmap -query. Dans mon cas, c'était "evdev".

  7. Copiez la version système de rules / evdev (ou quel que soit le nom de votre ensemble de règles) dans $ XKBLOCAL $ / rules / evdev et ajoutez des règles pointant vers les options que nous avons créées. Vous avez deux choix ici: vous pouvez copier tout evdev ou seulement les parties mentionnant le modèle de clavier, la disposition, la variante et les options que vous utilisez réellement. Bien sûr, si vous modifiez les fichiers système en place, vous n'avez pas besoin de faire de copie, juste d'éditer.

    Dans ce cas, ce qui est ajouté est identique quelle que soit la configuration initiale du clavier, il n'y a donc qu'un seul exemple. Vous trouvez la section du fichier de règles qui commence par ! option = symbolset ajoutez une ligne cutpaste:super = +cutpasteà cette section, et vous trouvez également la section du fichier de règles qui commence par ! option = typeset une ligne cutpaste:super = +cutpasteà cette section également.

  8. Copiez la version système de evdev.lst et ajoutez une ligne pour votre nouvelle option. Notez que le nom de ce fichier correspond simplement au nom du fichier de règles avec .lst ajouté. Comme à l'étape précédente, vous pouvez copier l'intégralité du fichier ou uniquement la partie référencée par le modèle, la disposition, la variante et les options que vous utilisez. Il vous suffit de trouver la section de ce fichier qui commence par ! optionet d'ajouter une ligne comme celle-ci: cutpaste:super Add super equivalents of cut and paste operationsà cette section.

  9. OK, maintenant tous les fichiers de configuration sont en place. Si vous avez modifié les fichiers système, vous pouvez maintenant invoquer votre nouvelle option avec setxkbmap -option cutpaste:super. En revanche, si vous ne l'avez pas fait, vous devez indiquer à setxkbmap où se trouve votre répertoire $ XKBLOCAL $. Pire encore, le serveur ne sait pas non plus où se trouve ce répertoire, et setxkbmap ne le dit pas (ou peut-être pas, car finalement le serveur peut fonctionner sur une autre machine). Vous devez donc diriger la sortie de setxkbmap vers xkbcomp, et également indiquer à cette commande où se trouve votre répertoire $ XKBLOCAL. La ligne de commande complète est donc setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

J'espère que cela peut aider / intéresser quelqu'un, car la bonne documentation / référence XKB définitive est rare. Une référence très utile était http://madduck.net/docs/extending-xkb/ .

Glen Whitney
la source
Excellente réponse. Cela a fonctionné pour moi en 17.10
blockloop
Cela n'a pas fonctionné pour moi sur Ubuntu 18.04. Le résultat était simplement que les touches «c», «x» et «v» ne fonctionnaient plus. J'ai pu les faire retravailler setxkbmap -option. Ma configuration locale était presque identique à l'exemple FOUR_LEVEL à l'exception de certains symboles Group2, Group3 que j'ai omis du fichier de symboles partiels, mon fichier ressemblait donc aux exemples.
JinnKo
2

Voici ce que je fais. Ce n'est pas la solution ultime, mais j'ai essayé d'atteindre la solution ultime et je n'ai pas pu y arriver après beaucoup d'efforts. J'ai donc opté pour quelque chose de simple et qui fonctionne pour plus de 90% de mes besoins. Je peux l'implémenter sur n'importe quel ordinateur auquel je vais (ou toute nouvelle installation Linux) en quelques minutes. C'est très simple.

Dans l'application du terminal X, définissez les préférences de raccourci. Je l'ai fait à la fois dans Gnome et KDE. Dans Konsole, par exemple, allez dans Menu> Paramètres> Configurer les raccourcis. Il existe un menu similaire dans le terminal Gnome X. Sélectionnez simplement le raccourci (par exemple, "copier") et entrez la séquence de touches souhaitée.

Dans le cas où les raccourcis du copier-coller du terminal entrent en conflit avec les commandes du terminal, il existe également une solution simple. Par exemple, que se passe-t-il si quelqu'un souhaite utiliser CTRL-C pour la copie (pour que le terminal X soit conforme à la norme CUA)?

Dans ce cas, vous pouvez facilement modifier les liaisons de touches stty (dans .bashrc). En continuant le CTRL-C pour l'exemple de copie, disons que vous voulez que la touche d'interruption soit maintenant CTRL-b (pour "break"). Cela permet:

echo "stty intr \^b" >> ~/.bashrc 

Puis sourcez .bashrc.

L'ensemble de la solution est aussi simple que d'utiliser les paramètres des terminaux X pour modifier les raccourcis et, éventuellement, résoudre les conflits avec stty avec une commande d'écho sur une ligne. Dead simple et couvre presque tout ce dont j'ai besoin.

MountainX pour Monica Cellio
la source
0

La touche Windows est probablement la touche de modification. exécutez ceci et réessayez:

xmodmap -e 'remove Mod4 = Super_L'
URSS
la source
Merci, mais ne fait pas l'affaire. Je sais que le mappage fonctionne parce que xev signale les événements XF86.
solo
Mon premier message (exécuter xmodmap -e 'remove Mod1 = Meta_L'et essayer vos commandes après) a bien fonctionné pour moi.
URSS
1
@solo et sur le fait de travailler ou non, ne considérez pas que tous les environnements de bureau ou applications les prennent en charge. Pour découvrir que cela fonctionne vraiment ou non, utilisez-les sur Firefox par exemple. Il prend en charge (écoute) les raccourcis clavier X.
URSS
0

J'ai pris une partie de ce que Glen Whitney avait dit et j'ai réussi à utiliser ces connaissances pour mapper le comportement de pire mot ou de manipulation de texte de macOS dans un clavier personnalisé.

J'ai déjà résolu le problème de copier-coller Ctrl vs Super sans impliquer cette solution spécifique, mais comme je l'ai dit, cela a été très utile pour d'autres choses. J'ai également évité des choses comme xmodmap car je vise à soutenir pleinement Wayland à un moment donné. Kinto utilise le xkb natif et respecte le comportement attendu du terminal comme macOS.

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

Voici également un résumé, si vous voulez simplement voir ce qui est au cœur de tout cela, il n'alternera pas votre clavier si nécessaire. Le Gist n'inclut pas non plus de fichiers de mappage de touches xkb personnalisés qui configurent des curseurs de style macOS / des manipulations de mots qui utilisent Cmd et les touches de direction.

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

contenu essentiel

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

# If the hid_apple driver is not loaded for Apple keyboards, which can be found out
# by the lsmod command then the above setxkbmap commands will not work
# Use the following commands for Apple style keyboards without an hid_apple driver
#
# Note: this could also apply to hid_apple driver as well 
# if this option is set to 0 inside swap_opt_cmd
#
lsmod | grep hid_apple

# Apple keyboard without hid_apple - GUI
setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl,ctrl:swap_rwin_rctl

# Apple keyboard without hid_apple - Terminal
setxkbmap -option;setxkbmap -option altwin:alt_super_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#
R Ben R
la source