Czy mogę ponownie przypisać klawisz Caps Lock, aby odtwarzać dźwięk?

16

Próbuję ponownie użyć bezużytecznego klawisza Caps Lock do czegoś przydatnego na 16.04 MATE. Natknąłem się

setxkbmap -option ctrl:nocaps

aby go wyłączyć, ale czy można go ponownie mapować, aby na przykład odtwarzać / wstrzymywać VLC? Dzięki za odpowiedzi!

2BFrank
źródło
Nie sądzę, że to zadziała .... z wielu powodów ... na przykład, myślę, że Linux traktuje Capslocka jako modyfikator, a nie oddzielny klawisz. To prawdopodobnie będzie powód, dla którego nie można go powiązać w VLC. Ponadto, jeśli go dezaktywujesz, zostanie dezaktywowany. Ale możesz grać w wierszu poleceń i próbować go powiązać vlc --key-play-pause <key-string>, ale nie znalazłem łańcucha, który VLC akceptuje jako capslock ...
Robert Riedl
1
Zainstalowałem dconf-editorwypróbowałem kilka rzeczy, zainstalowałem xdotoolwypróbowałem kilka rzeczy, a na koniec xbindkeyswypróbowałem kilka rzeczy. Pod koniec tego bezowocnego ćwiczenia mój przycisk pauzy / odtwarzania na klawiaturze został zepsuty, a mój własny przycisk odtwarzania / pauzy na ekranie był wyszarzony i muzyka nie grała. Zrobiłem to w 16.04, więc zrestartowałem w 18.04, aby potwierdzić, że wszystko nadal działa i zrobiły to włamania do oprogramowania. Jedyną zaletą jest to, że odtwarzam muzykę tylko na telefonie z Androidem, a nie na komputerze. Tylko jedna głowa do góry, aby inni byli ostrożni i dokumentowali, co robisz na swoim komputerze lepiej niż ja.
WinEunuuchs2Unix
1
@pbhj Dzięki za wskazówkę. Jakimś cudem udało mi się sprawić, że odtwarzanie / pauza znów działa z przyciskiem ekranowym i przyciskiem pauzy / odtwarzania z klawiatury w Ubuntu 16.04. Chciałem tylko ostrzec ludzi przed możliwymi pułapkami eksperymentującymi z tymi narzędziami klawiatury niskiego poziomu.
WinEunuuchs2Unix
1
2BFrank: Pamiętaj, aby zaakceptować jedną z odpowiedzi, jeśli rozwiąże ona Twój problem. Ponieważ na to pytanie jest nagroda, pozostawienie odpowiedzi nieakceptowanej (a nie ręczne przyznanie nagrody) nagrodzi @Sebastian Stark tylko połową nagrody, ponieważ jego odpowiedź jest najwyższa.
Nonny Moose
1
@NonnyMoose Dzięki za ten komentarz. Chciałem zostawić to, by automatycznie zaakceptować odpowiedź lub najwyższą liczbę głosów, ale nie wiedziałem, że nagroda została zmniejszona o połowę, więc ręcznie przyznam najwyższą liczbę głosów za około dwie godziny, jeśli żadna odpowiedź nie jest akceptowana.
Chai T. Rex,

Odpowiedzi:

11

evtest i dbus

Oto wersja z małym skryptem działającym w tle. Należy podjąć kilka łatwych kroków:

  • Zainstalować evtest programu: sudo apt install evtest. Ten program jest w stanie dekodować i drukować nieprzetworzone zdarzenia z /dev/input/hierarchii urządzeń.

  • Dodaj swoje konto użytkownika do grupy input. Wyloguj się i zaloguj ponownie. (Jest to konieczne, ponieważ będziemy czytać z jakiegoś urządzenia poniżej /dev/input/, co normalnie może zrobić tylko root lub użytkownicy w grupie input. Możemy uruchomić skrypt jako root, ale wtedy musimy znaleźć sposób, aby powiedzieć mu, który użytkownik instancja dbus, z którą musi porozmawiać.)

  • Wyłącz klawisz Capslock tak jak ty lub użyj odpowiedniej preferencji Mate. Działa to również, jeśli mapujesz klawisz Capslock na ctrl, jak robi to wiele osób.

  • Zapisz gdzieś następujący skrypt, np. $HOME/bin/capshackI uruchom go:

    #!/bin/bash
    
    KEYBOARD=/dev/input/by-path/platform-i8042-serio-0-event-kbd
    EVENT="type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1"
    
    toggleVLC () {
            dbus-send \
                --type=method_call \
                --dest=org.mpris.MediaPlayer2.vlc \
                /org/mpris/MediaPlayer2 \
                org.mpris.MediaPlayer2.Player.PlayPause
    }
    
    evtest "$KEYBOARD" | \
    while read line
    do
        if [[ "$line" == *"$EVENT" ]]
        then
            toggleVLC
        fi
    done
    

