Como posso escrever um "idempotente" .Xmodmap


14

Atualmente tenho um .Xmodmaparquivo que muda o meu Commandpara Ctrl, em seguida, muda o meu Ctrlpara Super(estou rodando Linux em um Mac).

Funciona muito bem, quando é executado apenas uma vez, mas em execuções sucessivas (por exemplo, quando eu reinicio meu ambiente de área de trabalho (Cinnamon), recarrega o .Xmodmaparquivo), basicamente redefine as configurações revertendo as alterações. Alternando efetivamente entre a configuração desejada e a configuração original.

Como escrever um .Xmodmaparquivo que define apenas as configurações uma vez, mas não as altera novamente em execuções sucessivas? Aqui está o meu .Xmodmaparquivo 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

Eu não entendo a pergunta. Não tenho ideia do que "modal" significa aqui. Isso .Xmodmapafeta apenas as teclas que você está alterando. O que você deseja fazer de diferente?
Gilles 'SO- stop be evil'

Quando eu uso o .Xmodmap, ele define as chaves; se eu executá-lo novamente, as altera novamente. Eu quero criar um .Xmodmap que não importa o que resulte nas chaves de controle e comando trocadas. Às vezes, ao reiniciar, o DE .Xmodmap é executado novamente, resultando em um aborrecimento.
coteyr

2
@coteyr Acho que a palavra que você está procurando " idempotent "
Joseph R.

Respostas:


7

Redefina o mapa para seu estado original antes de aplicar seus mods. Uma redefinição completa leva uma eternidade, para que o melhor que eu possa apresentar seja diferente.

Esse código usa .Xmodmap{.orig,.reset,.mods}onde, se .orignão existe, é definido como o estado atual e calcula .resetpara restaurar esse estado de onde quer que seja. 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: limpeza)


Estou tentando fazer isso. Por enquanto, tudo bem.
coteyr

@coteyr - isso está funcionando para você?
slm

Ainda não estou realmente experimentando.
coteyr

Atualização: parece que está funcionando, na maioria das vezes ainda preciso ajustar um pouco as coisas, mas pelo menos as configurações não são redefinidas em execuções sucessivas.
coteyr

@coteyr - se isso não der certo, acho que tenho outro método que pode funcionar, mas está mais envolvido, por isso não quero escrever se isso funcionar. Ao responder, inclua o sinal @ na frente do meu nome de usuário para que eu saiba que você respondeu; caso contrário, tenho que voltar e verificar e provavelmente esquecerei.
slm

0

Vá para sistema> Preferências> Aplicativos de Inicialização e adicione xmodmap ~/.Xmodmap. comando add xmodmap


Isso faz com que o xmodmap seja executado toda vez que o DE for reiniciado, isso já funciona e faz com que as configurações sejam definidas e, em seguida, retornadas. Por exemplo Iniciar computador, efetue login, DE é iniciado, xmodmap é executado, DE trava, DE é iniciado, xmodmap é executado. Agora meu teclado está bagunçado novamente.
coteyr


0

Ainda estou um pouco confuso quanto ao que você quer, mas acho que é isso:

Se você colocar isso no seu ~/.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

toda vez que xmodmap ~/.Xmodmapé executado, as teclas Ctrlesquerda e esquerda são trocadas. Portanto, na primeira chamada, a Ctrltecla atua como se você tivesse pressionado , mas na segunda chamada, ela retoma a atuação como Ctrlchave novamente.


Este é exatamente o que eu não quero
coteyr

Quero exatamente o oposto, quero toda invocação, não importa o que resulte em comando agindo como controle e controle agindo como comando.
coteyr

Ok, bem, é por isso que eu estou confuso, porque sua postagem original parece fazer exatamente o que você quer ...
billyjmc

Mas isso não acontece.
coteyr

Bem, o comportamento que observo é que seu código é idempotente, enquanto meu código é com estado. Você está me dizendo que tanto o seu código quanto o meu se comportam de forma idêntica para você? Se for esse o caso, acho que você deve estar enfrentando algum tipo de bug. Eu tenho uma sugestão: tente executar explicitamente a xmodmap ~/.Xmodmappartir de um xterm e veja se o seu código realmente troca as chaves com o aplicativo repetido. Talvez suas chaves voltem ao comportamento original quando o Cinnamon for reiniciado não pelo motivo que você pensa que é?
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.