Jak napisać „idempotent” .Xmodmap

14

Obecnie mam .Xmodmappliku, który zmienia mojego CommandTO Ctrl, następnie zmienia mój Ctrldo Super(używam Linuksa na komputerze Mac).

Działa całkiem dobrze, gdy uruchamia się tylko raz, ale przy kolejnych uruchomieniach (na przykład po ponownym uruchomieniu środowiska pulpitu (Cinnamon) ponownie ładuje .Xmodmapplik), w zasadzie resetuje ustawienia, przywracając zmiany. Skutecznie przełącza się między moją pożądaną konfiguracją a oryginalną konfiguracją.

Jak mogę napisać .Xmodmapplik, który ustawia ustawienia tylko raz, ale nie zmienia ich z powrotem przy kolejnych uruchomieniach? Oto mój istniejący .Xmodmapplik:

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
źródło
Nie rozumiem pytania. Nie mam pojęcia, co oznacza tutaj „modalny”. .XmodmapWpływa to tylko na klucze, które zmieniasz. Co chcesz robić inaczej?
Gilles 'SO - przestań być zły'
Kiedy używam .Xmodmap, ustawia klucze, jeśli uruchomię je ponownie, przełącza je z powrotem. Chcę utworzyć .Xmodmap, bez względu na to, co spowoduje zamianę klawiszy sterujących i poleceń. Czasami po ponownym uruchomieniu DE .Xmodmap jest uruchamiany ponownie, co powoduje irytację.
Coteyr
2
@coteyr Myślę, że słowo, którego szukasz, to „ idempotent
Joseph R.,

Odpowiedzi:

7

Zresetuj mapę do pierwotnego stanu przed zastosowaniem modów. Pełny reset trwa wiecznie, więc najlepsze, co mogę wymyślić, to różne.

Ten kod używa, .Xmodmap{.orig,.reset,.mods}jeśli .orignie istnieje, jest ustawiony na bieżący stan i oblicza, .resetaby przywrócić ten stan z dowolnego miejsca. przed złożeniem wniosku .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

(edycja: czyszczenie)

jthill
źródło
Próbuję tego. Jak na razie dobrze.
coteyr
@coteyr - czy to Ci odpowiada?
slm
Nie bardzo wciąż eksperymentuję.
coteyr
Upadate: wydaje się, że to działa, w większości nadal muszę trochę poprawiać, ale przynajmniej ustawienia nie są resetowane przy kolejnych uruchomieniach.
coteyr
@coteyr - jeśli to się nie powiedzie, myślę, że mam inną metodę, która może działać, ale jest bardziej zaangażowana, więc tak naprawdę nie chcę tego pisać, jeśli to zadziała. Odpowiadając, proszę podać znak @ przed moją nazwą użytkownika, aby wiedzieć, że odpowiedziałeś, w przeciwnym razie muszę wrócić i sprawdzić, a najprawdopodobniej zapomnę.
slm
0

Przejdź do systemu> Preferencje> Aplikacje startowe i dodaj xmodmap ~/.Xmodmap. dodaj polecenie xmodmap

PMint
źródło
Powoduje to, że xmodmap jest uruchamiany przy każdym ponownym uruchomieniu DE, to już działa, i powoduje ustawienie ustawień, a następnie cofnięcie. Na przykład: Uruchom komputer, zaloguj się, uruchomiono DE, uruchomiono xmodmap, awarie DE, uruchomiono DE, uruchomiono xmodmap. Teraz moja klawiatura znów się popsuła.
coteyr
0

Nadal jestem trochę zdezorientowany, co chcesz, ale myślę, że to:

Jeśli umieścisz to w swoim ~/.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

następnie za każdym razem, gdy xmodmap ~/.Xmodmapwykonywany jest, lewy Ctrli lewy klawisz zamiany. Tak więc przy pierwszym wywołaniu Ctrlklawisz działa tak, jakbyś nacisnął , ale przy drugim wywołaniu wznawia działanie jako Ctrlklawisz ponownie.

billyjmc
źródło
Właśnie tego nie chcę
coteyr
Chcę dokładnie odwrotnie, chcę każdego wywołania, bez względu na to, co spowoduje, że polecenie będzie działać jak kontrola i kontrola będzie działać jak polecenie.
coteyr
Okej, no cóż, dlatego jestem zdezorientowany, ponieważ twój oryginalny
post
Ale tak nie jest.
coteyr
Cóż, zachowanie, które obserwuję, jest takie, że twój kod jest idempotentny, podczas gdy mój kod jest stanowy. Czy mówisz mi, że zarówno twój, jak i mój kod zachowują się identycznie dla ciebie? Jeśli tak jest, to myślę, że masz jakiś błąd. Mam sugestię: spróbuj jawnie uruchomić xmodmap ~/.Xmodmapz Xtermu i sprawdź, czy twój kod naprawdę zamienia klucze przy powtarzanej aplikacji. Może twoje klucze powracają do pierwotnego zachowania po ponownym uruchomieniu Cinnamon, nie z tego powodu, dla którego tak uważasz?
billyjmc