Vraag Hoe schakel ik Caps Lock (het slot, niet de sleutel) uit via de opdrachtregel?


Om de een of andere reden zit mijn laptop vast in Caps Lock. ik heb de Caps Lock sleutel toegewezen door xmodmap naar hyper_l, dus ik heb geen caps_lock toets om het uit te schakelen. Is er een manier om dit via de opdrachtregel uit te schakelen? Het zou mooi zijn als ik de vergrendelingsstatus kon resetten zonder mijn computer opnieuw in te stellen, vooral voor toekomstige referentie. Dit is al eerder gebeurd, maar ik zou nu graag willen weten hoe het dit keer goed moet.


75
2017-11-17 17:51


oorsprong


[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [De volgende regel toevoegen aan .profile of .bash_profile zou caps lock moeten uitschakelen:] [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: geen - Pavlos Theodorou
@PavlosTheodorou, die de CAPS-sleutel uitschakelt, zal zijn status als OP-vereiste niet veranderen. - user.dz
daar zit een bug. er is momenteel geen commando om dat te doen. je zou setleds + caps of -caps kunnen gebruiken, maar het werkt niet. het enige wat u kunt doen is al beantwoord. je kunt caps opnieuw toewijzen - Pavlos Theodorou


antwoorden:


Ik ken geen enkele opdrachtregel voor die in Ubuntu. (Voor Num Lock is dat zo numlockx  Install numlockx.) Hier is een one-liner die u kunt kopiëren en plakken in een terminalvenster:

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)'

Hier is het weer in een meer uitgebreide vorm. Wij gebruiken de Python  ctypes bibliotheek om C-functies te bellen vanuit de X-bibliotheek direct. De functie XkbLockModifiers verandert de status van de toetsenbordvergrendelingen op het kerntoetsenbord (XkbUseCoreKbd = 0x0100), heeft invloed op Caps Lock (2) en stelt dit in op 0 (uit).

#!/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)

Als je een vastzittende modifier hebt, verander je 2 in het masker van de modifiers die je wilt uitschakelen. De modifiers zijn 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Rennen xmodmap -pm om te zien waar Mod1 tot en met Mod5 aan beantwoorden. Als u bijvoorbeeld alle modifiers wilt uitschakelen, belt u X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Om Num Lock in Mod2 in te schakelen en Caps Lock tegelijkertijd uit te schakelen, belt u X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Hier is een C-versie als je een klein binair getal wilt maken in plaats van Python aan te roepen. Compileren met gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, met de pakketten build-essentials en libx11-dev geïnstalleerd.

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

Ook mogelijk interessant is een manier om Caps Lock tijdelijk te negeren:

xkbset nullify lock

Hierna zal Caps Lock effectief permanent uitgeschakeld zijn, totdat u het opnieuw inschakelt xkbset nullify -lock.


118
2017-11-17 22:26



Ik zal het proberen als ik de volgende ben op mijn laptop. Ik sta nu op mijn bureaublad. - Echogene
Hmm, de python-methode werkte voor mij, maar na het upgraden naar Yakkety is dat niet het geval. De bug waar caps lock vast komt te zitten blijft natuurlijk bestaan! - Gringo Suave
@GringoSuave Ik heb geen idee waarom dat zou kunnen zijn. Installeer alstublieft xtrace en loop 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)' en plaats de laatste paar regels, beginnend met degene die bevat QueryExtension name='XKEYBOARD'. Ik beweer niet dat ik de uitvoer zal begrijpen, maar ik zal het proberen. - Gilles
Ik krijg een segfault: beëindigd door signaal SIGSEGV (adresgrensfout) Segmentatiefout ... - Gringo Suave
000: <: 0005: 20: Request (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Reply to 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: Reply to UseExtension: major = 1 minor = 0 - Gringo Suave


X automatisering tools kunnen worden gebruikt voor het verzenden van de vereiste sleutelgebeurtenissen.

Notitie:
  Voor deze oplossing moet je het juiste wachtwoord vastleggen, als je dat wilt   CAPS is op dit moment actief: open office writer, schrijf wachtwoord daar,   verander het briefje, kopieer het en plak het in het wachtwoorddialoogvenster.

Als die vorige stap niet mogelijk is of niet werkt, ga dan met Gilles 'antwoord / python-script. Het hoeft geen extra tool te installeren, het gebruikt alleen python & libX11 gedeelde lib die vooraf zijn geïnstalleerd.

Gebruik makend van xdotool

  1. Installeer het

    sudo apt-get install xdotool
    
  2. Stuur een CAPS down / up-gebeurtenis

    xdotool key Caps_Lock
    

Een ander hulpmiddel is xte

  1. Installeer het

    sudo apt-get install xautomation
    
  2. Stuur een CAPS-lock down / up-gebeurtenis

    xte "key Caps_Lock"
    

Referenties:


42
2018-04-11 08:41



Wat als dit niet werkt? - quant_dev
Dit is de enige die voor mij werkte. nietig verklaren en anderen niet werken. - lnostdal
KAN NIET INSTALLEREN, WACHTWOORD NIET GEACCEPTEERD. :( - Gringo Suave
Ja, bedankt, py script werkte. ;) - Gringo Suave
Als u een extern toetsenbord gebruikt, kan een andere optie het opnieuw aansluiten; Caps Lock-modifier kan worden gereset, zodat u kleine letters kunt invoeren. - chris544


Wat betreft de versie van de Gilles python die niet werkt in nieuwere ubuntus, lijkt het instellen van de juiste return voor de open display de juiste oplossing:

#! /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)

(Code aangepast van https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress)


6
2017-07-30 15:37





Als je geen toegang hebt tot CAPS omdat je het opnieuw hebt toegewezen in .bashrc, zoals ik deed, dan schakelde ik eenvoudigweg over naar een virtuele terminal (alt + ctl + fN) en vervolgens schakelde ik weer terug.


3
2018-06-27 06:01



Overschakelen deed het niet helemaal, maar het bracht me op een punt waarop ik caps lock kon indrukken om iets goed te doen. - labyrinth