Tüm uygulamaların değiştirilmiş xkb düzenime saygı göstermesini nasıl sağlayabilirim?


15

Ana klavye ve hareket tuşları arasında atlamayı sevmiyorum, bu yüzden xkb düzen dosyasına aşağıdakileri ekledim.

hidden partial xkb_symbols "movement"
{
    key <AD08> { [ NoSymbol, NoSymbol, Up,          Up          ] };
    key <AC08> { [ NoSymbol, NoSymbol, Down,        Down        ] };
    key <AC07> { [ NoSymbol, NoSymbol, Left,        Left        ] };
    key <AC09> { [ NoSymbol, NoSymbol, Right,       Right       ] };
    key <AD09> { [ NoSymbol, NoSymbol, Prior,       Prior       ] };
    key <AB09> { [ NoSymbol, NoSymbol, Next,        Next        ] };
    key <AB07> { [ NoSymbol, NoSymbol, Home,        Home        ] };
    key <AB08> { [ NoSymbol, NoSymbol, End,         End         ] };
    key <AC06> { [ NoSymbol, NoSymbol, Delete,      Delete      ] };
}

Sonra bunları dosyaya daha sonraki bir noktada düzene eklerim. Şimdi AltGr + j, k, l, i (veya dvorak kullandığım gibi h, t, n, c) aracılığıyla imleç tuşlarına erişebilmeliyim vb. Bu birçok durumda (Firefox, urxvt, Eclipse, ancak bazı programları hiçbir şey yapmıyorum, örneğin imleci bu "kısayolları" kullanarak hareket ettirmeye çalıştığımda (NetBeans ve LyX iletişim kutuları gibi).

Peki, bu diğer programların da dileklerime saygı duymasını sağlamanın bir yolu var mı? Ve neden ilk etapta çalışmıyorlar? DE kullanmıyorum; sadece Müthiş WM.

Düzenle:

  • İşte tam ama basitleştirilmiş bir klavye düzeni dosyası. Ben bunu var /usr/share/X11/xkb/symbols/nonpopve ben ile yüklerim setxkbmap nonpop.
  • MonoDevelop'da işlerin etrafında hareket ettiğini fark ettim ama seçim yapmıyor. Yani, ÜstKrktr + Sağ tuşlarına basarsam metin her zamanki gibi seçilir, ancak AltGr + ÜstKrktr + n tuşlarına basarsam imleç seçmeden hareket eder. Örneğin Firefox'ta seçim için her iki yol da kullanılabilir.
  • İşte sonunda onlar hakkında konuşmak bindirmeleri belki çözüm olabilir ama bunların nasıl kullanılacağı çözemedim bir şey gibi görünüyor.

1
Bir çözümüm yok, ancak koyduğunuz ödüllere rağmen bir cevap alamazsanız , daha Unix / Linux merkezli bir Stackexchange sitesi olan unix.SE'ye sormayı deneyebilirsiniz.
Ağustos'ta Glutanimate

Yanıtlar:


16

Neden çalışmıyorlar

Göre ArchWiki makalesinde Bahsettiğiniz o:

  • X sunucusu , giriş aygıtından anahtar kodları alır ve bunları duruma ve key koduna dönüştürür .

    • durumu X değiştiricilerinin (Ctrl / Shift / etc) bit maskesidir.

    • keysym ( /usr/include/X11/keysymdef.htam olarak ) tamsayıdır.

      bir klavye düzeninin her tuşuyla ilişkili karakterleri veya işlevleri (ör. görünür gravür yoluyla) tanımlayın.

      Her yazdırılabilir karakter kendi keysym gibi vardır plus, a, A, veya Cyrillic_a, fakat diğer tuşlar da benzeri onların keysyms oluşturmak Shift_L, Leftya da F1.

  • Tuş basma / bırakma olaylarındaki uygulama tüm bu bilgileri alır.

    Bazı uygulamalar Control_Lkendileri gibi anahtarları izler , diğerleri sadece durumdaki değiştirici bitleri arar .

Eğer bastığınızda Peki, olur AltGr+ j:

  • Siz basın AltGr. Uygulama 108 ( <RALT>) ve 0xym03 ( ISO_Level3_Shift) tuş takımı ile KeyPressed olayını alır , durum 0'dır.

  • Tuşuna basın j(değiştirici olmadan dvorak'ta “h” ile eşleşir). Uygulama, 44 ( <AC07>), 0xym51 ( Left) anahtar kodu ve durum 0x80 (Mod5 değiştirici açık) ile KeyPressed olayını alır .

  • Sen serbest bırak j. Uygulama, anahtar için <AC07>/ Leftaynı parametrelerle KeyRelease olayını alır .

  • Ardından AltGr, AltGr için KeyRelease olayını bırakın . (Bu arada, buradaki durum hala 0x80, ancak bu önemli değil.)

xevYardımcı programı çalıştırırsanız bu görülebilir .

Yani, her şey, uygulama Leftnormal anahtarla <LEFT>aynı key kodunu ( ) alsa da, AltGr'den key kodunu ve değiştirici durumunu da alır. Büyük olasılıkla, çalışmayan, değiştiricileri izleyen ve bazıları aktifken çalışmak istemeyen programlar.

Onları nasıl çalıştırabilirim?

Görünüşe göre, her programı değiştiricileri aramayacak şekilde değiştiremeyiz. Bu durumda, bu durumdan kaçmanın tek yolu, değiştiricilerin anahtar sözcüklerini ve durum bitlerini oluşturmamaktır.

1. Ayrı grup

Benim akla gelen tek bir yöntemdir: tuşlarına basarak önce bu gruba, ayrı bir tuşa basarak, ayrı bir grup ve anahtar içinde bulunan imlecin hareket tuşları tanımlanır j, k, l, i( h, t, n, c) (grup mandal tercih edilen bir yöntemdir anladığım kadarıyla bir zaman grubu değişikliği için).

Örneğin:

xkb_keymap {
    xkb_keycodes { include "evdev+aliases(qwerty)" };
    xkb_types { include "complete" };
    xkb_compatibility {
        include "complete"

        interpret ISO_Group_Latch { action = LatchGroup(group=2); };
    };
    xkb_symbols {
        include "pc+us(dvorak)+inet(evdev)"

        key <RALT> { [ ISO_Group_Latch ] };

        key <AC07> {
            type[Group2] = "ONE_LEVEL",
            symbols[Group2] = [ Left ]
        };
        key <AC08> {
            type[Group2] = "ONE_LEVEL",
            symbols[Group2] = [ Down ]
        };
        key <AC09> {
            type[Group2] = "ONE_LEVEL",
            symbols[Group2] = [ Right ]
        };
        key <AD08> {
            type[Group2] = "ONE_LEVEL",
            symbols[Group2] = [ Up ]
        };
    };
    xkb_geometry { include "pc(pc104)" };
};

Şimdi, önce AltGrhareket tuşlarından birine ve sonra (ayrı ayrı) basarsanız , bu işe yarayacaktır.

Ancak, bu çok yararlı değildir LockGroup , mandal yerine daha uygun olacaktır ve grup geçişinden önce ve sonra AltGr tuşuna basın. Daha da iyisi olabilir SetGroup- o zaman AltGr bu grubu sadece basıldığında seçer, ancak bu uygulama AltGr'ın keyfisini ( ISO_Group_Shift/ ISO_Group_Latch/ tanımlanmış ne olursa olsun) açıklar (ancak değiştirici durumu temiz kalır).

Ancak ... uygulamanın aynı zamanda anahtar kodlarını da (gerçek anahtarların kodları) okuma olasılığı kalmıştır. Sonra “sahte” imleç tuşlarını görecektir.

2. Kaplama

Daha “düşük seviyeli” çözüm kaplamadır (aynı makalede açıklandığı gibi).

Kaplama , bazı (gerçek klavye) tuşlarının başka bir tuşun tuş kodunu döndürmesi anlamına gelir. X sunucusu bir anahtarın anahtar kodunu değiştirir ve bu yeni anahtar kodunun değiştirici durumunu ve anahtar kodunu hesaplar, böylece uygulama değişikliği fark etmemelidir.

Ancak yer paylaşımları çok sınırlıdır:

  • X sunucusunda yalnızca 2 kaplama kontrol biti vardır (yani maksimum 2 kaplama olabilir).
  • Her anahtarın yalnızca 1 alternatif anahtar kodu olabilir.

Geri kalanlara gelince, uygulama ayrı bir grupla yönteme oldukça benzer:

xkb_keymap {
    xkb_keycodes { include "evdev+aliases(qwerty)" };
    xkb_types { include "complete" };
    xkb_compatibility {
        include "complete"

        interpret Overlay1_Enable {
            action = SetControls(controls=overlay1);
        };
    };
    xkb_symbols {
        include "pc+us(dvorak)+inet(evdev)"

        key <RALT> {
            type[Group1] = "ONE_LEVEL",
            symbols[Group1] = [ Overlay1_Enable ]
        };
        key <AC07> { overlay1 = <LEFT> };
        key <AC08> { overlay1 = <DOWN> };
        key <AC09> { overlay1 = <RGHT> };
        key <AD08> { overlay1 = <UP> };
    };
    xkb_geometry { include "pc(pc104)" };
};

SetControls, tuşa basılıyken kontrol bitini değiştirmek ve tuş bırakmada geri yüklemek anlamına gelir. Benzer bir işlev olmalı LatchControls, ama xkbcompbana

Error:            Unknown action LatchControls

keymap derlemesinde.

(Bu arada, ben de dvorak kullanıyorum ve ayrıca bazı hareket tuş takımlarını yüksek alfabetik tuşlara yeniden eşledim. Ayrıca bazı kırık işlevlerle de karşılaştım (Xfce notlarında seçim ve Ctrl-Alt-Sol / Sağ tarafından masaüstü anahtarı). sorunuzu ve bu cevabınızı, şimdi bindirmenin ne olduğunu biliyorum :).)


Teşekkürler! Aslında unix.se'de başka bir cevap aldım, ki bu ilk başta mükemmel görünüyordu, ancak bazı uygulamaların hala yanlış davrandığı ortaya çıktı. Bu çözüm (kaplamalar) bu durumlarda da işe yarar.
nonpop

Ben sadece google chrom [e | ium] bu da umurumda değil fark ettim! :( Neyse ki onları çok kullanmıyorum.
nonpop

@nonpop goddamn chromeum ... Cevabıma bir güncelleme ekledim superuser.com/a/1000320/521612
Aleks-Daniel Jakimenko

İnanılmaz! Bunu yıllarca araştırdım! Chromium ile ilgili bir tuşa basmayı yorumladığı küçük bir sorun var Overlay1_Enable. Burada olduğu gibi aynı belirtiye sahibim
Tarrasch

1
Yukarıdaki sorunu çözmeyi başardım. Ana satır ok tuşları artık Chromium'da da çalışıyor! Bu cevapta aşağıdaki değişikliğe ihtiyacım vardı. gist.github.com/Tarrasch/1293692/…
Tarrasch

4

Aynı problemim var. Çok acı verici.

Bu nedenle başlık “Tüm uygulamaların değiştirilmiş xkb düzenime saygı duymasını nasıl sağlarım?”. Bence tek yol yanlış yapan tüm programları düzeltmektir. Hadi bunu yapalım!

NetBeans'de bu hatayı bildirdikten sonra ( Güncelleme: En son sürümü denedim ve şimdi çalışıyor! ), Her uygulama için bu hatayı bildirmeye devam edeceğimi düşündüm. Listedeki bir sonraki uygulama Speedcrunch oldu .

Ancak, benzer hata raporlarını aradıktan sonra bu sorunu buldum . Başka biri de aynı sorunu yaşıyor, harika!

Yorumları okuduktan sonra bu hatanın tüm QT uygulamalarında bulunması gerektiğini anlayacaksınız. İşte bir QT hata raporu . Çözülmedi, ancak sorunun Qt5'te çözüldüğü anlaşılıyor .

Ancak, yorumlara bakarsanız, bir geçici çözüm var! İşte böyle çalışır. Bunu yapıyorsanız:

key <SPCE> { [ ISO_Level3_Shift ] };

Sonra bunu şu şekilde değiştirebilirsiniz:

key <SPCE> {
  type[Group1]="ONE_LEVEL",
  symbols[Group1] = [ ISO_Level3_Shift ]
};

Ve aslında bazı uygulamalar için sorunu çözecek! Örneğin, Speedcrunch artık benim için çalışıyor! Yaşasın!

özet

Şu anda herhangi bir uygulama düzgün çalışmalıdır. Değilse, kullanmanız gerekir type[Group1]="ONE_LEVEL". Zaten sahipseniz, yazılımınızı güncellemeniz gerekir. Hala çalışmıyorsa, uygulamaya özeldir ve bir hata raporu göndermeniz gerekir.

GÜNCELLEME (2017-09-23)

Bugün itibariyle tüm uygulamalar klavye düzenime saygı duyuyor. Biri hariç hepsi.

Cidden, Chromium'da klavye kullanımı çöptür . Bununla ilgili birkaç sorun var:

  • Shift seçimi özel ok tuşlarıyla çalışmaz (ancak ok tuşlarının kendileri de iyi çalışır)
  • Birden fazla düzeniniz varsa ve düzenlerden birinde bazı tuşlar özeldir (örneğin oklar, Geri Al tuşu vb.), Başka bir düzende bu anahtar ilk düzeninizdeki her şeye sabitlenir. Örneğin, iki düzenleri varsa: foo, barve bazı anahtar içinde Backspace yapar fooo zaman içinde Backspace olarak çalışmaya devam edecektir, barorada yeniden olsa bile.

Yıllarca krom kullanmadan bu sorunları görmezden geldim. Bununla birlikte, günümüzde işler maalesef Chromium üzerine inşa edilen Electron'u kullanma eğilimindedir .

Bunu çözmenin doğru yolu Chromium'da bir hata raporu sunmak ve en iyisini ummak olacaktır. Sadece birkaç kullanıcıyı etkileyen bir sorunu çözmelerinin ne kadar süreceğini bilmiyorum… ama bu tek çıkış yolu gibi görünüyor. Buradaki sorun, kromun neo(de)düzen ile gerçekten iyi çalışmasıdır . Neo düzeninin seviye5'te ok tuşları var, ancak özel düzenimde çalışmasını sağlayamıyorum.

Hala açık hata raporları:


Bilgi için teşekkürler! Geçici çözüm bana yardımcı olmaz, bu yüzden sadece hataları rapor etmek ve qt5 dönüşümleri beklemek zorunda kalacağım sanırım.
nonpop

4

Nasıl çalışır hale getirilir - Çözüm 3

Ek Düzeyler ve İşlem Yönlendirme Anahtarı Kullanma

Aşağıdaki çözüm, jkli'de imleç tuşları, uopö'de Home / End / PageUp / PageDown ve Backspace'de Delete sağlamak için sol Alt tuşunu kullanır.

Sol Alt tuşu, diğer tüm tuşlar (uygulama menüsü gibi) için başka amaçlarla kullanılabilir. İmleç bloğu kullanıldığında sol Alt (Mod1) değiştirici durumundan kaldırılır, böylece uygulamalar göremez.

xkb_keymap {
    xkb_keycodes { 
        include "evdev+aliases(qwertz)" 
    };
    xkb_types { 
        include "complete"  
    };
    xkb_compat { 
        include "complete"
        interpret osfLeft {
            action = RedirectKey(keycode=<LEFT>, clearmodifiers=Mod1);
        };
        interpret osfRight {
            action = RedirectKey(keycode=<RGHT>, clearmodifiers=Mod1);
        };
        interpret osfUp {
            action = RedirectKey(keycode=<UP>, clearmodifiers=Mod1);
        };
        interpret osfDown {
            action = RedirectKey(keycode=<DOWN>, clearmodifiers=Mod1);
        };
        interpret osfBeginLine {
            action = RedirectKey(keycode=<HOME>, clearmodifiers=Mod1);
        };
        interpret osfEndLine {
            action = RedirectKey(keycode=<END>, clearmodifiers=Mod1);
        };
        interpret osfPageUp {
            action = RedirectKey(keycode=<PGUP>, clearmodifiers=Mod1);
        };
        interpret osfPageDown {
            action = RedirectKey(keycode=<PGDN>, clearmodifiers=Mod1);
        };
        interpret osfDelete {
            action = RedirectKey(keycode=<DELE>, clearmodifiers=Mod1);
        };
    };
    xkb_symbols { 
        include "pc+de(nodeadkeys)"
        include "inet(evdev)"
        include "compose(rwin)"
        key <LALT> {
            type[Group1] = "ONE_LEVEL",
            symbols[Group1] = [ ISO_Level5_Shift ]
        };
        modifier_map Mod1 { <LALT> };
        key <AC07> {
            type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1] = [ j, J, dead_belowdot, dead_abovedot, osfLeft, osfLeft, osfLeft, osfLeft ]
        };
        key <AC08> {
            type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1] = [ k, K, kra, ampersand, osfDown, osfDown, osfDown, osfDown ]
        };
        key <AC09> {
            type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
            symbols[Group1] = [ l, L, lstroke, Lstroke, osfRight, osfRight, osfRight, osfRight ]
        };
        key <AC10> {
            type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1] = [ odiaeresis, Odiaeresis, doubleacute, doubleacute, osfPageDown, osfPageDown, osfPageDown, osfPageDown ]
        };
        key <AD07> {
            type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1] = [ u, U, downarrow, uparrow, osfBeginLine, osfBeginLine, osfBeginLine, osfBeginLine ]
        };
        key <AD08> {
            type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1] = [ i, I, rightarrow, idotless, osfUp, osfUp, osfUp, osfUp ]
        };
        key <AD09> {
            type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
            symbols[Group1] = [ o, O, oslash, Oslash, osfEndLine, osfEndLine, osfEndLine, osfEndLine ]
        };
        key <AD10> {
            type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
            symbols[Group1] = [ p, P, thorn, THORN, osfPageUp, osfPageUp, osfPageUp, osfPageUp ]
        };
        key <BKSP> {
            type[Group1] = "EIGHT_LEVEL_ALPHABETIC",
            symbols[Group1] = [ BackSpace, BackSpace, BackSpace, BackSpace, osfDelete, osfDelete, osfDelete, osfDelete ] 
        };
    };
    xkb_geometry { 
        include "pc(pc105)" 
    };
};

Kutsal moly! Gerçekten işe yarıyor! Chromium gibi kırık uygulamalar etrafında çalışır. Bu osf tanımlarının ne olduğunu açıklayabilir misiniz? Görünüşe göre önceden tanımlanmışlar, böylece onları rastgele adlandıramazsınız.
Aleks-Daniel Jakimenko
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.