Verifique se as tampas estão travadas no terminal

8

Existe uma maneira de consultar o sistema para saber se o caps lock está ativado ou desativado na linha de comando no terminal.app?

Toothrot
fonte
3
Digitar uma letra não mostraria imediatamente o status do caps lock? Qual é o uso real dessas informações. Talvez você esteja perguntando sobre o problema XY ?
bmike
O que exatamente você está tentando realizar? Existem utilitários de terceiros que podem informar o estado das chaves modificadoras, mas nada nativo (instalado por padrão) que eu saiba, mas isso não significa que não exista.
user3439894
2
Estou usando o LED para indicar que a fonte de entrada é grega. Quero que seja desativado apenas se a fonte de entrada for em inglês e o caps lock estiver desativado.
21415 Toothrot
11
@ Lawrence Agora essa é uma configuração legal. Se você quiser adicionar isso à pergunta - incrível. Aposto que muitas pessoas gostariam de saber como você realizou essa modificação.
bmike
11
Usei o Karabiner e o busyloop / maclight do Github.
Toothrot 14/10/2015

Respostas:

9

Existe um ótimo código de linha de comando escrito por Stefenk no Macscripter

O código de Stefen permite detectar cmd, opção, controle, mudança e caps lock.

Em seu post, ele fornece o código e um zip para download.

Você pode fazer o download ou criar o seu próprio no Xcode usando o projeto de fundação.

Acabei de testar os dois lados em El Capitan e os dois funcionam.

O código se você deseja criar o seu próprio no 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;
}

---------- (atualização ->

Se você deseja compilá-lo no Terminal.app

Coloque o código em um arquivo de texto sem formatação. Eu apenas usei TextEdit.app e um documento de texto sem formatação.

cd para o mesmo diretório que o seu arquivo. Verifique se a extensão é .m (.c também ficará ok)

Então corra.

gcc  -framework Carbon CheckModKeys.m -o CheckModKeys

CheckModKeys.m é o seu arquivo.

CheckModKeys é o nome do aplicativo a ser produzido.

<-)


Para detectar caps lock, seu comando seria semelhante a:

/Users/UserName/MyFolder/CheckModKeys  capslock

um 1 ou 0 será retornado.

1 para em

0 para desligado


Todo o crédito é para Stefen. Acabei de me lembrar que ele postou desta maneira em2009. E ainda funciona hoje ..

markhunte
fonte
Obrigado! Como faço para compilar isso? Eu tentei gcc -o getmod getmod.c, mas que retornou getmod.c:4:5: error: expected expression @autoreleasepool { ^ 1 error generated.
Toothrot
@Lawrence ver resposta atualizada
markhunte 14/10
Eu ainda recebo: `` Símbolos indefinidos para a arquitetura x86_64: "_objc_autoreleasePoolPop", mencionado em: _main em main-93f6a5.o "_objc_autoreleasePoolPush", mencionado em: _main em main-93f6a5.o ld: symbol (s) não encontrado (s) para arquitetura x86_64 clang: error: o comando do vinculador falhou com o código de saída 1 (use -v para ver a invocação) ``
Toothrot
em que sistema operacional você está fazendo isso #
markhunte 16/10/2015
11
O bate-papo acabou e eu também não posso compilá-lo. Onde você pode compilá-lo, @Toothrot?
Lars Nyström
2

Se você possui o XQuartz instalado e está executando ou não se importa com o lançamento, é possível executar: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
fonte
Eu não tenho xsetno El Capitan usando uma conta de usuário padrão no bash. Isso faz parte de um shell específico ou algo que você precisa instalar para que o comando funcione?
bmike
@bmike, xsetfaz parte do X11qual não está instalado por padrão. Você pode obtê-lo aqui: XQuartz
user3439894
3
@ Mikey TK, O problema do IMO com o uso xseté que ele faz com que o XQuartz.app seja aberto (xset) para ser executado em um Terminal. Para mim, esse é um comportamento indesejável, pois eu gostaria apenas de um utilitário CLI que seja executado como qualquer outro comando BSD.
user3439894