Zamapuj ponownie CapsLock, aby uciec i kontrolować cały system

18

Czy możliwe jest ponowne mapowanie systemu klawiszy CapsLock tak, aby po naciśnięciu przycisku CapsLock sam działał jak klawisz Escape, a po naciśnięciu innego klawisza działa jak klawisz sterujący?

Zameer Manji
źródło
5
Wydaje się, że byłoby to bardzo trudne. Na przykład nie można wygenerować zdarzeń powodujących wyłączenie klawisza, ponieważ nie wiadomo, który klawisz został właśnie naciśnięty. Jeśli zostanie zwolniony bez naciśnięcia innego klawisza, to będzie to Escape, w przeciwnym razie będzie to Control.
cjm

Odpowiedzi:

16

Znalazłem bardzo dobre rozwiązanie o nazwie xcape . Z pliku README:

xcape działa jako demon i przechwytuje klawisz Control. Jeśli klawisz Control zostanie naciśnięty i zwolniony sam, wygeneruje zdarzenie Escape.

Ma to większy sens, jeśli przypisałeś klawisz Caps Lock do Control. Przyszłe wersje tego programu mogą zrobić to dla ciebie, ale na razie jest to coś, co musisz zrobić sam.

Zameer Manji
źródło
Zrobiłem hacky skrypt, aby to zrobić: github.com/cmatheson/super-caps
kamera
6

Zamapowałem Caps na Escape, aby wygodniej było pisać w Vimie. Użyłem xmodmapi włożyłem to ~/.Xmodmap.

clear Lock
keycode 0x42 = Escape

Aby ubiegać się: xmodmap ~/.Xmodmap. Możesz umieścić to w pliku takim jak ~ / .bash_profile (wstawiam ~ / .xinitrc, ponieważ nie używam menedżera logowania.

Aby zmapować CapsLock + [inny klucz], rozważ użycie xbindkeys.

Emil
źródło
4

Jedynym w Linuksie rozwiązaniem do mapowania kluczy w całym systemie jest napisanie prostej reguły udev. Nie będzie zależeć od X, będzie działać na dowolnym terminalu lub aplikacji i można go przenosić między ostatnimi instalacjami Linuksa, po prostu kopiując dwa pliki.

Musisz napisać 2 pliki: jeden zawierający regułę udev, która mówi jądru, aby ponownie mapował klucze, a drugi zawiera potrzebne mapowania.

Korzystając z tej metody odwzorowałem całą klawiaturę, być może kod jest przydatny jako inspiracja http://git.adirat.com/carpalx-keyboard

gimmesudo
źródło
link jest martwy, czy mógłbyś go zaktualizować? dzięki!
qed
Zaktualizowałem to, przepraszam za opóźnienie
gimmesudo
Bitbucket mówi „Nie masz dostępu do tego repozytorium”. Czy możesz to ponownie opublikować? Dzięki!
Tianyi Cui,
@TianyiCui sprawdź link teraz
gimmesudo
1
Link jest dla mnie martwy lub zablokowany. Czy jest szansa, że ​​w odpowiedzi umieścisz rzeczywiste pliki?
labirynt
1

Na AskUbuntu natknąłem się na inaczej sformułowane pytanie, które miało dobrą odpowiedź , ale musiałem je nieco zmodyfikować, aby działało na moich systemach.

Na podstawie komentarzy Louisa i Sergiiego opracowałem rozwiązanie, które działa dla mnie na Ubuntu 16.04 (Xenial) i przyniosę je ze sobą na inne systemy Linux, których używam.

Zainstalowałem xcape i umieściłem następujące wiersze kodu w moim .profilepliku w katalogu domowym.

ZAKTUALIZOWANA METODA:

Ponieważ różne menedżery wyświetlania (gdm / kdm / sddm / etc) zachowują się w dziwny sposób i resetują setxbmappo zawieszeniu / wznowieniu lub zablokowaniu / odblokowaniu, odkryłem, jak ustawić opcje w taki sposób, aby dziedziczyły to i nie t cały czas go resetuj. Ponieważ dużo zawieszam i wznawiam, musiałem upewnić się, że nie otrzymałem wielu kopii xcapeuruchomionych, co zostało rozwiązane w nowym skrypcie poniżej.

Najpierw zmodyfikuj konfigurację klawiatury za pomocą sudo gedit /etc/default/keyboardi ustaw, XKBOPTIONS="ctrl:nocaps"a następnie ~/.xprofilewstaw jeden wiersz poniżej.

ps aux | grep -i '[x]cape' && killall -9 xcape; hash xcape 2>&1 >/dev/null && xcape -e 'Control_L=Escape' -t 100 &

Mamy nadzieję, że różne sekcje skryptu oszczędzą ci trochę czasu / kłopotów i zapobiegną blokowaniu logowania. Najpierw sprawdza, czy instancja jest już uruchomiona i zabija ją, ponieważ jedyne, co xcaperobi, to mapowanie Ctrl na Esc, jest to bezpieczne, a następnie ta hashczęść zapewnia, że xcape zainstalowałeś, w przeciwnym razie system może się zawiesić podczas próby zalogowania, ponieważ wszystkie uruchamiają się skrypty powinny zostać poprawnie zamknięte.

Stara droga:

setxkbmap -option 'caps:ctrl_modifier'; xcape -e '#66=Escape'

Sergij:

Użyłem gnome-tweak-tool do mapowania Caps Lock na Ctrl, ponieważ w Ustawieniach systemu w Ubuntu 14.04 nie ma układu klawiatury. Wtedy xcape -e „Control_L = Escape” nie działał, ale po użyciu xcape -d odkryłem, że Caps Lock generuje kod klucza 66 i odpowiednio go odwzorowałem: xcape -e '# 66 = Escape'. - Sergiy Byelozyorov 4 września 14 o 10:08

Louis:

Zgodnie z tym postem na blogu można to zrobić za pomocą samego Xcape: setxkbmap -option 'caps: ctrl_modifier'; xcape -e 'Caps_Lock = Escape' setxkbmap -option 'caps: ctrl_modifier'; xcape -e 'Caps_Lock = Escape; Control_L = Escape; Control_R = Escape' - Louis Simoneau 4 sierpnia 2015 o 10:06

dragon788
źródło