Użyj setxkbmap, aby zamienić lewy Shift i lewy Control

17

Czy można zamienić lewy Shifti lewy CTRLklawisz za pomocą setxkbmapzamiast xmodmap?

EDYTOWAĆ

Przeszedłem na Fcitx , który pod każdym względem działa znacznie lepiej z moim układem klawiatury i dostosowaną mapą klawiszy niż IBus. Gorąco polecam.

dzień
źródło

Odpowiedzi:

28

xmodmapjest przestarzały; tak więc należy to zrobić za pomocą xkbnarzędzi.

Wydaje się, że pożądana zamiana nie jest domyślnie dołączona do plików X11; więc musisz to napisać sam.

Strona http://madduck.net/docs/extending-xkb/ pomogła mi zrozumieć i znaleźć sposób na zrobienie tego.

Utwórz plik, w ~/.xkb/keymap/mykbdktórym umieścisz wyjście setxkbmap, będzie to podstawowa definicja klawiatury; na przykład:

setxkbmap -print > ~/.xkb/keymap/mykbd

następnie utwórz plik symboli, aby zdefiniować zamianę klawiszy, umieść go na przykład w ~/.xkb/symbols/myswap

tam, wstaw następujące linie:

partial modifier_keys
xkb_symbols "swap_l_shift_ctrl" {
    replace key <LCTL>  { [ Shift_L ] };
    replace key <LFSH> { [ Control_L ] };
};

następnie edytuj ~/.xkb/keymap/mykbdplik i zmień xkb_symbolswiersz, aby dodać

+myswap(swap_l_shift_ctrl)

wreszcie możesz go załadować xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY(nie możesz użyć „~” dla -Iparametru). Prawdopodobnie wypluje wiele ostrzeżeń o niezdefiniowanych symbolach niektórych rzadkich kluczy, ale możesz je zignorować (np. Błąd przekierowania do dave:) 2> /dev/null.

Jeśli chcesz mieć możliwość łatwego przełączania między normalnym a odwróconym klawiszem Ctrl / Shift; po prostu utwórz pod ~/.xkb/keymap/innym plikiem, bez dodatkowej opcji „myswap” i załaduj go xkbcomp. Możesz utworzyć dwa małe skrypty, aby je załadować.

Pablo Saratxaga
źródło
1
Dzięki. Działa, ale choć raz. Problem polega na tym, że używam silnika wejściowego o nazwie IBus. Ilekroć zmieniłem metodę wprowadzania, a następnie z powrotem za pomocą klawisza „Ctrl + Spacja”, Lewy Shift i Lewy Control są przełączane z powrotem. Wszelkie sugestie, jak tego uniknąć.
dzień
mmn, być może IBus sam dokonuje pewnych redefinicji klawiatury. spróbuj xkbcomp $DISPLAY some.dumppo i przed wywołaniem IBus i wykonaj różnicę między dwoma zrzutami (są to kompletne definicje klawiatury); prawdopodobnie zobaczysz różnice.
Pablo Saratxaga
Hmm, robi się, jak denerwujące. Masz pomysł na pozbycie się problemu? Zauważ, że polecenie setxkbmap -option caps:escapedziała. IBus zapamiętał zamienione klawisze Esc i Caps_Lock, ale nie działa to na zamienione lewe klawisze Shift i lewe klawisze Control.
dzień
może IBus po uruchomieniu uruchomi klawiaturę. Spróbuj rozładować IBusa, zmienić klawiaturę i załadować ją ponownie. Jeśli problem będzie się powtarzał, należy zadać pytanie specyficzne dla IBusa (i może zgłosić błąd; imho to znaczy, IBus powinien wykryć zmiany klawiatury i je honorować)
Pablo Saratxaga
Cześć. Czy ktoś może mi powiedzieć, jak użyłbym tej samej techniki do zamiany lewego klawisza Alt na lewy klawisz Control? Próbowałem zmienić plik myswap na: częściowe klucze modyfikatora xkb_symbols "swap_l_shift_ctrl" {zamień klucz <LCTL> {[Alt_L]}; zastąp klucz <LALT> {[Control_L]}; }; ale to nie działało. TIA !!!
Neil Girardi
3

Natknąłem się na pewne problemy związane LALTz Control_Lkorzystaniem z rozwiązania Pablo , wygląda na to, że musisz również ustawić modifier_mapopcje.

Skopiowałem szablon z /usr/share/X11/xkb/symbols/altwin- poszukaj xkb_symbols "ctrl_alt_win"- i zmodyfikowałem go, aby wprowadzić następujące zmiany:

  • Klucz LALT do sterowania **
  • Klawisz LWIN do Alt
  • Klawisz MENU do klawisza Windows

Ostateczny ~/.xkb/symbols/myswapplik to:

partial modifier_keys
xkb_symbols "swap" {
   key <MENU> {     [   Super_L     ]   };
   key <LALT> { [ Control_L, Control_L  ] };
   key <RALT> { type[Group1] = "TWO_LEVEL",
                symbols[Group1] = [ Alt_R, Meta_R ] };
   key <LWIN> { [ Alt_L, Meta_L ] };
   key <LCTL> { [ Control_L ] };
   key <RCTL> { [ Control_R ] };
   modifier_map Control { <LALT>, <LCTL>, <RCTL> };
   modifier_map Mod1 { <LWIN>, <RALT> };
   modifier_map Mod4 { <MENU> };
};

Dodałem również -w0do xkbcomppolecenia, aby uniknąć jakichkolwiek ostrzeżeń podczas otwierania nowej powłoki.

xkbcomp -w0 -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY

** Często przełączając się między komputerami Mac i Linux, lubię mieć dwa klawisze sterujące w systemie Linux, aby zbliżyć klawiaturę Mac do pamięci mięśni.

Jo-el
źródło