Come posso disattivare il BLOC MAIUSC (il lucchetto, non la chiave) dalla riga di comando?


91

Per qualche ragione il mio laptop è bloccato in Caps Lock. Ho la Caps Lockchiave mappata da xmodmapa hyper_l, quindi non ho una caps_lockchiave per disattivarla. C'è un modo per disattivarlo dalla riga di comando? Sarebbe bello se potessi ripristinare lo stato di blocco senza ripristinare il mio computer, soprattutto per riferimento futuro. Questo è successo prima, ma vorrei sapere ora come farlo correttamente questa volta.


[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 maiuscole:] [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 MAIUSC, non commuterà il suo stato come requisito OP.
user.dz

c'è un bug lì. attualmente non esiste alcun comando per farlo. potresti usare setleds + caps o -caps ma non funziona. l'unica cosa che puoi fare è già una risposta. puoi rimappare i tappi
Pavlos Theodorou,

Risposte:


129

Non conosco alcun strumento da riga di comando per quello in Ubuntu. (Per Num Lock, c'è numlockx Installa numlockx .) Ecco una riga che puoi copiare e incollare in una finestra 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ù estesa. Usiamo il Python biblioteca ctypes chiamare funzioni C dalla libreria di X direttamente. La funzione XkbLockModifiersmodifica lo stato dei blocchi tastiera, sulla tastiera principale ( XkbUseCoreKbd= 0x0100), influendo 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, cambia 2 nella maschera dei modificatori che desideri disattivare. I modificatori sono 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Esegui xmodmap -pmper vedere a cosa corrisponde Mod1 tramite Mod5. Ad esempio, per disattivare tutti i modificatori, chiama X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Per attivare il Blocco numerico che è su Mod2 e allo stesso tempo disattivare il Blocco maiuscole, chiamare X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Ecco una versione C se vuoi creare 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-essentialse libx11-devinstallati.

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

Inoltre, forse di interesse è un modo per ignorare temporaneamente il Blocco maiuscole:

xkbset nullify lock

Successivamente, Caps Lock sarà effettivamente disattivato in modo permanente, fino a quando non lo riattiverai xkbset nullify -lock.


Ci proverò quando sarò il prossimo sul mio laptop. Sono sul mio desktop per ora.
Echogene,

Hmm, il metodo Python funzionava per me, ma dopo l'aggiornamento a Yakkety non funziona. Il bug in cui si blocca il blocco maiuscole persiste ovviamente!
Gringo Suave,

@GringoSuave Non ho idea del perché potrebbe essere. Installa, xtraceesegui 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 righe, iniziando da quella contenente QueryExtension name='XKEYBOARD'. Non pretendo che capirò l'output ma ci proverò.
Gilles,

2
Ricevo un segfault: terminato dal segnale SIGSEGV (Errore di confine dell'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 first-event = 85 first-error = 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

60

Gli strumenti di automazione X potrebbero essere utilizzati per l'invio degli eventi chiave richiesti.

Nota:
per il primo utilizzo, questa soluzione richiede di registrare la password corretta per installare il nuovo strumento, se CAPS è attualmente attivo:

  • Utilizzare il SHIFTtasto per digitare lettere minuscole.
  • Abilita accessibilità, sovrapponi tastiera virtuale.
  • Ricollegare una tastiera esterna. (Grazie a chris455 )
  • Apri Office Office, scrivi la password lì, cambia la lettera maiuscola, copialo, quindi incollalo nella finestra di dialogo della password.

Se tutte le opzioni precedenti non sono possibili o non funzionano, vai con lo script answer / python di Gilles . Non ha bisogno di installare alcuno strumento aggiuntivo, usa solo lib libere pythone libX11condivise preinstallate.

utilizzando xdotool

  1. Installalo

    sudo apt-get install xdotool
    
  2. Invia un evento MAIUSC / SU

    xdotool key Caps_Lock
    

Un altro strumento è xte

  1. Installalo

    sudo apt-get install xautomation
    
  2. Invia un evento BLOC MAIUSC / su

    xte "key Caps_Lock"
    

Riferimenti:


E se questo non funziona?
quant_dev,

2
Questo è l'unico che ha funzionato per me. annullare e gli altri non hanno funzionato.
lnostdal

12
NON POSSIBILE INSTALLARE, PASSWORD NON ACCETTATA. :(
Gringo Suave il

2
È possibile utilizzare i tasti Maiusc per inserire lettere minuscole mentre il Blocco maiuscole è abilitato.
chris544,

1
Se si utilizza una tastiera esterna, un'altra opzione potrebbe essere ricollegarla; Il modificatore BLOC MAIUSC potrebbe essere ripristinato, quindi è possibile inserire lettere minuscole.
chris544,

14

Per quanto riguarda la versione di Python di Gilles che non funziona nel nuovo Ubuntus, l'impostazione del ritorno corretto per il display 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 )


Funziona davvero bene, è un salvatore di vita
Garret Gang

8

Se non riesci ad accedere a CAPS perché l'hai rimappato in .bashrc, come ho fatto io, allora è sufficiente passare a un terminale virtuale (alt + ctl + fN) e poi tornare indietro ha funzionato per me.


1
Il cambio non lo ha fatto del tutto, ma mi ha portato a un punto in cui avrei potuto premere il tasto maiuscole per ottenere le cose giuste.
labirinto,

1

Ho avuto questo problema ed è stato in grado di risolverlo utilizzando la tastiera OnBoard (in Ubuntu Mate, sotto Universal Access).

Una volta acceso, dovresti vedere il tasto CapsLock rosso, o in qualche modo indicato che è bloccato. Quindi è possibile premere per disattivare.

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.