ฉันจะปิด 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 ตัวเลือกตัวเลือก: ไม่มี
Pavlos Theodorou

@PavlosTheodorou ที่จะปิดการใช้งานคีย์ CAPS มันจะไม่สลับสถานะเป็นความต้องการ OP
user.dz

มีข้อบกพร่องอยู่ที่นั่น ขณะนี้ไม่มีคำสั่งให้ทำเช่นนั้น คุณสามารถใช้ setleds + caps หรือ -caps แต่มันไม่ทำงาน สิ่งเดียวที่คุณสามารถทำได้คือคำตอบแล้ว คุณสามารถทำการแมปใหม่อีกครั้ง
Pavlos Theodorou

คำตอบ:


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 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 = ล็อค (Caps Lock), 4 = การควบคุม, 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 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'ฉันไม่ได้อ้างว่าฉันจะเข้าใจผลลัพธ์ แต่ฉันจะพยายาม
Gilles

2
ฉันได้รับ segfault: ถูกยกเลิกโดยสัญญาณ SIGSEGV (ข้อผิดพลาดของขอบเขตที่อยู่) การแบ่งกลุ่มผิด…
Gringo Suave

000: <: 0005: 20: คำขอ (98): ชื่อ QueryExtension = 'XKEYBOARD' 000:>: 0005: 32: ตอบกลับไปยัง QueryExtension: ปัจจุบัน = จริง (0x01) major-opcode = 135 เหตุการณ์แรก = 85 = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension major = 1 minor = 0 000:>: 0006: 32: ตอบกลับไปยัง UseExtension: major = 1 minor = 0
Gringo Suave

59

เครื่องมืออัตโนมัติ Xสามารถใช้ในการส่งเหตุการณ์สำคัญที่ต้องการ

หมายเหตุ:
สำหรับการใช้งานครั้งแรกโซลูชันนี้ต้องการให้คุณใส่เทปรหัสผ่านที่ถูกต้องเพื่อติดตั้งเครื่องมือใหม่หาก CAPS ของคุณทำงานอยู่ในปัจจุบัน:

  • ใช้SHIFTปุ่มเพื่อพิมพ์ตัวอักษรพิมพ์เล็ก
  • เปิดใช้งานการเข้าถึงคีย์บอร์ดเสมือนที่ซ้อนทับ
  • เสียบแป้นพิมพ์ภายนอกอีกครั้ง (ขอบคุณchris455 )
  • เปิด office writer, เขียนรหัสผ่านที่นั่น, เปลี่ยนตัวอักษร, คัดลอกแล้ววางลงในกล่องโต้ตอบรหัสผ่าน

ถ้ามีตัวเลือกก่อนหน้านี้ทั้งหมดไม่ได้เป็นไปได้หรือไม่ได้ทำงานไปกับคำตอบสคริปต์ / หลามกิลส์ มันไม่จำเป็นต้องติดตั้งเครื่องมือเพิ่มเติมใด ๆ มันใช้เพียงpython& libX11shared lib ที่ติดตั้งไว้ล่วงหน้า

การใช้ 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 )


มันใช้งานได้ดีจริงๆเป็นผู้ช่วยชีวิต
Garret Gang

8

หากคุณไม่สามารถเข้าถึง CAPS ได้เนื่องจากคุณทำการแมปใหม่ใน. bashrc เช่นเดียวกับฉันจากนั้นเพียงแค่เปลี่ยนเป็นเทอร์มินัลเสมือน (alt + ctl + fN) จากนั้นการสลับกลับใช้งานได้สำหรับฉัน


1
การสลับไม่ได้ทำอย่างนั้น แต่มันทำให้ฉันถึงจุดที่ฉันสามารถกดปุ่มแคปล็อคเพื่อให้ได้สิ่งที่ถูกต้อง
เขาวงกต

1

ฉันมีปัญหานี้และสามารถแก้ไขได้โดยใช้แป้นพิมพ์ OnBoard (ใน Ubuntu Mate ภายใต้ Universal Access)

เมื่อเปิดใช้แล้วคุณจะเห็นว่าปุ่ม CapsLock เป็นสีแดงหรืออย่างใดบ่งบอกว่ามันถูกล็อค จากนั้นคุณสามารถกดเพื่อสลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.