Как отключить Caps Lock (замок, а не ключ) из командной строки?

92

По какой-то причине мой ноутбук застрял в Caps Lock. У меня есть Caps Lockключ, связанный xmodmapс hyper_l, поэтому у меня нет caps_lockключа, чтобы выключить его. Есть ли способ, которым я могу отключить его с помощью командной строки? Было бы неплохо, если бы я мог сбросить состояние блокировки без перезагрузки компьютера, особенно для дальнейшего использования. Это уже случалось раньше, но я хотел бы знать, как это сделать правильно на этот раз.

Echogene
источник
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Добавление следующей строки в .profile или .bash_profile должно отключить блокировку caps:] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]: askubuntu.com/questions/ 43986 /… [2]: askubuntu.com/questions/43986/… [3]: askubuntu.com/questions/43986/…
один ноль
setxkbmap -опция заглавных букв: нет
Павлос Теодору
@PavlosTheodorou, который отключит ключ CAPS, не переключит свой статус в качестве требования OP.
user.dz
там есть ошибка в настоящее время нет команды сделать это. Вы можете использовать setleds + caps или -caps, но это не работает. единственное, что вы можете сделать, это уже ответил. Вы можете переназначить шапки
Павлос Теодору

Ответы:

130

Я не знаю ни одного инструмента командной строки для этого в Ubuntu. (Для Num Lock есть numlockx Установить numlockx .) Вот одна строка, которую вы можете скопировать и вставить в окно терминала:

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

Здесь это снова в более расширенной форме. Мы используем библиотеку Python ctypes для непосредственного вызова функций C из библиотеки X. Функция XkbLockModifiersизменяет состояние блокировок клавиатуры на основной клавиатуре ( XkbUseCoreKbd= 0x0100), воздействуя на Caps Lock (2), устанавливая его на 0 (выкл.).

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

Если у вас есть застрявший модификатор, измените 2 на маску модификаторов, которые вы хотите отключить. Модификаторы: 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Запустите, xmodmap -pmчтобы увидеть, что Mod1 через Mod5 соответствуют. Например, чтобы отключить все модификаторы, позвоните X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Чтобы включить Num Lock, который включен в Mod2, и одновременно отключить Caps Lock, позвоните X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Вот версия на C, если вы хотите создать небольшой двоичный файл вместо вызова Python. Скомпилируйте gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11с пакетами build-essentialsи libx11-devустановите.

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

Также возможно интерес представляет способ временно игнорировать Caps Lock:

xkbset nullify lock

После этого Caps Lock будет фактически отключен, пока вы не включите его снова xkbset nullify -lock.

жилль
источник
Я пойду, когда буду рядом на своем ноутбуке. Я сейчас на рабочем столе.
Echogene
Хм, метод python работал для меня, но после обновления до Yakkety это не так. Ошибка при блокировке заглавных букв сохраняется, конечно же!
Gringo Suave
@GringoSuave Я понятия не имею, почему это может быть. Пожалуйста, установите, xtraceзапустите 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)'и опубликуйте последние несколько строк, начиная с той, которая содержит QueryExtension name='XKEYBOARD'. Я не утверждаю, что пойму результат, но попробую.
Жиль
3
Я получаю segfault: прекращается сигналом SIGSEGV (Ошибка границы адреса) Ошибка сегментации ...
Gringo Suave
1
У меня был segfault на python (2), но он работал на python3
gtrak
60

Инструменты X могут быть использованы для отправки требуемых ключевых событий.

Примечание.
Для первого использования Это решение требует, чтобы вы записали правильный пароль для установки нового инструмента, если ваш CAPS в настоящее время активен:

  • Используйте SHIFTклавишу для ввода строчных букв.
  • Включить доступ, наложить виртуальную клавиатуру.
  • Повторно подключите внешнюю клавиатуру. (Благодаря chris455 )
  • Откройте офисную запись, введите пароль, измените регистр букв, скопируйте его и вставьте в диалоговое окно ввода пароля.

Если все предыдущие варианты невозможны или не работают, перейдите с помощью сценария ответа / Python Жиля . Он не требует установки какого-либо дополнительного инструмента, он использует только предустановленную pythonи libX11общую библиотеку.

С помощью xdotool

  1. Установить его

    sudo apt-get install xdotool
    
  2. Отправить событие CAPS вниз / вверх

    xdotool key Caps_Lock
    

Еще один инструмент xte

  1. Установить его

    sudo apt-get install xautomation
    
  2. Отправить CAPS блокировки вниз / вверх

    xte "key Caps_Lock"
    

Рекомендации:

user.dz
источник
Что если это не сработает?
quant_dev
2
Это единственный, который работал на меня. обнулить и другие не сработали.
Иностдал
12
НЕ МОЖЕТ УСТАНОВИТЬ, ПАРОЛЬ НЕ ПРИНЯТ. :(
Гринго Суаве
2
Вы можете использовать клавиши Shift для ввода строчных букв, когда включена функция Caps Lock.
chris544
1
Если вы используете внешнюю клавиатуру, другим вариантом может быть ее повторное подключение; Модификатор Caps Lock может быть сброшен, поэтому вы можете вводить строчные буквы.
chris544
15

Что касается Python-версии Gilles, не работающей в более новой версии Ubuntus, похоже, что установка правильного возврата для открытого дисплея имеет смысл:

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

(Код адаптирован с https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )

diegogs
источник
Это работает очень хорошо, это спаситель жизни
Гаррет Ган
8

Если вы не можете получить доступ к CAPS, потому что вы переназначили его в .bashrc, как я сделал, тогда просто переключение на виртуальный терминал (alt + ctl + fN) и затем переключение обратно работало для меня.

Вениамин
источник
1
Переключение не совсем это сделало, но это привело меня к точке, где я мог нажать на заглавные буквы, чтобы все было правильно.
Лабиринт
2

У меня была эта проблема, и я смог ее исправить, используя клавиатуру OnBoard (в Ubuntu Mate, под Universal Access).

После включения вы должны увидеть, что ключ CapsLock красный или каким-то образом указывает, что он заблокирован. Затем вы можете нажать, чтобы выключить.

Jogi
источник