Domanda Come disattivare Caps Lock (il blocco, non il tasto) dalla riga di comando?


Per qualche ragione il mio laptop è bloccato in Caps Lock. io ho il Blocco maiuscole tasto mappato da xmodmap a hyper_l, quindi non ho un caps_lock tasto per spegnerlo. C'è un modo per spegnerlo dalla riga di comando? Sarebbe bello se potessi ripristinare lo stato di blocco senza reimpostare il mio computer, soprattutto per riferimento futuro. Questo è successo prima, ma vorrei sapere ora come farlo correttamente questa volta.


75
2017-11-17 17:51


origine


[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [L'aggiunta della seguente riga a .profile o .bash_profile dovrebbe disabilitare il blocco maiuscolo:] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]: askubuntu.com/questions/43986/...    [2]: askubuntu.com/questions/43986/...    [3]: askubuntu.com/questions/43986/... - One Zero
setxkbmap -option caps: none - Pavlos Theodorou
@PavlosTheodorou, che disabiliterà la chiave CAPS, non cambierà il suo stato come requisito OP. - user.dz
c'è un bug lì. al momento non esiste alcun comando per farlo. potresti usare setled + caps o -caps ma non funziona. l'unica cosa che puoi fare è già una risposta. puoi rimappare i cappucci - Pavlos Theodorou


risposte:


Non conosco nessuno strumento a riga di comando per questo in Ubuntu. (Per Num Lock, c'è numlockx  Install numlockx.) Ecco un one-liner che puoi copiare e incollare in una finestra di terminale:

python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'

Eccolo di nuovo in una forma più espansa. Noi usiamo il Pitone  libreria dei tipi chiamare le funzioni C dal X biblioteca direttamente. La funzione XkbLockModifiers cambia lo stato dei blocchi della tastiera, sulla tastiera principale (XkbUseCoreKbd = 0x0100), che influisce sul blocco maiuscole (2), impostandolo su 0 (disattivato).

#!/usr/bin/env python
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

Se hai un modificatore bloccato, modifica 2 con la maschera dei modificatori che vuoi disattivare. I modificatori sono 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Correre xmodmap -pm per vedere a cosa corrispondono Mod1 e Mod5. Ad esempio, per disattivare tutti i modificatori, chiama X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Per attivare Bloc Num che si trova su Mod2 e allo stesso tempo disattivare Bloc Maiusc, chiama X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Ecco una versione C se vuoi fare un piccolo binario invece di invocare Python. Compilare con gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, con i pacchetti build-essentials e libx11-dev installato.

#include <stdio.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
int main()
{
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "Couldn't open display\n");
        return 2;
    }
    Bool sent = XkbLockModifiers(display, XkbUseCoreKbd, LockMask, 0);
    if (!sent) {
        fprintf(stderr, "Couldn't send LatchLockState\n");
        return 1;
    }
#ifdef REPORT_STATE
    XkbStateRec xkb_state;
    Status status = XkbGetState(display, XkbUseCoreKbd, &xkb_state);
    if (status) {
        fprintf(stderr, "XkbGetState returned %d\n", status);
        return 1;
    }
    printf("state.group=%02x\n", xkb_state.group);
    printf("state.locked_group=%02x\n", xkb_state.locked_group);
    printf("state.base_group=%02x\n", xkb_state.base_group);
    printf("state.latched_group=%02x\n", xkb_state.latched_group);
    printf("state.mods=%02x\n", xkb_state.mods);
    printf("state.base_mods=%02x\n", xkb_state.base_mods);
    printf("state.latched_mods=%02x\n", xkb_state.latched_mods);
    printf("state.locked_mods=%02x\n", xkb_state.locked_mods);
    printf("state.compat_state=%02x\n", xkb_state.compat_state);
    printf("state.grab_mods=%02x\n", xkb_state.grab_mods);
    printf("state.compat_grab_mods=%02x\n", xkb_state.compat_grab_mods);
    printf("state.lookup_mods=%02x\n", xkb_state.lookup_mods);
    printf("state.compat_lookup_mods=%02x\n", xkb_state.compat_lookup_mods);
    printf("state.ptr_buttons=%02x\n", xkb_state.ptr_buttons);
#endif
    int err = XCloseDisplay(display);
    if (err) {
        fprintf(stderr, "XCloseDisplay returned %d\n", err);
        return 1;
    }
    return 0;
}

Probabilmente anche di interesse è un modo per ignorare temporaneamente Caps Lock:

xkbset nullify lock

Dopodiché, Caps Lock sarà permanentemente spento, finché non lo riattiverai xkbset nullify -lock.


118
2017-11-17 22:26



Avrò un andare quando sono il prossimo sul mio computer portatile. Sono sul mio desktop per ora. - Echogene
Hmm, il metodo python usato per funzionare per me, ma dopo l'aggiornamento a Yakkety non lo fa. Il bug in cui si blocca il blocco maiuscole persiste, naturalmente! - Gringo Suave
@GringoSuave Non ho idea del perché possa essere. Si prega di installare xtrace e corri xtrace python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); buf = (c_char*16)(); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XkbGetState(display, 0x0100, buf); X11.XCloseDisplay(display)' e pubblica le ultime poche righe, iniziando da quella contenente QueryExtension name='XKEYBOARD'. Non dico che capirò l'output, ma ci proverò. - Gilles
Ottengo un segfault: terminato dal segnale SIGSEGV (Errore di confine indirizzo) Errore di segmentazione ... - Gringo Suave
000: <: 0005: 20: Request (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Rispondi a QueryExtension: present = true (0x01) major-opcode = 135 primo evento = 85 primo errore = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension major = 1 minor = 0 000:>: 0006: 32: Rispondi a UseExtension: major = 1 minor = 0 - Gringo Suave


Automazione X strumenti potrebbero essere utilizzati per inviare gli eventi chiave richiesti.

Nota:
  Questa soluzione ti richiede di registrare la password corretta, se la tua   CAPS è attualmente attivo: scrittore open office, password di scrittura lì,   cambia il case letterale, copialo, quindi incollalo nella finestra di dialogo della password.

Se quel passaggio precedente non è possibile o non funziona, vai con La risposta di Gilles / script di Python. Non ha bisogno di installare alcun strumento aggiuntivo, usa solo python & libX11 lib condivisa che è preinstallata.

utilizzando xdotool

  1. Installalo

    sudo apt-get install xdotool
    
  2. Invia un evento down / up CAPS

    xdotool key Caps_Lock
    

Un altro strumento è xte

  1. Installalo

    sudo apt-get install xautomation
    
  2. Invia un evento di lock down / up CAPS

    xte "key Caps_Lock"
    

Riferimenti:


42
2018-04-11 08:41



Cosa succede se questo non funziona? - quant_dev
Questo è l'unico che ha funzionato per me. annullare e altri non ha funzionato. - lnostdal
NON POSSIBILE INSTALLARE, PASSWORD NON ACCETTATO. :( - Gringo Suave
Sì, grazie, lo script py ha funzionato. ;) - Gringo Suave
Se si utilizza una tastiera esterna, un'altra opzione potrebbe ricollegarla; Il modificatore Caps Lock potrebbe essere ripristinato, quindi puoi inserire lettere minuscole. - chris544


Per quanto riguarda la versione di Gilles Python che non funziona in Ubuntu più recente, l'impostazione del ritorno corretto per lo schermo aperto sembra fare il trucco:

#! /usr/bin/env python

from ctypes import *
import subprocess

class Display(Structure):
    """ opaque struct """

X11 = cdll.LoadLibrary("libX11.so.6")
X11.XOpenDisplay.restype = POINTER(Display)

display = X11.XOpenDisplay(c_int(0))
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

(Codice adattato da https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress)


6
2017-07-30 15:37





Se non riesci ad accedere a CAPS perché lo hai rimappato in .bashrc, come ho fatto io, allora semplicemente passando a un terminale virtuale (alt + ctl + fN) e poi tornando indietro ha funzionato per me.


3
2018-06-27 06:01



Il passaggio non lo ha fatto, ma mi ha fatto arrivare al punto in cui avrei potuto premere Caps Lock per fare le cose nel modo giusto. - labyrinth