Binding Super + C Super + V da copiare e incollare


23

Da qualche tempo sono interessato a legare il tasto Windows (Super_L) sulla mia tastiera a Copia e incolla per nessun altro motivo se non la convenienza e la coerenza tra il mio desktop e il mio MacBook.

Ho pensato di essere vicino dopo aver letto su xmodmap ed eseguito quanto segue:

$ # 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"

Sfortunatamente, XF86Copy e XF86Paste non sembrano funzionare affatto. Sono elencati /usr/include/X11/XF86keysym.he xevmostrano che la sequenza di tasti viene interpretata da X come XF86Paste e XF86Copy, questi simboli funzionano davvero? Devono avere un supporto a livello di applicazione?

Risposte:


18

Associare Super a Ctrl

Che dire di associare la Windows/Logo/Superchiave sinistra per agire come un'altra Ctrlchiave?

Puoi farlo con i seguenti comandi xmodmap:

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

Supponendo di aver salvato le righe precedenti in quanto super_as_ctrl.xmodmapè possibile testare l'effetto eseguendo

xmodmap super_as_ctrl.xmodmap

Per rendere permanente la modifica (sopravvivere al nuovo accesso / riavvio) rinominare il file .Xmodmapnella cartella principale.

(Quanto sopra è stato testato sul sistema live Ubuntu 11.10, ma dovrebbe essere lo stesso per altre distribuzioni Linux)


Regolazione delle scorciatoie Copia / Incolla per il programma terminale

Avendo legato Supera Ctrlte ora puoi usare Super-Cper copiare quasi ovunque. L'unica eccezione comune è il tuo programma terminale. Tuttavia puoi ridefinire le scorciatoie lì.

Ho scoperto che ormai gnome-terminalha questa opzione (non avevo fino a quando non mi sono abituato Ctrl-Shift-Ccomunque). Se lo usi, vai a Edit / Keyboard Shortcuts...nel menu e assegna Ctrl-Cper copiare e Ctrl-Vincollare. Dovrebbe essere simile per konsoleecc.

E non preoccuparti, non perderai la possibilità di terminare un programma usando una scorciatoia. Dopo aver ricollegato la scorciatoia da copia per il terminale, puoi semplicemente usare Ctrl-Shift-Ccome hai usato Ctrl-Cprima. Il terminale non distingue qui se si preme Shift o meno. E il collegamento non viene più catturato per la copia. In alternativa, associa nuovamente la terminazione a un'altra scorciatoia, come suggerisce MountainX nella sua risposta.


XF86Copy ecc. Non funziona

Per quanto riguarda i simboli chiave per copia e incolla: a quanto pare non hanno alcun effetto. L'ho provato rapidamente assegnando l'azione di copia a Shift-ScrollLock (non era in uso e volevo testare con un tasto non modificatore):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Premendolo non ha avuto alcun effetto, né con XF86AudioMute. Tuttavia ha funzionato durante l'assegnazione della lettera "a". Quindi immagino che ci sia un problema specifico con questi simboli chiave speciali XF86.


3
Sfortunatamente, anche se associo Super a Ctrl, dovrò comunque usare Ctrl / Super + Maiusc + C per copiare e incollare all'interno del terminale, che è un incentivo primario. Grazie per aver confermato che i tasti XF86 non funzionano.
solo l'

Quale programma terminale usi? Ho aggiunto una soluzione che funziona almeno con gnome-terminal. E dovrebbe essere simile per gli altri.
zpea,

4
Il controllo vincolante su Meta non equivale a cambiare collegamento per copia / incolla su Meta + c / v. Voglio fare i collegamenti MacOs simili Hot Key Plus su Linux, quindi questa risposta non è eccezionale ...
Sonique

1
MAIUSC + CTRL + C o qualsiasi altra cosa sia troppo maldestra, e il semplice reindirizzamento di Super in Ctrl invierà il segnale di uccisione con Super + c in modo che non risolva così tanto
rien333

il primo passo è approssimativamente quello che ho fatto per trasformare il super / comando in controllo. Ciò risolve la maggior parte delle cose, ma vorrei comunque che cmd-c e ctrl-c avessero funzioni diverse, anche se cmd significa ctrl altrove. Non sono sicuro di poterlo fare con xmodmap e collegamenti specifici del terminale.
tedder42

9