Powyższy skrypt nasłuchuje zdarzeń na klawiaturze i wykona polecenie po naciśnięciu klawisza Capslock. Uruchamiane polecenie używa dbus do wysłania zdarzenia play / pause do działającej instancji VLC. Być może trzeba będzie zmodyfikować KEYBOARDzmienną, aby wskazywała rzeczywistą klawiaturę, ale prawdopodobnie powyższa wartość zadziała.

Jeśli wolisz wywoływać funkcję toggleVLC () po zwolnieniu klawisza Capslock, możesz zmienić EVENTzmienną w skrypcie tak, aby kończyła się na value 0zamiast value 1.

Możliwe też, że dla ciebie kod klawisza Capslock różni się od 58. Możesz to sprawdzić, uruchamiając evtest, spojrzeć na wynik po naciśnięciu klawisza Capslock i odpowiednio dostosować zmienną EVENT. Nie musisz nawet dopasowywać kodu i ustawiać WYDARZENIE po prostu na (KEY_CAPSLOCK), value 1.

Zamiast używać evtest i powyższego skryptu, możesz użyć thd z pakietu triggerhappy (coś podobnego thd --dump /dev/input/*dałoby podobny wynik), ale okazało się, że to trochę mniej edukacyjne.

Teraz tworzymy jednostkę systemową użytkownika, która automatycznie uruchamia skrypt w tle:

  • Utwórz hierarchię systemową użytkownika: mkdir -p $HOME/.config/systemd/user

  • Dodaj następujący tekst do pliku $HOME/.config/systemd/user/capshack.service

    [Unit]
    Description=Abuse capslock key
    
    [Service]
    ExecStart=%h/bin/capshack
    
    [Install]
    WantedBy=default.target
    
  • Włącz właśnie utworzoną jednostkę serwisową: systemctl --user enable capshack

  • Uruchom usługę: systemctl --user start capshack

Od teraz powinieneś być w stanie przełączać odtwarzanie / pauzę w VLC za pomocą klawisza Capslock. Skrypt w tle powinien zostać automatycznie uruchomiony po zalogowaniu.

spusthappy

Jak już wspomniano, w tym celu można również użyć pakietu triggerhappy. Jest to preferowana metoda dla osób, które chcą mniej bawić się z systemem i raczej bardziej solidnym rozwiązaniem.

  • Dodaj użytkownika do inputgrupy jak wyżej

  • Zainstaluj pakiet: sudo apt install triggerhappy

  • Dodaj konfigurację dla triggerhappy do ~/.config/thd/capslock.conf:

    KEY_CAPSLOCK    1   dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
    
  • Uruchom tak: thd --triggers ~/.config/thd/capslock.conf /dev/input/event*

  • Uruchom już teraz dla swojego użytkownika w podobny sposób, jak opisano już dla capshack.

  • Upewnij się, że działa tylko jedna z wymienionych metod (capshack lub thd), aby nie przełączać dwukrotnie naciśnięcia każdego klawisza.

Przetestowałem to wszystko 18.04 w ramach sesji standardowej i kolega 16.04. Ale teoretycznie powinien on również działać w terenie lub w innych środowiskach stacjonarnych.

Sebastian Stark
źródło
@ WinEunuuchs2Unix dzięki za wzmiankę. Ja osobiście wolę bardziej szczegółowy styl pełnej klauzuli if / then / else: Jest bardziej wyraźny, łatwiej go rozszerzyć i nie robi on zbyt długich linii. Chociaż w tym przypadku tak naprawdę nie miałoby to większego znaczenia.
Sebastian Stark,
Zbyt długo zgadzam się co do linii. Niedawno dostosowałem styl kodowania do dwóch linii z pierwszą linią, [[ test ]] && \ a w drugiej linii wcięto cztery spacje, <command>aby uruchomić pozytywny test. Z całego serca zgadzam się co do czytelności, ponieważ moje zalecenie jest obce większości języków programowania.
WinEunuuchs2Unix
to jest świetne ! Chociaż myślę, że tak triggerhappypowinno być, ponieważ evtesttak naprawdę jest to program do debugowania :)
Robert Riedl
tak, wszystko do nauki, do robienia :)
Sebastian Stark
... Dla mnie zresztą kod klucza 58 jest mtaki, że skrypt nie działa. Zalecam sprawdzenie xmodmap -pke | grep Caps_Lockprzed użyciem tego skryptu, aby upewnić się, że kod klucza jest poprawny.
Nonny Moose
9

W Ubuntu 16.04 po spędzeniu godzin googlowania i bawiąc się dconf-editori xbindkeysznalazłem bardzo proste rozwiązanie:

  • Bardzo szybka konfiguracja w 2 minuty
  • Musi być zainstalowany tylko xdotool
  • Żadne skrypty nie są konieczne
  • Caps Lock jest nadal rozpoznawany, ale nie przełącza wielkości liter
  • Działa ze standardowymi niestandardowymi ustawieniami skrótów klawiatury Ubuntu

Jeśli potrzebujesz XF86AudioPlaywsparcia Gnome , potrzebujesz xdotool(nie jest potrzebne do VLC, jak przewiduje OP):

sudo apt install xdotool

Oto podchwytliwa część. Za każdym razem, gdy naciskasz Caps LocKklawisz, aby przełączać muzykę między Odtwarzaniem a Pauzą, wielkie litery również się włączają i wyłączają.

Użyj tej metody, aby wyłączyć przełączanie Caps Lock przy jednoczesnym utrzymaniu aktywnego klawisza:

setxkbmap -option caps:none

Odtwarzacze muzyczne zgodne z Gnome

Następnie w Ubuntu 16.04 przejdź do Ustawienia >> Klawiatura >> Skróty >> Skróty niestandardowe :

audio pause-play shortcut.png

  • Ustaw nazwę naAudio Play
  • Ustaw polecenie naxdotool key XF86AudioPlay
  • Następnie kliknij Applyprzycisk

Po dodaniu nowej opcji przypisany klawisz skrótu wyświetli komunikat Wyłączony . Kliknij opcję Wyłączone, a po wyświetleniu monitu o przypisanie Caps LocKklucza naciśnij klawisz.


Odtwarzacze muzyki takie jak VLC

Postępuj zgodnie z instrukcjami dla Gnome w poprzedniej sekcji, ale zamiast tego użyj polecenia :

qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause

VLC nie rozpoznaje klawiszy multimedialnych: Jak sprawić, by klawisze multimedialne klawiatury działały globalnie z VLC? nawet po wbudowaniu w klawiaturę. Dlatego niestandardowy skrót klawiaturowy do XF86AudioPlay jest bezużyteczny xdotool.


Ustawianie niestandardowych skrótów klawiaturowych z wiersza poleceń

W tym pytaniu omówiono sposób ustawiania niestandardowych skrótów klawiaturowych z wiersza poleceń: Jak ustawić niestandardowe skróty klawiaturowe z terminala?


Dezaktywacja zatrzasków blokuje się na stałe

Następnym krokiem jest uczynienie tego setxkbmap -option caps:nonetrwałym podczas ponownego uruchamiania. Wyniki wyszukiwania Google w tej odpowiedzi Terdon: Zapisz ustawienia setxkbdmap :

Prostym sposobem byłoby dodanie polecenia do $HOME/.profilepliku (możesz go utworzyć, jeśli nie istnieje):

setxkbmap -option caps:none

To powinno sprawić, że będzie działać przy każdym logowaniu.

Zauważ , że należy użyć $HOME/.profilezamiast $HOME/.bash_profile, $HOME/.bashrclub jakiś inny plik podobny. Wynika to z faktu, że menedżer logowania powinien odczytać to ustawienie.

WinEunuuchs2Unix
źródło
Prosty, elegancki, spełnia swoje zadanie: idealna odpowiedź dla mnie!
Fabby
@Fabby Cóż, muszę przyznać, że jest łatwy do skonfigurowania i przetestowania i nie wymaga niskiego poziomu pomijania lub ciągłego uruchamiania skryptów. Przed natknięciem się na tę metodę przeszedłem cztery różne próby. Nadal nie nazwałbym tego doskonałym, ale DZIĘKI! . Jeśli znów pozwolą mi wrócić do Europy, kupię ci piwo.
WinEunuuchs2Unix
Czy to działa z Waylandem?
danzel
@dabzel Obawiam się, że Wayland nie współpracuje setxkbmap -option caps:none. Program narzędziowy jest zainstalowany, jednak Wayland ciągle przełącza wielkie i małe litery. Możesz zadać osobne pytanie, jak przekonać Waylanda do respektowania setxkbmap.
WinEunuuchs2Unix
3

Ta odpowiedź została przetestowana na Ubuntu MATE 16.04.4 LTS na maszynie wirtualnej (ale klawiatura była przejściową klawiaturą USB, więc to nie powinno mieć znaczenia). Nie wymaga również dodatkowego oprogramowania i można to zrobić przy instalacji waniliowej bez instalowania żadnych pakietów, i jest trwały między butami.

Zmień mapowanie Caps Lock

  1. Edytuj plik /usr/share/X11/xkb/symbols/pcjako root. Uważaj, aby nie popełnić tutaj błędu (np. Zapomnienie przecinka), ponieważ w takim przypadku możesz nie być w stanie korzystać z klawiatury. (Zgadnij, czego nauczyłem się na własnej skórze?)

  2. Skomentuj linię

        key <CAPS> {    [ Caps_Lock     ]   };
    

    umieszczając dwa ukośniki do przodu ( //) na początku.

  3. Dodaj pod nim następujący wiersz:

        key <CAPS> {    [ XF86AudioPlay, XF86AudioPause ]   };
    
  4. Skomentuj linię

        modifier_map Lock   { Caps_Lock };
    

    w taki sam sposób jak powyżej.

  5. Restart.

Uwaga: ( podziękowania dla danzela za wskazanie tego) Aktualizacje pakietu xkb-datamogą zastąpić ten plik. Racjonalnie bezpieczną metodą zapobiegania temu jest przekierowanie ścieżki dpkg-divert. (Mówię „w miarę bezpieczny”, ponieważ źródłowe źródło tego pliku nie zostało zmodyfikowane od trzech lat).

Alternatywna metoda

Ręcznie wyłącz klawisz Caps Lock w ustawieniach układu klawiatury, a następnie zastosuj podejście z tej odpowiedzi, aby dodać własne ponowne mapowanie klawiszy.

Problemy?

Klawisz blokady Caps nie blokuje już Caps i w tym momencie został ponownie przypisany do Play / Pause. Powinieneś być teraz w stanie odtwarzać i wstrzymywać muzykę w VLC. Jeśli to działa, możesz pominąć resztę instrukcji.

Jednak gdy spróbowałem, VLC nie zareagował na klawisz Play / Pause.

Upewnij się, że skrót klawiaturowy jest ustawiony prawidłowo

  1. Otwórz skróty klawiaturowe (System → Preferencje → Sprzęt → Skróty klawiaturowe)

  2. Upewnij się, że „Play (or Play / Pause)” jest ustawione na „XF86AudioPlay”

  3. Jeśli nie jest, kliknij sekcję „Skrót” i naciśnij nowy klawisz Odtwarzaj / Pauza, aby ustawić skrót. pomocny zrzut ekranu

  4. Jeśli nadal nie działa, uruchom ponownie kilka razy, aby zachować dokładność. (Właśnie to mnie naprawiło.)

Nonny Moose
źródło
Może to zakłócać xkbopcje, szczególnie caps:...te. Można go również zastąpić aktualizacjami systemu.
danzel
Rzeczywiście mógł. Warto jednak pamiętać o aktualizacjach systemu. Dodam notatkę na ten temat w mojej odpowiedzi. Dziękujemy za opinię!
Nonny Moose
Drodzy wszyscy, wow !! Przykro mi było przez chwilę :-) i teraz odkrywam cały wysiłek włożony w rozwiązanie !! Spróbuje odpowiedzieć @ WinEunuuchs2Unix i będzie na bieżąco. Dzięki, LLAP !!
2BFrank
@ 2BFrank Czy z ciekawości znalazłeś odpowiedź, która zadziałała?
Nonny Moose
1

Zainstaluj xbindkeys, xcape i playerctl . Upewnij się, że xcape(mapowanie CapsLockdo klucza zapasowego jak Alt+F12przez xcape -e 'Caps_Lock=Alt_L|F12) i playerctlsą autostarted na log-in, i dodać do pliku ~/.xbindkeysrcdwie linie

"playerctl play-pause"
  Alt + F12
Enno
źródło
0

Ustaw klawisz Capslock jako klawisz odtwarzania / pauzy

To rozwiązanie spowoduje ponowne przypisanie kodu scancode klawisza Capslock do innego kodu w sterowniku wejściowym jądra, w tym przypadku odtwarzanie / pauza.

Zalety

  • Nie trzeba modyfikować istniejących plików systemowych (należy utworzyć tylko jeden nowy plik)
  • Aplikacje nie będą wiedziały, że tak naprawdę jest to klawisz Capslock, ale sądzą, że został naciśnięty prawdziwy klawisz odtwarzania / pauzy
  • Nie trzeba wyłączać Capslocka, nie ma możliwości zepsucia xkbkonfiguracji

Niedogodności

  • Należy to zrobić dla każdej klawiatury osobno (co w zależności od sytuacji może być również zaletą)

Wymagania wstępne

  • evtest (można zainstalować przez sudo apt-get install evtest)

Procedura

W terminalu uruchom sudo evtesti wybierz klawiaturę. Jeśli po naciśnięciu klawisza nie ma wyjścia, naciśnij Ctrl+ Ci wypróbuj inne urządzenie. Zapamiętaj wybrany numer zdarzenia urządzenia, będziemy go później potrzebować. Naciśnij klawisz Capslock. Pojawią się następujące wiersze:

Event: time 1529406021.187148, -------------- SYN_REPORT ------------
Event: time 1529406021.218427, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039
Event: time 1529406021.218427, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0

Potrzebujemy wartości z MSC_SCANlinii poprzedzającej KEY_CAPSLOCKlinię. W powyższym przykładzie byłoby to 70039, ale skancode na klawiaturze jest prawdopodobnie inny.

Teraz uruchom następujące polecenie, ale zamień X na numer zdarzenia urządzenia użyty dla evtestpolecenia:

grep "" /sys/class/input/eventX/device/id/*

... to wyjście wola bustype, product, vendori versionna klawiaturze.

Utwórz plik o nazwie 65-keyboard-custom.hwdbw /etc/udev/hwdb.d/(wymagane uprawnienia roota) o następującej treści:

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 KEYBOARD_KEY_[scancode]=playpause

...gdzie

  • [autobus], [sprzedawca], [produkt] i [wersja] mają dokładnie 4 znaki, a litery muszą być pisane wielkimi literami
  • [scancode] musi być małymi literami
  • evdev:...linia ma żadnych poprzedzających przestrzeń
  • KEYBOARD_KEY...linia ma dokładnie jeden poprzedni przestrzeń

Na przykład:

evdev:input:b0003v046DpC228e0110*
 KEYBOARD_KEY_70039=playpause

Na koniec skompiluj nową konfigurację do sprzętowej bazy danych:

sudo systemd-hwdb update

Jeśli chcesz natychmiast zastosować zmiany, poinformuj udev:

sudo udevadm trigger

Jeśli chcesz przywrócić zmiany, po prostu usuń utworzony plik i uruchom ponownie.

Bardziej szczegółowe informacje można znaleźć w mojej oryginalnej odpowiedzi na ten temat.

danzel
źródło
@Nonny Moose dlatego napisałem „Należy wykonać dla każdej klawiatury osobno”. Ponadto możesz określić dowolną liczbę klawiatur, więc naprawdę musisz to zrobić tylko dla każdej nowej kupowanej klawiatury. Z drugiej strony możesz pominąć klawiaturę, jeśli chcesz, np. Ponieważ ma ona już fizyczny klawisz odtwarzania / pauzy.
danzel
... Cóż, nie zwracałem uwagi. Poprawiono mnie.
Nonny Moose
0

Może za pomocą xbindkeyslub XTEmożesz to zrobić. Ale najpierw upewnij się, co to są kody, możesz zobaczyć kod klawisza Capslock za pomocą polecenia xevw terminalu i naciskając go (możesz zobaczyć kod dowolnego przycisku keu lub myszy, w tym myszy do gier). Mając w ręku kod klawiszy Capslock i Play możesz edytować plik confi xbindkeys i wprowadzać tam swoje zmiany. użyj touch ~/.xbindkeysrcdo utworzenia pliku konfiguracyjnego (jeśli system nie utworzy go automatycznie) i nano ~/.xbindkeysrcdo edycji. Użyłem go w zeszłym miesiącu i tutaj jest to egzamin. spójrz na te linki, które mogą być dla Ciebie bardzo pomocne.

https://help.ubuntu.com/community/MultimediaKeys

https://gist.github.com/jbonney/5743509

Zmień przypisanie przycisku myszy do gier na klawisz klawiatury

https://matmunn.me/post/binding-volume-control-mouse-buttons-ubuntu/

Edmilson Gonçalves
źródło