Sprawdź, czy zatrzaski blokują się w terminalu

8

Czy istnieje sposób na wysłanie zapytania do systemu w celu ustalenia, czy funkcja Caps Lock jest włączona, czy wyłączona z wiersza poleceń w terminal.app?

Toothrot
źródło
3
Czy wpisanie jednej litery nie pokazuje od razu statusu Caps Lock? Jakie jest faktyczne wykorzystanie tych informacji. Być może pytasz o problem XY ?
bmike
Co dokładnie próbujesz osiągnąć? Istnieją narzędzia innych firm, które mogą poinformować cię o stanie klawiszy modyfikujących, jednak nic natywnego (domyślnie instalowanego), o którym wiem, ale to nie znaczy, że nie ma.
user3439894,
2
Używam diody LED, aby wskazać, że źródłem wejściowym jest język grecki. Chcę, aby było wyłączone tylko wtedy, gdy źródłem wejściowym jest angielski i Caps Lock jest wyłączony.
Toothrot,
1
@Lawrence To świetna konfiguracja. Jeśli chcesz dodać to do pytania - niesamowite. Założę się, że wiele osób chciałoby wiedzieć, jak dokonałeś tej modyfikacji.
bmike
1
Użyłem Karabinera i busyloop / maclight od Github.
Toothrot,

Odpowiedzi:

9

Na Macscripter jest świetny kod wiersza poleceń napisany przez Stefenka

Kod Stefena pozwala wykryć polecenia cmd, Option, Control, Shift i Caps Lock.

W swoim poście udostępnia kod i plik zip do pobrania.

Możesz go pobrać lub zbudować w Xcode za pomocą projektu fundacji.

Właśnie przetestowałem oba sposoby w El Capitan i oba działają.

Kod, jeśli chcesz zbudować własny w Xcode.app, to:

#import <Carbon/Carbon.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        unsigned int modifiers = GetCurrentKeyModifiers();
        if (argc == 1)
            printf("%d\n", modifiers);
        else {
            int i, result = 1;
            for (i = 1; i < argc; ++i) {
                if (0 == strcmp(argv[i], "shift"))
                    result = result && (modifiers & shiftKey);
                else if (0 == strcmp(argv[i], "option"))
                    result = result && (modifiers & optionKey);
                else if (0 == strcmp(argv[i], "cmd"))
                    result = result && (modifiers & cmdKey);
                else if (0 == strcmp(argv[i], "control"))
                    result = result && (modifiers & controlKey);
                else if (0 == strcmp(argv[i], "capslock"))
                    result = result && (modifiers & alphaLock);
            }
            printf("%d\n", result);
        }
    }
    return 0;
}

---------- (aktualizacja ->

Jeśli chcesz go skompilować z Terminal.app

Umieść kod w zwykłym pliku tekstowym. Właśnie użyłem TextEdit.app i zwykłego dokumentu tekstowego.

cd do tego samego katalogu co twój plik. Upewnij się, że rozszerzenie to .m (.c będzie również w porządku)

Następnie uruchomić.

gcc  -framework Carbon CheckModKeys.m -o CheckModKeys

CheckModKeys.m to Twój plik.

CheckModKeys to nazwa aplikacji, która ma zostać wyprowadzona.

<-)


Aby wykryć blokadę klawiszy, twoje polecenie wyglądałoby mniej więcej tak:

/Users/UserName/MyFolder/CheckModKeys  capslock

1 lub 0 zostanie zwrócone.

1 na wł

0 za wyłączone


Wszystkie zasługi należą się Stefenowi. Przypomniałem sobie, że opublikował to w 2009 roku. I nadal działa do dzisiaj ..

markhunte
źródło
Dzięki! Jak to skompilować? Próbowałem, gcc -o getmod getmod.cale wróciło getmod.c:4:5: error: expected expression @autoreleasepool { ^ 1 error generated.
Toothrot
@Lawrence patrz zaktualizowana odpowiedź
markhunte
Nadal otrzymuję: `` Niezdefiniowane symbole dla architektury x86_64: „_objc_autoreleasePoolPop”, o którym mowa w: _main w main-93f6a5.o „_objc_autoreleasePoolPush”, o którym mowa w: _main in main-93f6a5.o ld: nie znaleziono symboli dla architektury x86_64 clang: error: komenda linkera nie powiodła się z kodem wyjścia 1 (użyj -v, aby zobaczyć wywołanie) ``
Toothrot
w jakim systemie operacyjnym to robisz
markhunte
1
Czat zniknął i ja też nie mogę go skompilować. Gdzie możesz go skompilować, @Toothrot?
Lars Nyström,
2

Jeśli masz zainstalowany XQuartz i albo działasz, albo nie przeszkadza ci uruchomienie, możesz uruchomić:xset -q

Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000000
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    off    02: Shift Lock:  off
    03: Group 2:     off    04: Mouse Keys:  off    05: Scroll Lock: off
Mikey TK
źródło
Nie mam xsetna El Capitan przy użyciu domyślnego konta użytkownika w bash. Czy to część konkretnej powłoki lub coś, co musisz zainstalować, aby polecenie działało?
bmike
@bike, xsetjest częścią, X11która nie jest domyślnie instalowana. Można go pobrać tutaj: XQuartz
user3439894
3
@Mikey TK, Problem z używaniem IMO xsetpolega na tym, że XQuartz.app otwiera się dla niego (`xset) w Terminalu. Dla mnie jest to niepożądane zachowanie, ponieważ chciałbym po prostu narzędzie CLI, które działa jak każde inne polecenie BSD.
user3439894,