Nasıl "idempotent" yazabilirim.


14

Şu anda bir var .Xmodmapbenim değiştirir dosyasını CommandTo Ctrlardından benim değiştirir Ctrliçin Super(ben Mac'te Linux koşuyorum).

Oldukça iyi çalışıyor, sadece bir kez çalıştığında ancak ardışık çalışmalarda (örneğin masaüstü ortamımı yeniden başlattığımda (Tarçın) dosyayı yeniden .Xmodmapyüklediğimde) temelde değişiklikleri geri alarak ayarları sıfırlar. İstediğim kurulum ile orijinal kurulum arasında etkili bir şekilde geçiş yapma.

.XmodmapAyarları yalnızca bir kez ayarlayan, ancak art arda yapılan çalışmalarda değiştirmeyen bir dosyayı nasıl yazabilirim ? İşte mevcut .Xmodmapdosyam:

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

Soruyu anlamıyorum. Burada “modal” ın ne anlama geldiğini bilmiyorum. Bu .Xmodmapyalnızca değiştirdiğiniz tuşları etkiler, farklı olarak ne yapmak istersiniz?
Gilles 'SO- kötü olmayı bırak'

.Xmodmap'i kullandığımda tuşları ayarlar, eğer tekrar çalıştırırsam onları değiştirir. Takas edilen kontrol ve komut tuşlarında ne olursa olsun bir .Xmodmap oluşturmak istiyorum. Bazen DE .Xmodmap yeniden başlatıldığında bir sinir bozucu sonuçlanır.
coteyr

2
@coteyr Sanırım aradığınız kelime " idempotent "
Joseph R.

Yanıtlar:


7

Modlarınızı uygulamadan önce haritayı orijinal durumuna sıfırlayın. Tam bir sıfırlama sonsuza kadar sürer, bu yüzden gelebileceğim en iyi şey farklıdır.

Bu kod kullanımları .Xmodmap{.orig,.reset,.mods}eğer .origşimdiki durumuna 's setini yok ve hesaplar .resetbu ilgisi var yerden o halini geri yüklemek için. uygulamadan önce .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

(değiştir: temizleme)


Bunu deniyorum. Çok uzak çok iyi.
coteyr

@coteyr - bu sizin için uygun mu?
slm

Hala denemiyorum.
coteyr

Güncel: Bu çalışıyor gibi görünüyor, çoğunlukla ben hala biraz şey tweak zorunda ama en azından ayarları ardışık çalışmalarda sıfırlanmaz.
coteyr

@coteyr - bu işe yaramazsa işe yarayabilecek başka bir yöntemim olduğunu düşünüyorum, ancak daha fazla dahil, bu yüzden bu işi yaparsa gerçekten yazmak istemiyorum. Cevap verirken lütfen kullanıcı adımın önündeki @ işaretini ekleyin, böylece yanıtladığınızı biliyorum, aksi takdirde geri dönüp kontrol etmeliyim ve büyük olasılıkla unutacağım.
slm

0

Sistem> Tercihler> Başlangıç ​​Uygulamaları'na gidin ve ekleyin xmodmap ~/.Xmodmap. xmodmap komutu ekle


Bu, DE her yeniden başlatıldığında xmodmap'in çalışmasına neden olur, bu zaten çalışır ve ayarların yapılmasına, ardından geri ayarlanmasına neden olur. Örneğin, Bilgisayarı başlat, oturum aç, DE başlatılır, xmodmap çalıştırılır, DE çöker, DE başlar, xmodmap çalıştırılır. Şimdi klavyem bozuldu.
coteyr


0

Hala ne istediğine dair biraz kafam karıştı, ama bence bu:

Aşağıdaki konularda bu koyarsanız ~/.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

ardından her xmodmap ~/.Xmodmapyürütüldüğünde, sol Ctrlve sol anahtar takas edilir. Yani, ilk çağırmada, Ctrlanahtar basmış gibi davranır , ancak ikinci çağırmada Ctrltekrar anahtar olarak hareket etmeye devam eder .


Bu tam olarak istemediğim şey
coteyr

Tam tersini istiyorum, kontrol gibi davranan ve kontrol gibi davranan sonuç ne olursa olsun her çağrıyı istiyorum.
coteyr

Tamam, bu yüzden kafam karıştı, çünkü orijinal kaydınız tam olarak istediğinizi yapıyor gibi görünüyor ...
billyjmc

Ama öyle değil.
coteyr

Eh, ben gözlemlemek davranış kodu olmasıdır olan benim kod durum bilgisi ise İdempotent. Bana hem kodunun hem de benimkinin senin için aynı şekilde davrandığını mı söylüyorsun? Eğer durum buysa, sanırım bir çeşit hata yaşıyor olmalısınız. Ben bir öneri var: açıkça xmodmap ~/.Xmodmapbir xterm çalışan deneyin ve kod gerçekten tekrarlanan uygulama ile tuşları takas olup olmadığını görmek. Belki Tarçın yeniden başladığında anahtarlarınız orijinal davranışa dönüyor, düşündüğünüz nedenden dolayı değil mi?
billyjmc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.