Jak w systemie Linux mogę zmapować SHIFT_L / SHIFT_R po naciśnięciu bez dodatkowego klawisza?

13

Dzisiaj znalazłem bardzo fajny artykuł Stevena Losha, w którym prezentuje on kilka mapowań klawiatury zwiększających produktywność. Wśród nich jest dynamiczne mapowanie lewego i prawego klawisza Shift.

Pomysł

Kiedy Shift_L lub Shift_R są naciskane bez dodatkowego klawisza, są one mapowane odpowiednio na „(” i „)”, w przeciwnym razie działają jak zwykle.

Problem

Robi to wszystko pod OSX. Próbuję to samo osiągnąć pod Linuksem. Nie ma na to bezpośredniego sposobu, ponieważ, jak rozumiem, nie można użyć xmodmap do skonfigurowania jednego klawisza dla samego Shift_L, a drugiego dla Shift, gdy jest używany jako klawisz modyfikujący.

Przeszukałem trochę i znalazłem ludzi próbujących zrobić to samo w systemie Windows, co najwyraźniej jest możliwe przy użyciu AutoHotKey, ale nie znalazłem niczego dla Linuksa.

Czy istnieje sposób na rozwiązanie tego w systemie Linux?

Gilligan
źródło
Nie próbowałem tego, ale może to pomóc askubuntu.com/q/24916/11352
Mansuro
2
To prawie duplikat tego pytania . =)
teika kazura

Odpowiedzi:

4

Łał! Komentarz użytkownika teika kazura do pierwotnego pytania jest całkiem poprawny - nie tylko jest to skutecznie duplikat tego drugiego pytania , ale udzielona tam odpowiedź („use xcape ”) rozwiązuje ten problem!

Po sklonowaniu repozytorium xcape i kompilacji (najpierw musiałem zainstalować libXtst-devel na moim pudełku Fedory), byłem w stanie uzyskać żądane zachowanie za pomocą następującego polecenia:

xcape -e "Shift_L=parenleft;Shift_R=parenright"

Po dość pobieżnych testach wydaje się działać wyjątkowo dobrze. Ładny!

Inne opcje

Jeśli użyjesz klawisza Shift jako modyfikatora myszy (tj. Jeśli kiedykolwiek klikniesz cokolwiek z wciśniętym klawiszem Shift), prawdopodobnie będziesz chciał włączyć opcję limitu czasu xcape i znaleźć wygodną wartość limitu czasu, aby klawisz Shift solo był używany w połączeniu z klawiszem myszy nie generują fałszywych nawiasów. Z XADE README:

-t <timeout ms>

Jeśli przytrzymasz klawisz dłużej niż ten limit czasu, xcape nie wygeneruje kluczowego zdarzenia. Domyślnie 500 ms.

Tak więc, włączając -tflagę z wartością limitu czasu, która działa dla Ciebie, nadal będziesz mógł kliknąć i przytrzymać klawisz Shift, dopóki przytrzymasz klawisz Shift przez co najmniej timeout ms milisekundy.

( Jeszcze raz dziękuję teice kazura za wskazanie drugiego pytania, a także don_crissti za oryginalną odpowiedź.)

FeRD
źródło
Jednym z problemów z tą metodą jest to, że dość często naciskam [Shift] + [LMouse], aby zaznaczyć tekst w edytorach. Co ciekawe, wysublimowany tekst używa również [Ctrl] + [LMouse], więc pytanie o ponowne mapowanie [Ctrl] również powoduje problemy.
AnnanFay,
@Annan Czy eksperymentowałeś z dostosowaniem opcji limitu czasu xcape? Z -t <timeout ms>pliku README: „ Jeśli przytrzymasz klawisz dłużej niż ten limit czasu, xcape nie wygeneruje kluczowego zdarzenia. Domyślnie 500 ms.” ... Chyba że xcape zakłóca modyfikację klawisza modyfikatora (nie pamiętam), to powinno powstrzymywać go przed generowaniem fałszywych naciśnięć klawiszy, jednocześnie pozwalając używać go jako modyfikatora wyboru myszy, o ile trzymasz go wystarczająco długo .
FeRD
@Annan Miło to słyszeć, zaktualizowałem swoją odpowiedź, aby zasugerować wykorzystanie -tflagi!
FeRD
1

To interesujące wyzwanie i zgadzam się z tym, że xinput nie wydaje się idealnie do tego przystosowany. Spędziłem trochę czasu, majstrując przy umiejętnościach xmodmap, i byłem tak frustrująco bliski osiągnięcia tego, co chcesz zrobić ... bez faktycznego dotarcia tam.

Za pomocą xmodmap można przypisać parenleft jako przesunięty symbol klawisza na lewym klawiszu Shift:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'

który sorta prace, przynajmniej w moim testowania na Fedora 17 pudełka, ale nie w sposób zadowalający. Zauważyłem, że przy takim mapowaniu klawisz Shift nadal działał normalnie i nie renderował żadnych fałszywych parenów, ale (frustrująco) nie produkował też niezawodnie parenów lewych. Z jakiegoś powodu, klawisz nie wydaje się wiarygodny zmieniać się , co łamie swoje zadanie przesunięte ... początkowo. Z jakiegoś powodu kilkakrotne naciśnięcie klawisza shift w lewo spowoduje, że zacznie on wytwarzać lewe części, ale dopiero po czwartym lub piątym naciśnięciu.

Jednym zachowanie ja zrobiłem zawiadomienie jednak, że może być w stanie pracować z jako „wystarczająco blisko” analogowej: Okazało się, że po mapowania parenleft i parenright na Shift_L i Shift_R mogłem niezawodnie wpisać parens przez „rolling” w poprzek obu klawiszy shift - innymi słowy, z tym odwzorowaniem:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'
xmodmap -e 'keysym Shift_R = Shift_R parenright Shift_R parenright'

naciśnięcie Shift_L, a następnie Shift_R, a następnie zwolnienie obu, spowoduje wyświetlenie prawego lub lewego lewego w przeciwnym kierunku. (Odwzorowania paren można oczywiście odwrócić; nie mogłem do końca zdecydować, która droga wydaje się bardziej „naturalna”).

To było tak blisko, jak mogłem osiągnąć dokładnie takie zachowanie, jakiego szukasz; nie wydaje się, że jest to możliwe przy użyciu samego xmodmap.

Byłem w połowie przekonany, że to po prostu niemożliwe, kropka, ale potem zdałem sobie sprawę, że istnieje co najmniej jeden klawisz, który działa dokładnie tak , jak opisujesz: klawisz Super („Windows”). Pod Gnome Shell jest to klawisz modyfikujący (mod4), który daje inny efekt (wyzwalanie Przeglądu) po naciśnięciu sam. Tak więc, przynajmniej teoretycznie, możliwe może być zrealizowanie pożądanego przeciążenia klawiszem Shift w ten sam sposób.

... Ale nie mam absolutnie pojęcia, jak by to było zrobione ani jak inwazyjne byłoby utknięcie w niezbędnym przetwarzaniu za każdym razem, gdy naciskasz klawisz Shift. :-)

FeRD
źródło