Controllare se i tappi si bloccano nel terminale


8

C'è un modo per interrogare il sistema per dire se il blocco maiuscole è attivato o è disattivato dalla riga di comando in terminal.app?


3
Digitare una lettera non ti mostrerebbe immediatamente lo stato del blocco maiuscole? Qual è l'uso effettivo di queste informazioni. Forse stai chiedendo del problema XY ?
bmike

Cosa stai cercando di realizzare esattamente? Ci sono utility di terze parti che possono dirti lo stato delle chiavi del modificatore, ma nulla di nativo (installato per impostazione predefinita) che io conosca, ma ciò non significa che non lo sia.
user3439894,

2
Sto usando il LED per indicare che la sorgente di ingresso è greca. Voglio che sia spento solo se la sorgente di input è inglese e il blocco maiuscole è disattivato.
Toothrot,

1
@Lawrence Ora questa è una bella configurazione. Se volessi aggiungere questo alla domanda - fantastico. Scommetto che molte persone vorrebbero sapere come hai realizzato quella modifica.
bmike

1
Ho usato Karabiner e busyloop / maclight di Github.
Toothrot,

Risposte:


9

C'è un ottimo codice da riga di comando scritto da Stefenk su Macscripter

Il codice di Stefen consente di rilevare cmd, opzioni, controllo, spostamento e blocco maiuscole.

Nel suo post fornisce il codice e un download zip di esso.

Puoi scaricarlo o crearne uno tuo in Xcode usando il progetto di fondazione.

Ho appena provato in entrambi i modi a El Capitan ed entrambi funzionano.

Il codice se vuoi crearne uno tuo in Xcode.app è:

#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;
}

---------- (aggiorna ->

Se vuoi compilarlo da Terminal.app

Inserisci il codice in un file di testo semplice. Ho appena usato TextEdit.app e un documento di testo semplice.

cd nella stessa directory del tuo file. Assicurati che l'estensione sia .m (anche .c sarà ok)

Quindi corri.

gcc  -framework Carbon CheckModKeys.m -o CheckModKeys

CheckModKeys.m è il tuo file.

CheckModKeys è il nome dell'app da inviare.

<-)


Per rilevare il blocco maiuscole, il comando dovrebbe assomigliare a:

/Users/UserName/MyFolder/CheckModKeys  capslock

verrà restituito 1 o 0.

1 per on

0 per spento


Tutto il merito va a Stefen. Ho appena ricordato che ha pubblicato in questo modo nel '2009. E funziona ancora oggi ..


Grazie! Come compilo questo? Ci ho provato, gcc -o getmod getmod.cma è tornato getmod.c:4:5: error: expected expression @autoreleasepool { ^ 1 error generated.
Toothrot

@Lawrence vedi risposta aggiornata
markhunte

Ricevo ancora: `` Simboli indefiniti per l'architettura x86_64: "_objc_autoreleasePoolPop", referenziato da: _main in main-93f6a5.o "_objc_autoreleasePoolPush", referenziato da: _main in main-93f6a5.o ld: symbol (s) non trovato per architecture x86_64 clang: errore: comando linker non riuscito con codice di uscita 1 (usare -v per vedere l'invocazione) ``
Toothrot

su quale SO stai facendo questo
markhunte,

1
La chat è sparita e non riesco nemmeno a compilarla. Dove sei riuscito a compilarlo, @Toothrot?
Lars Nyström,

2

Se XQuartz è installato e in esecuzione o non ti dispiace l'avvio, puoi eseguire: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

Non ho xsetsu El Capitan utilizzando un account utente predefinito in bash. Fa parte di una shell specifica o qualcosa che devi installare per far funzionare il comando?
bmike

@bmike, xsetfa parte del X11quale non è installato per impostazione predefinita. Puoi ottenerlo qui: XQuartz
user3439894

3
@Mikey TK, Il problema con IMO nell'utilizzo xsetè che fa aprire XQuartz.app per farlo funzionare (`xset) in un Terminale. Per me questo è un comportamento indesiderato poiché vorrei solo un'utilità CLI che funzioni come qualsiasi altro comando BSD.
user3439894,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.