CapsLock jako klawisz modyfikujący mapy klawiszy aplikacji

11

Jestem programistą i obecnie używam Ubuntu Linux z PyCharm IDE do tworzenia stron internetowych. Aby poprawić wydajność pisania, rozważam zmianę CapsLock na Hyper_L i przypisanie go do mod3 za pomocą xmodmap. Po tym chcę zmapować mod3 dla klucza „i” do „Up”. Jak dotąd to, co zrobiłem, to:

xmodmap -e "keysym Caps_Lock = Hyper_L"

dane wyjściowe są takie:

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Hyper_L (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

następnie usuwam Hyper_L z mod4

xmodmap -e "remove Mod4 = Hyper_L"

Następnie próbowałem przypisać Hyper_L do mod3

xmodmap -e "add Mod3 = Hyper_L"

Wystąpił jednak następujący błąd:

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  118 (X_SetModifierMapping)
  Value in failed request:  0x17
  Serial number of failed request:  11
  Current serial number in output stream:  11

Więc w czym był problem? Jak mogę to zrobić? Czy moje podejście jest słuszne? Czy powinienem zastosować inne podejście, aby użyć mod3 do kluczy niestandardowych?

PS Używam klawiatury Microsoft Natural Ergonomic 7000

Khamidulla
źródło

Odpowiedzi:

20

W Internecie znajduje się bajillion odpowiedzi, z których większość jest myląca.

Kluczem jest to, że musisz zmapować kod klucza 66 na swój hiperklucz, usunąć mapowanie tego klucza z innych modów {1,2,4,5} (tylko jeśli są obecne), a następnie ustawić mod3.

Otwórz ~ / .Xmodmap i wstaw następujące polecenie:

! Unmap capslock
clear Lock
keycode 66 = Hyper_L

! Leave mod4 as windows key _only_
remove mod4 = Hyper_L

! Set mod3 to capslock
add mod3 = Hyper_L

Uruchom to

xmodmap ~/.Xmodmap

Jeśli coś pójdzie nie tak, możesz zresetować klawiaturę za pomocą:

setxkbmap -layout us

Prawdopodobną przyczyną wybuchu jest to, że Hyper_L jest odwzorowany w innym miejscu. Napraw to, uruchamiając xmodmap bez argumentów, aby dowiedzieć się, co jeszcze wiąże się z Hyper_L. Kiedy wiesz, co musisz usunąć, wrzuć „remove BINDING = Hyper_L” w pliku .Xmodmap.

Plik .Xmodmap zostanie załadowany podczas otwierania sesji X11, powinieneś mieć to mapowanie w miejscu przy następnym logowaniu lub ponownym uruchomieniu.

Ta konfiguracja działa dla mojej konfiguracji Ubuntu 14.04. Jeśli masz inny * nix, a to nie działa, opublikuj tutaj informacje o tym, co zrobiłeś, aby to zrobić, a ja dołączę to do odpowiedzi.

heymatthew
źródło
@antindexer, czy to działało dla Ciebie?
heymatthew
Próbowałem całkiem sporo odpowiedzi, i to ta, która zadziałała dla mnie. Przynajmniej zrobiło to na czystej instalacji Linuksa. Co dziwne, nie działa w QEMU / KVM, działa tylko na alternatywnych naciśnięciach klawisza Caps Lock.
Diagon
0

Wiem, że to pytanie jest dość stare, ale muszę podzielić się moim rozwiązaniem, ponieważ (frustrująco) odpowiedź heymantthew nie zadziałała dla mnie. Co ostatecznie dla mnie zadziałało:

setxkbmap -layout us -option lv3:caps_switch -variant intl

Umożliwi to capslock jako klawisz mod3, ustawi układ na „nas” i ustawi wariant na „intl”. Jeśli używasz interaktywnej powłoki, takiej jak ryba, możesz nacisnąć tab po „-layout”, „-option” lub „-variant”, aby uzyskać pełną listę możliwych parametrów.

Dalsze tło: Wypróbowałem podejście xmodmap rok temu na maszynie Ubuntu z menedżerem okien i3, przełączając się ze standardowego środowiska gnome. Zmodyfikowałem układ klawiatury „us” xkb, szczególnie międzynarodowy z martwymi klawiszami - działał dobrze, gdy używałem gnome-desktop-manager (istnieje możliwość ustawienia Caps-Lock jako klawisza mod3), ale nie mogłem weź go do pracy z xmodmap. To był mój błąd: myślałem, że interfejs graficzny gdm używa xmodmap do mapowania Caps Lock na mod3, ale w rzeczywistości ustawia tę opcję X11. Teraz, kiedy przeszedłem na Arch, byłem zmuszony to rozgryźć.

Polecam każdemu, kto chce się tym zająć, aby przeczytać strony podręcznika localectl, xmodmap, setxkbmap i testować układy, dodając tryb uśpienia i przywracania:

setxkbmap ... ; sleep 10; setxkbmap <INSERT DEFAULT SETTINGS>

zaoszczędziło mi to sporo czasu.

Nadal nie rozumiem, w jaki sposób podejście xmodmap nie działa. Mam nadzieję, że to komuś pomoże.

Mark IO
źródło