Wie deaktiviere ich die Feststelltaste (die Sperre, nicht die Taste) über die Befehlszeile?

91

Aus irgendeinem Grund steckt mein Laptop in der Feststelltaste. Ich habe den Caps LockSchlüssel von xmodmapbis zugeordnet hyper_l, sodass ich keinen caps_lockSchlüssel zum Ausschalten habe. Gibt es eine Möglichkeit, es über die Befehlszeile auszuschalten? Es wäre schön, wenn ich den Sperrstatus zurücksetzen könnte, ohne meinen Computer zurückzusetzen, insbesondere zum späteren Nachschlagen. Das ist schon mal passiert, aber ich würde jetzt gerne wissen, wie man es dieses Mal richtig macht.

Echogene
quelle
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Das Hinzufügen der folgenden Zeile zu .profile oder .bash_profile sollte die Feststelltaste deaktivieren:] [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: keine
Pavlos Theodorou
@PavlosTheodorou, das die CAPS-Taste deaktiviert, schaltet ihren Status nicht als OP-Anforderung um.
user.dz
da ist ein Fehler. Derzeit gibt es keinen Befehl dazu. Sie könnten setleds + caps oder -caps verwenden, aber es funktioniert nicht. Das einzige, was Sie tun können, ist bereits beantwortet. Sie können Kappen neu zuordnen
Pavlos Theodorou

Antworten:

129

Ich kenne kein Kommandozeilen-Tool dafür in Ubuntu. (Für Num Lock gibt es numlockx Installieren Sie numlockx .) Hier ist ein Einzeiler , den Sie kopieren und in ein Terminalfenster einfügen können:

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 ist es wieder in erweiterter Form. Wir verwenden die Python- ctypes-Bibliothek , um C-Funktionen direkt aus der X-Bibliothek aufzurufen . Die Funktion XkbLockModifiersändert den Status der Tastatursperren auf der Haupttastatur ( XkbUseCoreKbd= 0x0100), wirkt sich auf die Feststelltaste (2) aus und setzt sie auf 0 (Aus).

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

Wenn Sie einen Modifikator stecken haben, ändern Sie 2 in die Maske der Modifikatoren, die Sie deaktivieren möchten. Die Modifikatoren sind 1 = Umschalttaste, 2 = Feststelltaste (Feststelltaste), 4 = Steuerung, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Führen Sie aus, um xmodmap -pmzu sehen, welcher Mod1 bis Mod5 entsprechen. Um beispielsweise alle Modifikatoren zu deaktivieren, rufen Sie auf X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Rufen Sie an, um die Num-Taste (Mod2) zu aktivieren und gleichzeitig die Feststelltaste zu deaktivieren X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Hier ist eine C-Version, wenn Sie eine kleine Binärdatei erstellen möchten, anstatt Python aufzurufen. Kompilieren Sie mit gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, mit den Paketen build-essentialsund libx11-devinstalliert.

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

Möglicherweise ist auch eine Möglichkeit von Interesse, die Feststelltaste vorübergehend zu ignorieren:

xkbset nullify lock

Danach ist die Feststelltaste dauerhaft deaktiviert, bis Sie sie wieder aktivieren xkbset nullify -lock.

Gilles
quelle
Ich werde es versuchen, wenn ich das nächste Mal auf meinem Laptop bin. Ich bin jetzt auf meinem Desktop.
Echogene
Hmm, die Python-Methode hat bei mir funktioniert, nach dem Upgrade auf Yakkety jedoch nicht. Der Fehler, durch den die Feststelltaste blockiert wird, bleibt natürlich bestehen!
Gringo Suave
@GringoSuave Ich habe keine Ahnung, warum das sein könnte. Bitte installieren xtraceund starten 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)'und posten Sie die letzten Zeilen, beginnend mit der, die enthält QueryExtension name='XKEYBOARD'. Ich behaupte nicht, dass ich die Ausgabe verstehe, aber ich werde es versuchen.
Gilles
2
Ich erhalte einen Segfehler: Beendet durch das Signal SIGSEGV (Adressgrenzenfehler) Segmentierungsfehler…
Gringo Suave
000: <: 0005: 20: Request (98): Name der Abfrageerweiterung = 'XKEYBOARD' 000:>: 0005: 32: Antwort auf Abfrageerweiterung: present = true (0x01) major-opcode = 135 first-event = 85 first-error = 137 000: <: 0006: 8: XKEYBOARD-Anfrage (135,0): UseExtension major = 1 minor = 0 000:>: 0006: 32: Antwort auf UseExtension: major = 1 minor = 0
Gringo Suave
59

