मैं कमांड लाइन द्वारा कैप्स लॉक (लॉक, नहीं कुंजी) कैसे बंद करूं?


91

किसी कारण से मेरा लैपटॉप कैप्स लॉक में फंस गया है। मेरे पास Caps Lockकुंजी मैप की गई xmodmapहै hyper_l, इसलिए मेरे पास caps_lockइसे बंद करने की कुंजी नहीं है । क्या कोई तरीका है जो मैं इसे कमांड लाइन द्वारा बंद कर सकता हूं? यह अच्छा होगा अगर मैं अपने कंप्यूटर को रीसेट किए बिना लॉक स्टेट को रीसेट कर सकता हूं, खासकर भविष्य के संदर्भ के लिए। यह पहले भी हुआ है, लेकिन मैं अब यह जानना चाहूंगा कि इस बार इसे ठीक से कैसे किया जाए।


[इको-ई "$ (डंपकीज़ | grep ^ कीमैप्स) \ nkeycode ५" = बच " sudo loadkeys] [1] [.profile या .bash_profile में निम्नलिखित पंक्ति जोड़ते हुए कैप्स लॉक को अक्षम करना चाहिए:] [२] [xmodmap -e "remove lock = Caps_Lock"] [३] [१] [ askubuntu.com/questions/ ] 43986 /… [2]: askubuntu.com/questions/43986/… [3]: askubuntu.com/questions/43986/…
एक जीरो

setxkbmap -option caps: कोई नहीं
Pavlos Theodorou

@PavlosTheodorou, जो CAPS कुंजी को अक्षम कर देगा, यह ओपी आवश्यकता के रूप में अपनी स्थिति को चालू नहीं करेगा।
user.dz

वहाँ एक बग है। वर्तमान में ऐसा करने के लिए कोई आदेश नहीं है। आप सेटल्ड्स + कैप्स या -कैप्स का उपयोग कर सकते हैं लेकिन यह काम नहीं कर रहा है। केवल एक चीज जो आप कर सकते हैं वह है पहले से ही उत्तर दिया गया। आप कैपैप कर सकते हैं
पावलो थिओडोरौ

जवाबों:


129

मुझे उबंटू में इसके लिए कोई कमांड लाइन टूल नहीं है। (Num Lock के लिए, 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)'

यहां यह फिर से अधिक विस्तारित रूप में है। हम सीधे X लाइब्रेरी से C फ़ंक्शन को कॉल करने के लिए पायथन ctypes लाइब्रेरी का उपयोग करते हैं। फ़ंक्शन कीबोर्ड के राज्य की स्थिति को बदलता है, कोर कीबोर्ड ( = 0x0100) पर, कैप्स लॉक (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 = शिफ्ट, 2 = लॉक (कैप्स लॉक), 4 = नियंत्रण, 8 = मोड 1, 16 = मोड 2, 32 = मोड 3, 64 = मोड 4, 128 = मोड 5 हैं। xmodmap -pmMod5 के माध्यम से Mod1 क्या देखने के लिए चलाएँ । उदाहरण के लिए, सभी संशोधक बंद करने के लिए, कॉल करें 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))


यदि आप पायथन को लागू करने के बजाय एक छोटा बाइनरी बनाना चाहते हैं तो यहां एक सी संस्करण है। साथ संकलित करें 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;
}

संभवतः संभवतः ब्याज भी कैप्स लॉक को अस्थायी रूप से अनदेखा करने का एक तरीका है:

xkbset nullify lock

इसके बाद, कैप्स लॉक प्रभावी रूप से स्थायी रूप से बंद हो जाएगा, जब तक कि आप इसे फिर से लागू नहीं करते xkbset nullify -lock


जब मैं अपने लैपटॉप पर अगली बार जाऊंगा मैं अभी अपने डेस्कटॉप पर हूं।
इचोगेन

हम्म, अजगर विधि मेरे लिए काम करती थी, लेकिन याक्विटी में अपग्रेड करने के बाद ऐसा नहीं होता है। बग जहां कैप लॉक बंद हो जाता है, वह बनी रहती है!
ग्रिंगो ने 20

@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 (एड्रेस बाउंड्री एरर) सेगमेंटेशन फॉल्ट द्वारा समाप्त किया गया ...
ग्रिंगो ने

000: <: 0005: 20: अनुरोध (98): QueryExtension का नाम = 'XKEYBOARD' 000:>: 0005: 32: QueryExtension का उत्तर दें: वर्तमान = सच (0x01) प्रमुख- op / 135 पहली घटना = 85 प्रथम-त्रुटि = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension मेजर = 1 मामूली = 0 000:>: 0006: 32: UseExtension का उत्तर दें: मेजर = 1 मामूली = 0
ग्रिंगो सुवे

59

X स्वचालन टूल का उपयोग आवश्यक प्रमुख घटनाओं को भेजने के लिए किया जा सकता है।

नोट:
पहले उपयोग के लिए, इस समाधान के लिए आपको नए पासवर्ड को स्थापित करने के लिए सही पासवर्ड को टेप करने की आवश्यकता है, यदि आपका CAPS वर्तमान में सक्रिय है:

  • SHIFTलोअरकेस अक्षर टाइप करने के लिए कुंजी का उपयोग करें ।
  • पहुँच सक्षम करें, वर्चुअल कीबोर्ड ओवरले करें।
  • बाहरी कीबोर्ड को री-प्लग करें। ( क्रिस 455 से साभार )
  • कार्यालय लेखक खोलें, वहां पासवर्ड लिखें, पत्र मामले को बदलें, इसे कॉपी करें, फिर इसे पासवर्ड संवाद में पेस्ट करें।

यदि सभी पिछले विकल्प संभव नहीं हैं या काम नहीं करते हैं, तो गिल्स के उत्तर / पायथन स्क्रिप्ट के साथ जाएं । इसे किसी भी अतिरिक्त टूल को स्थापित करने की आवश्यकता नहीं है, यह केवल 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"
    

संदर्भ:


क्या होगा अगर यह काम नहीं करता है?
मात्रा_देव

2
यह एकमात्र ऐसा है जिसने मेरे लिए काम किया। अशक्त और दूसरों को काम नहीं किया।
lnostdal

12
नहीं कर सकते, पहले स्वीकार नहीं किया। :(
ग्रिंगो ने

2
कैप्स लॉक सक्षम होने पर आप लोअरकेस अक्षरों को इनपुट करने के लिए Shift कुंजियों का उपयोग कर सकते हैं।
क्रिस ५४४

1
यदि आप बाहरी कीबोर्ड का उपयोग करते हैं, तो दूसरा विकल्प इसे फिर से प्लग-इन कर सकता है; कैप्स लॉक संशोधक को रीसेट मिल सकता है, जिससे आप लोअरकेस अक्षर इनपुट कर सकते हैं।
च्रिस ५४४

14

गाइल्स पायथन संस्करण के रूप में नए 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

मुझे यह समस्या थी और ऑनबोर्ड कीबोर्ड (उबंटू मेट में, यूनिवर्सल एक्सेस के तहत) का उपयोग करके इसे ठीक करने में सक्षम था।

एक बार चालू करने के बाद आपको यह देखना चाहिए कि CapsLock कुंजी लाल है, या किसी तरह संकेत दिया गया है कि यह बंद है। फिर आप टॉगल करने के लिए दबा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.