Come posso scrivere un "idempotent" .Xmodmap


14

Attualmente ho un .Xmodmapfile che cambia il mio Commandin Ctrl, quindi cambia il mio Ctrlin Super(sto eseguendo Linux su un Mac).

Funziona abbastanza bene, quando viene eseguito solo una volta ma su esecuzioni successive (ad esempio quando riavvio il mio ambiente desktop (Cinnamon) ricarica il .Xmodmapfile) ripristina sostanzialmente le impostazioni ripristinando le modifiche. Passa efficacemente dalla configurazione desiderata a quella originale.

Come posso scrivere un .Xmodmapfile che imposta le impostazioni solo una volta, ma non le ripristina in esecuzioni successive? Ecco il mio .Xmodmapfile esistente :

clear control
clear mod4

keycode 105 =
keycode 206 =

keycode 133 = Control_L NoSymbol Control_L
keycode 134 = Control_R NoSymbol Control_R
keycode 37 = Super_L NoSymbol Super_L

add control = Control_L
add control = Control_R

Non capisco la domanda. Non ho idea di cosa significhi "modale" qui. Questo .Xmodmapriguarda solo le chiavi che stai cambiando, cosa vuoi fare diversamente?
Gilles 'SO- smetti di essere malvagio' il

Quando uso il .Xmodmap imposta le chiavi, se lo eseguo di nuovo le ritorna indietro. Voglio creare una .Xmodmap che non importa ciò che risulta nelle chiavi di controllo e comando scambiate. A volte quando si riavvia DE. Xmodmap viene eseguito di nuovo con conseguente fastidio.
Coteyr,

2
@coteyr Penso che la parola che stai cercando sia " idempotente "
Joseph R.,

Risposte:


7

Ripristina la mappa al suo stato originale prima di applicare le tue mod. Un ripristino completo richiede un'eternità, quindi il meglio che posso inventare è diffing.

Questo codice utilizza .Xmodmap{.orig,.reset,.mods}dove .orignon esiste è impostato sullo stato corrente e calcola .resetper ripristinare tale stato da qualsiasi posizione. prima di applicare .mods.

#!/bin/sh
# file xmodmap-reset

#     rm ~/.Xmodmap.orig
# beforehand to take current setup as baseline for Xmodmap.mods changes

stem=~/.Xmodmap
orig=${stem}.orig
reset=${stem}.reset
mods=${stem}.mods

# implement -pme like -pke
#
xmodmap-pme () {
  xmodmap -pm \
  | sed '
        1d
        / [^ ]/!d
        s/^[^ ][^ ]*/clear &\nadd & =/
        s/([^ ]*//g
    '
}

# save baseline if none atm
test -a $orig || {
    xmodmap  -pke
    xmodmap-pme
} > $orig

# payload, diff for commands to reset to baseline from current
{
    xmodmap  -pke
    xmodmap-pme
} \
| {
    diff -u0 $orig - \
    | sed -n '
        1,/^@@/d
        s/^[^+]clear/clear/p
        s/^-//p
      '
} > $reset
xmodmap $reset

# finally ready to apply the mods
test -a $mods && xmodmap $mods

(modifica: pulizia)


Ci sto provando. Fin qui tutto bene.
Coteyr,

@coteyr: questo ti sta risolvendo?
slm

In realtà non sto ancora sperimentando.
coteyr

Aggiornamento: questo sembra funzionare, per la maggior parte devo ancora modificare un po 'le cose, ma almeno le impostazioni non vengono ripristinate su corse successive.
Coteyr,

@coteyr - se questo non si risolve, penso di avere un altro metodo che potrebbe funzionare, ma è più coinvolto, quindi non voglio davvero scriverlo se questo fa il lavoro. Quando rispondi, includi il segno @ davanti al mio nome utente, quindi so che hai risposto, altrimenti devo tornare a controllare e molto probabilmente lo dimenticherò.
slm

0

Vai a sistema> Preferenze> Applicazioni di avvio e aggiungi xmodmap ~/.Xmodmap. aggiungi il comando xmodmap


Questo fa sì che xmodmap venga eseguito ogni volta che viene riavviato DE, questo funziona già e fa sì che le impostazioni vengano impostate, quindi ripristinate. Ad esempio Avvia computer, accedi, DE viene avviato, xmodmap viene eseguito, DE si arresta in modo anomalo, DE viene avviato, xmodmap viene eseguito. Ora la mia tastiera è di nuovo incasinata.
Coteyr,


0

Sono ancora un po 'confuso su ciò che vuoi, ma penso che questo:

Se lo metti nel tuo ~/.Xmodmap,

clear control
clear mod4

keysym Super_L = Control_L
keysym Control_L = Super_L

add control = Control_L
add control = Control_R
add mod4 = Super_L
add mod4 = Super_R

quindi ogni volta che xmodmap ~/.Xmodmapviene eseguito, quindi il tasto sinistro Ctrle sinistro si scambiano. Quindi, nella prima invocazione, il Ctrltasto si comporta come se si fosse premuto , ma nella seconda invocazione, riprende a fungere Ctrlnuovamente da tasto.


Questo è esattamente ciò che non voglio
coteyr l'

Voglio l'esatto contrario, voglio ogni invocazione, non importa cosa dia luogo a un comando che agisce come un controllo e un controllo che agisce come un comando.
Coteyr,

Ok, beh, questo è il motivo per cui sono confuso, perché il tuo post originale sembra fare esattamente quello che vuoi ...
billyjmc

Ma non lo fa.
coteyr,

Bene, il comportamento che osservo è che il tuo codice è idempotente, mentre il mio codice è stateful. Mi stai dicendo che sia il mio che il mio codice si comportano in modo identico per te? In tal caso, penso che dovresti riscontrare un bug di qualche tipo. Ho un suggerimento: prova a correre esplicitamentexmodmap ~/.Xmodmap da un xterm e vedi se il tuo codice scambia davvero le chiavi con un'applicazione ripetuta. Forse le tue chiavi tornano al comportamento originale al riavvio di Cannella non per il motivo che pensi che sia?
Billyjmc,
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.