Як вимкнути функцію Caps Lock (блокування, а не ключ) за допомогою командного рядка?


91

Чомусь мій ноутбук застряг у Caps Lock. У мене Caps Lockвідображений ключ, xmodmapдо якого hyper_lя не маю caps_lockключа, щоб вимкнути його. Чи є спосіб я відключити його командним рядком? Було б добре, якби я міг скинути стан блокування без скидання комп'ютера, особливо для подальшого використання. Це траплялося і раніше, але я хотів би зараз знати, як це зробити правильно цього разу.


[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Додавання наступного рядка до .profile або .bash_profile має відключити блокування шапки:] [2] [xmodmap -e "видалити замок = Caps_Lock"] [3] [1]: askubuntu.com/questions/ 43986 /… [2]: askubuntu.com/questions/43986/… [3]: askubuntu.com/questions/43986/…
One Zero

setxkbmap - опція шапки: немає
Павлос Теодору

@PavlosTheodorou, що відключить ключ CAPS, він не змінює свій статус як вимога OP.
user.dz

там баг. в даний час немає команди, щоб це зробити. Ви можете використовувати setleds + caps або -caps, але це не працює. єдине, що ти можеш зробити, це вже відповідь. ви можете перезаписати шапки
Павлос Теодору

Відповіді:


129

Я не знаю жодного інструмента командного рядка для цього в 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 для виклику функцій C безпосередньо з бібліотеки X. Функція змінює стан блокування клавіатури на основній клавіатурі ( = 0x0100), впливаючи на Caps Lock (2), встановлюючи його на 0 (вимкнено).XkbLockModifiersXkbUseCoreKbd

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


Я буду їхати, коли я наступний на своєму ноутбуці. Я зараз на своєму робочому столі.
Ехоген

Хм, метод 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'. Я не стверджую, що зрозумію вихід, але спробую.
Жил

2
Я отримую сегмент за замовчуванням: припиняється сигналом SIGSEGV (Помилка граничної адреси) Помилка сегментації…
Gringo Suave

000: <: 0005: 20: Запит (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Відповідь на QueryExtension: присутній = вірно (0x01) major-opcode = 135 first-event = 85 first-error = 137 000: <: 0006: 8: XKEYBOARD-Запит (135,0): UseExtension major = 1 мінор = 0 000:>: 0006: 32: Відповісти на UseExtension: major = 1 мінор = 0
Gringo Suave

59

Інструменти автоматизації X можуть використовуватися для надсилання необхідних ключових подій.

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

  • Використовуйте SHIFTклавішу для введення малих літер.
  • Увімкніть доступність, накладіть віртуальну клавіатуру.
  • Повторно підключіть зовнішню клавіатуру. (Завдяки chris455 )
  • Відкрийте програму Office Writer, напишіть туди пароль, змініть регістр букв, скопіюйте його та вставте у діалогове вікно паролів.

Якщо всі попередні параметри неможливі або не працюють, перейдіть зі сценарієм відповіді / python Gilles . Для цього не потрібно встановлювати будь-який додатковий інструмент, він використовує лише 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"
    

Список літератури:


Що робити, якщо це не працює?
Quant_dev

2
Це єдиний, хто працював на мене. звести нанівець і інші не спрацювали.
lnostdal

12
НЕ МОЖЕТЕ ВСТАНОВИТИ, ПАРОЛЬНЕ СЛОВО НЕ ПРИЙОМО. :(
Gringo Suave

2
Ви можете використовувати клавіші Shift для введення малих літер, коли функція Caps Lock увімкнена.
chris544

1
Якщо ви використовуєте зовнішню клавіатуру, інша опція може повторно підключити її; Модифікатор Caps Lock може бути скинутий, тому ви можете вводити малі літери.
chris544

14

Що стосується версії Gilles python, яка не працює в новіших 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 )


Це працює дуже добре, є рятівником життя
Гаррет Ганг

8

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


1
Комутація не зовсім цього зробила, але це довів мене до точки, коли я могла натиснути блокування ковпачків, щоб все вийшло правильно.
лабіринт

1

У мене була ця проблема, і я зміг її виправити за допомогою клавіатури OnBoard (в Ubuntu Mate, під Universal Access).

Після включення ви побачите клавішу CapsLock червоною або якось вказано, що вона заблокована. Потім ви можете натиснути, щоб вимкнути його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.