¿Cómo puedo escribir un "idempotente" .Xmodmap

14

Actualmente tengo un .Xmodmaparchivo que cambia mi Commandpara Ctrl, a continuación, cambia mi Ctrla Super(estoy corriendo Linux en un Mac).

Funciona bastante bien, cuando solo se ejecuta una vez pero en ejecuciones sucesivas (por ejemplo, cuando reinicio mi entorno de escritorio (Cinnamon) vuelve a cargar el .Xmodmaparchivo), básicamente restablece la configuración al revertir los cambios. Alternar efectivamente entre mi configuración deseada y la configuración original.

¿Cómo puedo escribir un .Xmodmaparchivo que solo establece la configuración una vez, pero que no la cambia en ejecuciones sucesivas? Aquí está mi .Xmodmaparchivo existente :

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
coteyr
fuente
No entiendo la pregunta. No tengo idea de lo que significa "modal" aquí. Esto .Xmodmapsolo afecta las teclas que está cambiando, ¿qué quiere hacer de manera diferente?
Gilles 'SO- deja de ser malvado'
Cuando uso el .Xmodmap, establece las teclas, si lo ejecuto nuevamente, las cambia de nuevo. Quiero crear un .Xmodmap que no importa lo que resulte en el control intercambiado y las teclas de comando. A veces, cuando se reinicia, DE .Xmodmap se ejecuta nuevamente, lo que resulta en una molestia.
Coteyr
2
@coteyr Creo que la palabra que estás buscando es " idempotente "
Joseph R.

Respuestas:

7

Restablece el mapa a su estado original antes de aplicar tus modificaciones. Un reinicio completo lleva una eternidad, por lo que lo mejor que puedo hacer es diferir.

Este código usa .Xmodmap{.orig,.reset,.mods}donde .origno existe si está establecido en el estado actual, y calcula .resetpara restaurar ese estado desde donde sea que esté. antes de aplicar .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

(editar: limpieza)

jthill
fuente
Estoy probando esto. Hasta aquí todo bien.
coteyr
@coteyr: ¿está funcionando para ti?
slm
En realidad no, todavía estoy experimentando.
coteyr el
Upadate: esto parece estar funcionando, en su mayor parte todavía tengo que modificar un poco las cosas, pero al menos la configuración no se restablece en ejecuciones sucesivas.
coteyr
@coteyr: si esto no funciona, creo que tengo otro método que podría funcionar, pero es más complicado, por lo que no quiero escribirlo si esto funciona. Cuando responda, incluya el signo @ delante de mi nombre de usuario para que sepa que respondió, de lo contrario, tengo que volver y verificar y probablemente lo olvide.
slm
0

Vaya a sistema> Preferencias> Aplicaciones de inicio y agregue xmodmap ~/.Xmodmap. Agregar comando xmodmap

PMint
fuente
Esto hace que xmodmap se ejecute cada vez que se reinicia el DE, esto ya funciona y hace que la configuración se establezca y luego se restablezca. Por ejemplo, iniciar computadora, iniciar sesión, se inicia DE, se ejecuta xmodmap, se bloquea DE, se inicia DE, se ejecuta xmodmap. Ahora mi teclado está en mal estado otra vez.
coteyr
0

Todavía estoy un poco confundido sobre lo que quieres, pero creo que esto:

Si pones esto en tu ~/.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

luego, cada vez que xmodmap ~/.Xmodmapse ejecuta, se intercambian las teclas izquierda Ctrly izquierda . Entonces, en la primera invocación, la Ctrltecla actúa como si hubiera presionado , pero en la segunda invocación, se reanuda actuando como una Ctrltecla nuevamente.

billyjmc
fuente
Esto es exactamente lo que no quiero
coteyr
Quiero exactamente lo contrario, quiero que cada invocación, sin importar el resultado, haga que el comando actúe como control y que el control actúe como comando.
coteyr
Bien, bueno, es por eso que estoy confundido, porque tu publicación original parece hacer exactamente lo que quieres ...
billyjmc
Pero no lo hace.
coteyr
Bueno, el comportamiento que observo es que su código es idempotente, mientras que mi código tiene estado. ¿Me estás diciendo que tanto tu código como el mío se comportan de manera idéntica para ti? Si ese es el caso, entonces creo que debes estar experimentando un error de algún tipo. Tengo una sugerencia: intente ejecutar explícitamente xmodmap ~/.Xmodmapdesde un xterm, y vea si su código realmente intercambia las claves con la aplicación repetida. ¿Quizás las claves que vuelven al comportamiento original cuando se reinicia Cinnamon no son por la razón que crees que es?
billyjmc