Se vuoi associare solo alcune sequenze del modulo Super + x, Super + c, Super + v ad altre sequenze come Ctrl + x, Ctrl + c, Ctrl + v, ad esempio in modo che (come desiderato dall'OP) queste particolari sequenze di Super-key verranno generalmente mappate per tagliare e incollare senza influenzare altri usi della Super-chiave sul sistema, è possibile utilizzare solo l'estensione XKB. La procedura seguente delinea i passaggi e fornisce due diversi esempi dei dettagli per due diverse configurazioni iniziali della tastiera; si spera che fornirà informazioni sufficienti per adattarsi al proprio sistema. Presuppone che tu abbia dimestichezza con la creazione e la modifica di file sul tuo sistema, inclusi quelli in posizioni di sistema come /usr/share/X11/xkb.

  1. Decidi dove vuoi che risieda l'albero di configurazione XKB. Per prima cosa trova quello di sistema. Di solito è in / usr / share / X11 / xkb e non sono del tutto sicuro di come trovarlo se non è lì; potresti semplicemente cercare nel tuo sistema directory denominate "xkb". In ogni caso, una volta trovato, è possibile modificare il sistema in atto oppure utilizzare qualsiasi directory di propria scelta. Il vantaggio di utilizzare la directory di sistema è che puoi invocare molto più facilmente le tue modifiche, ma lo svantaggio è che i futuri aggiornamenti di sistema potrebbero sovrascrivere le tue modifiche (sei stato avvisato). In ogni caso, tutti i nomi dei file citati di seguito sono relativi a questa directory, a cui farò riferimento quando necessario come $ XKBLOCAL $ e tutti i comandi presuppongono che sia la directory corrente.

  2. Determina quale "tipo" XKB di chiave sono i tasti x, c, v correnti. Il modo più semplice per farlo è tramite il comando xkbcomp -a $DISPLAY - | grep -C 6 c,(nota che la virgola è intenzionalmente inclusa nel modello). Nel mio primo esempio di installazione, questo produce:

    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> {
    

    mentre nel mio altro esempio di installazione questo produce

    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> {
    

    Il risultato è che nel primo esempio, i tasti rilevanti sono di tipo "ALPHABETIC" mentre nel secondo esempio sono di tipo "FOUR_LEVEL". A seconda della configurazione della tastiera, potresti scoprire che sono del tutto di qualche altro tipo. Di seguito, il tipo verrà indicato come $ TYPE $, che è necessario sostituire con la stringa ALPHABETIC effettiva o qualsiasi altra cosa nei comandi seguenti.

  3. Trova la definizione di $ TYPE $ e copialo in un nuovo file nella directory $ XKBLOCAL $ / types. Ecco un comando che fa proprio questo: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. Il nome del file "cutpaste" che ho scelto è arbitrario, usa il nome che preferisci, ma nota che dovrai fare riferimento a questo file in modo coerente nei passaggi successivi. Nella prima installazione, questo file ottiene il contenuto

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

    e nell'altro esempio ottiene il contenuto

    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. Modifica i tipi di file / cutpaste per fare due cose: aggiungi un preambolo e postamble che lo rendono una clausola XKB corretta e modifica il nome del tipo e la definizione del tipo per aggiungere un ulteriore livello prodotto dal modificatore corrispondente a Super. Dovresti controllare quale sia quel modificatore sul tuo sistema, è probabilmente Mod4 come usato di seguito. Le modifiche necessarie dovrebbero essere evidenti dalle due versioni finali di esempio di tipi / pasta, ovvero:

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

    e

    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. Copia le definizioni dei simboli chiave che sono state emesse da grep nel secondo passaggio in un secondo nuovo file simboli / cutpaste, aggiungi preamboli e postamble simili e modifica le definizioni per utilizzare i nuovi tipi e aggiungere azioni alla definizione per gestire la chiave desiderata prodotto dalle versioni Super. I risultati di questo nei nostri due esempi sono:

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

    e

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

    Si noti che nel secondo esempio ho eliminato anche alcuni spazi (non significativi) per mantenere un po 'di controllo la lunghezza della linea.

  6. Trova il nome del set di regole che XKB sta attualmente utilizzando. È facile, è mostrato nel risultato di setxkbmap -query. Nel mio caso, era "evdev".

  7. Copia la versione di sistema di rules / evdev (o qualunque sia il nome del tuo set di regole) in $ XKBLOCAL $ / rules / evdev e aggiungi le regole che puntano alle opzioni che abbiamo creato. Hai due scelte qui: puoi copiare tutto di evdev o solo le parti che menzionano il modello, il layout, la variante e le opzioni della tastiera che stai effettivamente utilizzando. Naturalmente, se si stanno modificando i file di sistema in atto, non è necessario eseguire alcuna copia, ma solo modificarli.

    In questo caso, ciò che viene aggiunto è identico indipendentemente dall'impostazione iniziale della tastiera, quindi c'è solo un esempio. Trovi la sezione del file delle regole che inizia con ! option = symbolse aggiungi una riga cutpaste:super = +cutpastea quella sezione e trovi anche la sezione del file delle regole che inizia con ! option = typese una linea anche cutpaste:super = +cutpastein quella sezione.

  8. Copia la versione di sistema di evdev.lst e aggiungi una riga per la tua nuova opzione. Si noti che il nome di questo file corrisponde semplicemente al nome del file delle regole con .lst aggiunto. Come nel passaggio precedente, è possibile copiare l'intero file o solo la parte a cui fanno riferimento il modello, il layout, la variante e le opzioni che si stanno utilizzando. Devi solo trovare la sezione di questo file che inizia con ! optione aggiungere una linea come questa: cutpaste:super Add super equivalents of cut and paste operationsa quella sezione.

  9. OK, ora sono presenti tutti i file di configurazione. Se hai modificato i file di sistema, ora puoi invocare la tua nuova opzione con setxkbmap -option cutpaste:super. D'altra parte, in caso contrario, devi far sapere a setxkbmap dove si trova la tua directory $ XKBLOCAL $. Quel che è peggio, il server non sa nemmeno dove sia quella directory, e setxkbmap non lo fa (o forse non può, poiché alla fine il server potrebbe essere in esecuzione su un altro computer) lo dice. Quindi devi reindirizzare l'output di setxkbmap su xkbcomp e dire anche a quel comando dove si trova la tua directory $ XKBLOCAL. La riga di comando completa è quindi setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Speriamo che questo sia di aiuto / interesse per qualcuno, dato che una buona documentazione / riferimento XKB definitivo è scarsa. Un riferimento molto utile è stato http://madduck.net/docs/extending-xkb/ .


Risposta eccellente. Questo ha funzionato per me nel 17.10
blockloop

Questo non ha funzionato per me su Ubuntu 18.04. Il risultato è stato semplicemente che i tasti 'c', 'x' e 'v' non funzionano più. Sono stato in grado di farli lavorare di nuovo con setxkbmap -option. La mia configurazione locale era quasi identica all'esempio FOUR_LEVEL con l'eccezione di alcuni simboli Group2, Group3 che ho lasciato fuori dal file dei simboli parziali, quindi il mio file sembrava lo stesso degli esempi.
JinnKo

2

Ecco cosa faccio. Non è la soluzione definitiva, ma ho cercato di ottenere la soluzione definitiva e non ci sono riuscito dopo molti sforzi. Quindi ho optato per qualcosa di semplice e che funziona per oltre il 90% di ciò di cui ho bisogno. Posso implementarlo su qualsiasi computer a cui vado (o su qualsiasi nuova installazione di Linux) in pochi minuti. È semplicissimo.

Nell'applicazione X terminal, impostare le preferenze di scelta rapida. L'ho fatto sia in Gnome che in KDE. In Konsole, ad esempio, vai su Menu> Impostazioni> Configura scorciatoie. C'è un menu simile nel terminale Gnome X. Basta selezionare il collegamento (ad es. "Copia") e inserire la sequenza di tasti desiderata.

Nel caso in cui i collegamenti di copia e incolla del terminale siano in conflitto con i comandi del terminale, esiste anche una soluzione semplice. Ad esempio, cosa succede se qualcuno vuole usare CTRL-C per la copia (quindi il terminale X è conforme allo standard CUA)?

In tal caso, è possibile modificare facilmente i collegamenti dei tasti stty (in .bashrc). Continuando il CTRL-C per un esempio di copia, supponiamo che il tasto di interruzione sia ora CTRL-b (per "break"). Ciò consente di:

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

Quindi fonte .bashrc.

L'intera soluzione è semplice come utilizzare le impostazioni dei terminali X per modificare le scorciatoie e, facoltativamente, risolvere i conflitti con stty con un comando echo a una riga. Morto semplice e copre quasi tutto ciò di cui ho bisogno.


0

Probabilmente il tasto Windows è il tasto modificatore. esegui questo e riprova:

xmodmap -e 'remove Mod4 = Super_L'

Grazie, ma non fa il trucco. So che la mappatura funziona perché xev riporta eventi XF86.
solo l'

Il mio primo post (eseguendo xmodmap -e 'remove Mod1 = Meta_L'e provando i tuoi comandi dopo) ha funzionato bene per me.
URSS

1
@solo e riguardo al lavoro o meno, considera che non tutti gli ambienti desktop o le applicazioni li supportano. Per scoprire che funziona davvero o no, usali su Firefox per esempio. Supporta (ascolta) le associazioni di tasti X.
URSS

0

Ho preso parte di ciò che Glen Whitney aveva detto e sono riuscito a utilizzare quella conoscenza per mappare il comportamento peggiore delle parole o la manipolazione del testo da macOS in una mappa chiave personalizzata.

Ho già risolto il problema Ctrl vs Super copia e incolla senza coinvolgere quella soluzione specifica, ma come ho detto è stato molto utile per altre cose. Ho anche evitato cose come xmodmap poiché sto cercando di supportare completamente Wayland a un certo punto. Kinto utilizza l'xkb nativo e rispetta il macOS previsto come comportamento terminale.

https://github.com/rbreaves/kinto

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

Anche qui c'è un Gist, se vuoi solo vedere ciò che è al centro di tutto, non cambierà la tua keymap quando necessario. Il Gist non include anche file keymap xkb personalizzati che configurano cursori in stile macOS / manipolazioni sagge che usano Cmd e i tasti freccia.

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

contenuto essenziale

# 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!
#
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.