Làm cách nào để tắt Caps Lock (khóa chứ không phải khóa) bằng dòng lệnh?


91

Vì một số lý do, máy tính xách tay của tôi bị kẹt trong Caps Lock. Tôi có Caps Lockchìa khóa được ánh xạ xmodmaptới hyper_l, vì vậy tôi không có caps_lockchìa khóa để tắt. Có cách nào tôi có thể tắt nó bằng dòng lệnh không? Sẽ thật tuyệt nếu tôi có thể thiết lập lại trạng thái khóa mà không cần thiết lập lại máy tính của mình, đặc biệt là để tham khảo trong tương lai. Điều này đã xảy ra trước đây, nhưng tôi muốn biết làm thế nào để làm điều đó đúng cách lần này.


[echo -e "$ (dumpkey | grep ^ keymap) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Thêm dòng sau vào .profile hoặc .bash_profile sẽ vô hiệu hóa khóa mũ:] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]: askubfox.com/questions/ 43986 / Lỗi [2]: askubfox.com/questions/43986/ cấp [3]: askubfox.com/questions/43986/ Kẻ
Một

setxkbmap -option caps: none
Pavlos Theodorou

@PavlosTheodorou, sẽ vô hiệu hóa khóa CAPS, nó sẽ không chuyển trạng thái của nó như yêu cầu của OP.
user.dz

Có một lỗi ở đó. hiện tại không có lệnh nào để làm điều đó bạn có thể sử dụng setleds + caps hoặc -caps nhưng nó không hoạt động. điều duy nhất bạn có thể làm đã được trả lời. bạn có thể sắp xếp lại mũ
Pavlos Theodorou

Câu trả lời:


129

Tôi không biết bất kỳ công cụ dòng lệnh nào cho Ubuntu. (Đối với Num Lock, có numlockx Cài đặt numlockx .) Đây là một lớp lót mà bạn có thể sao chép-dán vào cửa sổ terminal:

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

Đây là một lần nữa trong một hình thức mở rộng hơn. Chúng tôi sử dụng Python thư viện ctypes để gọi chức năng C từ thư viện X trực tiếp. Chức năng XkbLockModifiersthay đổi trạng thái của khóa bàn phím, trên bàn phím lõi ( XkbUseCoreKbd= 0x0100), ảnh hưởng đến Caps Lock (2), đặt thành 0 (tắt).

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

Nếu bạn có một công cụ sửa đổi bị kẹt, hãy thay đổi 2 thành mặt nạ của các công cụ sửa đổi mà bạn muốn tắt. Các sửa đổi là 1 = Shift, 2 = Khóa (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Chạy xmodmap -pmđể xem Mod1 qua Mod5 tương ứng với cái gì. Ví dụ, để tắt tất cả các sửa đổi, hãy gọi X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Để bật Num Lock trên Mod2, đồng thời tắt Caps Lock, hãy gọi X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Đây là phiên bản C nếu bạn muốn tạo một nhị phân nhỏ thay vì gọi Python. Biên dịch với gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, với các gói build-essentialslibx11-devcài đặt.

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

Cũng có thể quan tâm là một cách để tạm thời bỏ qua Caps Lock:

xkbset nullify lock

Sau đó, Caps Lock sẽ tắt vĩnh viễn, cho đến khi bạn kích hoạt lại xkbset nullify -lock.


Tôi sẽ đi khi tôi tiếp theo trên máy tính xách tay của tôi. Tôi đang ở trên máy tính để bàn của tôi bây giờ.
Echogene

Hmm, phương pháp python được sử dụng để làm việc cho tôi, nhưng sau khi nâng cấp lên Yakkety thì không. Tất nhiên, lỗi khóa mũ bị kẹt vẫn tồn tại!
Gringo Suave

@GringoSuave Tôi không biết tại sao điều đó có thể. Vui lòng cài đặt xtracevà chạy 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)'và đăng một vài dòng cuối cùng, bắt đầu với dòng có chứa QueryExtension name='XKEYBOARD'. Tôi không khẳng định rằng tôi sẽ hiểu đầu ra nhưng tôi sẽ thử.
Gilles

2
Tôi nhận được một segfault: bị chấm dứt bởi tín hiệu SIGSEGV (Lỗi ranh giới địa chỉ) Lỗi phân đoạn
Gringo Suave

000: <: 0005: 20: Yêu cầu (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Trả lời QueryExtension: Present = true (0x01) Major-opcode = 135 First-event = 85 lỗi đầu tiên = 85 lỗi đầu tiên = 85 lỗi đầu tiên = 137 000: <: 0006: 8: XKEYBOARD-Yêu cầu (135,0): UseExtension Major = 1 junior = 0 000:>: 0006: 32: Trả lời sử dụngExtension: Major = 1 junior = 0
Gringo Suave

59

Các công cụ tự động hóa X có thể được sử dụng để gửi các sự kiện quan trọng cần thiết.

Lưu ý:
Để sử dụng lần đầu, Giải pháp này cần bạn ghi đúng mật khẩu để cài đặt công cụ mới, nếu CAPS của bạn hiện đang hoạt động:

  • Sử dụng SHIFTphím để gõ chữ thường.
  • Cho phép truy cập, lớp phủ bàn phím ảo.
  • Cắm lại bàn phím ngoài. (Cảm ơn chris455 )
  • Mở văn phòng, viết mật khẩu ở đó, thay đổi trường hợp chữ cái, sao chép nó, sau đó dán nó vào hộp thoại mật khẩu.

Nếu tất cả các tùy chọn trước đó là không thể hoặc không hoạt động, hãy đi với tập lệnh answer / python của Gilles . Nó không cần phải cài đặt bất kỳ công cụ bổ sung nào, nó chỉ sử dụng python& libX11chia sẻ lib được cài đặt sẵn.

Sử dụng xdotool

  1. Cài đặt nó

    sudo apt-get install xdotool
    
  2. Gửi một sự kiện xuống / lên CAPS

    xdotool key Caps_Lock
    

Một công cụ khác là xte

  1. Cài đặt nó

    sudo apt-get install xautomation
    
  2. Gửi một sự kiện khóa / lên CAPS

    xte "key Caps_Lock"
    

Người giới thiệu:


Điều gì nếu điều này không làm việc?
quant_dev

2
Đây là người duy nhất làm việc cho tôi. vô hiệu hóa và những người khác đã không làm việc.
lnostdal

12
KHÔNG THỂ CÀI ĐẶT, MẬT KHẨU KHÔNG ĐƯỢC CHẤP NHẬN. :(
Gringo Suave

2
Bạn có thể sử dụng các phím Shift để nhập các chữ cái viết thường trong khi Caps Lock được bật.
chris544

1
Nếu bạn sử dụng bàn phím ngoài, một tùy chọn khác có thể được cắm lại; Công cụ sửa đổi Caps Lock có thể được đặt lại, vì vậy bạn có thể nhập các chữ cái viết thường.
chris544

14

Đối với phiên bản python Gilles không hoạt động trong ubuntus mới hơn, việc đặt trả về chính xác cho màn hình mở dường như thực hiện thủ thuật:

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

(Mã được điều chỉnh từ https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )


Điều này hoạt động thực sự tốt, là một vị cứu tinh cuộc sống
Garret Gang

8

Nếu bạn không thể truy cập CAPS vì bạn đã ánh xạ lại trong .bashrc, như tôi đã làm, thì chỉ cần chuyển sang một thiết bị đầu cuối ảo (alt + ctl + fN) và sau đó chuyển đổi lại hoạt động cho tôi.


1
Chuyển đổi không hoàn toàn làm điều đó, nhưng nó đã đưa tôi đến một điểm mà tôi có thể nhấn nắp khóa để làm cho đúng.
mê cung

1

Tôi gặp vấn đề này và đã có thể khắc phục bằng cách sử dụng bàn phím OnBoard (trong Ubuntu Mate, trong Truy cập toàn cầu).

Sau khi bật, bạn sẽ thấy phím CapsLock có màu đỏ hoặc bằng cách nào đó chỉ ra rằng nó đã bị khóa. Sau đó, bạn có thể nhấn để tắt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.