X-Automatisierungstools können zum Senden der erforderlichen Schlüsselereignisse verwendet werden.

Hinweis:
Für die erste Verwendung dieser Lösung müssen Sie das richtige Kennwort auf Band speichern, um das neue Tool zu installieren, wenn Ihre CAPS derzeit aktiv ist:

  • Verwenden Sie die SHIFTTaste, um Kleinbuchstaben einzugeben.
  • Eingabehilfen aktivieren, virtuelle Tastatur einblenden.
  • Schließen Sie eine externe Tastatur wieder an. (Danke an chris455 )
  • Öffnen Sie Office Writer, geben Sie dort ein Kennwort ein, ändern Sie den Groß- und Kleinschreibungstext, kopieren Sie ihn und fügen Sie ihn in das Kennwortdialogfeld ein.

Wenn alle vorherigen Optionen nicht möglich sind oder nicht funktionieren, verwenden Sie Gilles 'Antwort- / Python-Skript . Es muss kein zusätzliches Tool installiert werden. Es wird nur python& libX11shared lib verwendet, die vorinstalliert sind.

Verwenden xdotool

  1. Es installieren

    sudo apt-get install xdotool
    
  2. Senden Sie ein CAPS-Down / Up-Ereignis

    xdotool key Caps_Lock
    

Ein weiteres Werkzeug ist xte

  1. Es installieren

    sudo apt-get install xautomation
    
  2. Senden eines CAPS-Lock-Down / Up-Ereignisses

    xte "key Caps_Lock"
    

Verweise:

user.dz
quelle
Was ist, wenn das nicht funktioniert?
quant_dev
2
Dies ist die einzige, die für mich gearbeitet hat. annullieren und andere haben nicht funktioniert.
lnostdal
12
KANN NICHT INSTALLIEREN, PASSWORT NICHT AKZEPTIERT. :(
Gringo Suave
2
Sie können die Umschalttaste zur Eingabe von Kleinbuchstaben verwenden, während die Feststelltaste aktiviert ist.
Chris544
1
Wenn Sie eine externe Tastatur verwenden, kann es sein, dass Sie sie erneut anschließen. Der Feststelltasten-Modifikator wird möglicherweise zurückgesetzt, sodass Sie Kleinbuchstaben eingeben können.
Chris544
14

Da die Gilles-Python-Version in neueren Ubuntus-Versionen nicht funktioniert, scheint die Einstellung der korrekten Rückgabe für die geöffnete Anzeige die Lösung zu sein:

#! /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 angepasst von https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )

Diegogs
quelle
Das funktioniert wirklich gut, ist ein Lebensretter
Garret Gang
8

Wenn Sie nicht auf CAPS zugreifen können, weil Sie es in .bashrc neu zugeordnet haben, wie ich es getan habe, hat es für mich funktioniert, einfach auf ein virtuelles Terminal (alt + ctl + fN) umzuschalten und dann zurückzuschalten.

Benjamin
quelle
1
Das Umschalten hat nicht ganz geklappt, aber es hat mich an einen Punkt gebracht, an dem ich die Feststelltaste drücken konnte, um die Sache richtig zu machen.
Labyrinth
1

Ich hatte dieses Problem und konnte es mithilfe der OnBoard-Tastatur (in Ubuntu Mate unter Universal Access) beheben.

Nach dem Einschalten sollte die Feststelltaste rot sein oder irgendwie darauf hinweisen, dass sie gesperrt ist. Dann können Sie drücken, um auszuschalten.

Jogi
quelle