Jak wyłączyć Caps Lock (blokada, a nie klucz) za pomocą wiersza poleceń?

91

Z jakiegoś powodu mój laptop utknął w Caps Lock. Mam Caps Lockklucz odwzorowaną przez xmodmapsię hyper_l, więc ja nie mam caps_lockklucza, aby go wyłączyć. Czy istnieje sposób, aby to wyłączyć za pomocą wiersza poleceń? Byłoby miło, gdybym mógł zresetować stan blokady bez resetowania komputera, szczególnie na przyszłość. Stało się to wcześniej, ale tym razem chciałbym wiedzieć, jak zrobić to właściwie.

Echogen
źródło
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Dodanie następującego wiersza do .profile lub .bash_profile powinno wyłączyć Caps Lock:] [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, który wyłączy klucz CAPS, nie zmieni statusu na wymaganie OP.
user.dz
tam jest błąd. obecnie nie ma takiego polecenia. możesz użyć setleds + caps lub -caps, ale to nie działa. jedyne, co możesz zrobić, to już odpowiedź. można ponownie mapować czapki
Pavlos Theodorou

Odpowiedzi:

129

Nie znam żadnego narzędzia wiersza poleceń do tego w Ubuntu. (W przypadku Num Lock istnieje numlockx Zainstaluj numlockx .) Oto linijka, którą można skopiować i wkleić do okna terminala:

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

Tutaj znów jest w bardziej rozszerzonej formie. Używamy Pythona biblioteki ctypes do wywoływania funkcji C z biblioteki X bezpośrednio. Funkcja XkbLockModifierszmienia stan blokowania klawiatury na klawiaturze podstawowej ( XkbUseCoreKbd= 0x0100), wpływając na Caps Lock (2), ustawiając go na 0 (wyłączony).

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

Jeśli masz zablokowany modyfikator, zmień 2 na maskę modyfikatorów, które chcesz wyłączyć. Modyfikatory to 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Uruchom, xmodmap -pmaby zobaczyć, co odpowiadają Mod1 do Mod5. Na przykład, aby wyłączyć wszystkie modyfikatory, zadzwoń X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Aby włączyć Num Lock, który jest włączony w Mod2 i jednocześnie wyłączyć Caps Lock, zadzwoń X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Oto wersja C, jeśli chcesz zrobić mały plik binarny zamiast wywoływać Pythona. Kompiluj z gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11pakietami build-essentialsi libx11-devzainstalowanymi.

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

Być może zainteresuje Cię również sposób na tymczasowe zignorowanie Caps Lock:

xkbset nullify lock

Następnie Caps Lock będzie trwale wyłączony, dopóki go nie włączysz ponownie xkbset nullify -lock.

Gilles
źródło
Spróbuję, kiedy będę następny na moim laptopie. Na razie jestem na pulpicie.
Echogene,
Hmm, metoda python kiedyś działała dla mnie, ale po aktualizacji do Yakkety nie działa. Błąd, w wyniku którego blokuje się Caps Lock, nadal istnieje!
Gringo Suave,
@GringoSuave Nie mam pojęcia, dlaczego tak jest. Zainstaluj, xtraceuruchom 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)'i opublikuj kilka ostatnich wierszy, zaczynając od tego zawierającego QueryExtension name='XKEYBOARD'. Nie twierdzę, że zrozumiem wynik, ale spróbuję.
Gilles
2
Dostaję błąd: zakończony sygnałem SIGSEGV (błąd granicy adresu) Błąd segmentacji…
Gringo Suave
000: <: 0005: 20: Żądanie (98): nazwa zapytania QueryExtension = „XKEYBOARD” 000:>: 0005: 32: odpowiedź na zapytanie 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: Odpowiedz na użycieExtension: major = 1 minor = 0
Gringo Suave
59

Narzędzia X do automatyzacji można wykorzystać do wysyłania wymaganych kluczowych zdarzeń.

Uwaga:
Przy pierwszym użyciu, to rozwiązanie wymaga taśmowego poprawnego hasła, aby zainstalować nowe narzędzie, jeśli CAPS jest obecnie aktywny:

  • Użyj SHIFTklawisza, aby wpisać małe litery.
  • Włącz dostępność, nałóż wirtualną klawiaturę.
  • Ponownie podłącz zewnętrzną klawiaturę. (Dzięki chris455 )
  • Otwórz program do pisania biura, wpisz tam hasło, zmień wielkość liter, skopiuj je, a następnie wklej w oknie dialogowym hasła.

Jeśli wszystkie poprzednie opcje nie są możliwe lub nie działają, przejdź ze skryptem odpowiedzi / python Gillesa . Nie musi instalować żadnego dodatkowego narzędzia, używa tylko pythoni libX11współdzielonej biblioteki lib, która jest wstępnie zainstalowana.

Za pomocą xdotool

  1. Zainstaluj to

    sudo apt-get install xdotool
    
  2. Wyślij zdarzenie CAPS down / up

    xdotool key Caps_Lock
    

Innym narzędziem jest xte

  1. Zainstaluj to

    sudo apt-get install xautomation
    
  2. Wyślij zdarzenie blokowania / podnoszenia CAPS

    xte "key Caps_Lock"
    

Bibliografia:

user.dz
źródło
Co jeśli to nie zadziała?
quant_dev
2
To jedyny, który dla mnie zadziałał. nullify i inne nie działały.
lnostdal
12
NIE MOŻNA ZAINSTALOWAĆ, HASŁO NIE AKCEPTOWANE. :(
Gringo Suave
2
Możesz używać klawiszy Shift do wprowadzania małych liter, gdy włączona jest funkcja Caps Lock.
chris544
1
Jeśli używasz klawiatury zewnętrznej, inną opcją może być ponowne podłączenie; Modyfikator Caps Lock może zostać zresetowany, więc możesz wprowadzać małe litery.
chris544
14

Jeśli chodzi o wersję Gilles Python, która nie działa w nowszym systemie Ubuntus, ustawienie poprawnego zwrotu dla otwartego ekranu wydaje się załatwić:

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

(Kod zaadaptowany z https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )

diegogs
źródło
To działa naprawdę dobrze, jest wybawcą życia
Garret Gang
8

Jeśli nie możesz uzyskać dostępu do CAPS, ponieważ odwzorowałeś go w .bashrc, tak jak ja, to po prostu przełączenie na terminal wirtualny (alt + ctl + fN), a następnie przełączenie z powrotem działało dla mnie.

Benzoes
źródło
1
Przełączanie nie do końca to zrobiło, ale doprowadziło mnie do punktu, w którym mogłem nacisnąć Caps Lock, aby wszystko naprawić.
labirynt
1

Miałem ten problem i byłem w stanie go naprawić za pomocą klawiatury OnBoard (w Ubuntu Mate, w Universal Access).

Po włączeniu powinieneś zobaczyć, że klawisz CapsLock jest czerwony lub w jakiś sposób wskazać, że jest zablokowany. Następnie możesz nacisnąć, aby wyłączyć.

jogin
źródło