명령 행으로 Caps Lock (키가 아닌 잠금)을 끄려면 어떻게해야합니까? 수있는 방법이 있습니까? 특히 나중에

어떤 이유로 내 노트북이 Caps Lock에 갇혀 있습니다. 나는이 Caps Lock에 의해 매핑 된 키 xmodmap에를 hyper_l, 그래서이없는 caps_lock기능을 해제 키를. 커맨드 라인으로 끌 수있는 방법이 있습니까? 특히 나중에 참조하기 위해 컴퓨터를 재설정하지 않고 잠금 상태를 재설정 할 수 있다면 좋을 것입니다. 이것은 전에 일어 났지만 이번에는 올바르게 수행하는 방법을 지금 알고 싶습니다.



답변

우분투의 명령 줄 도구를 모르겠습니다. Num Lock의 경우 numlockx가 있습니다. 터미널 창에 복사하여 붙여 넣을 수있는 1 개의 라이너가 있습니다.

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 라이브러리 를 사용하여 X 라이브러리 에서 C 함수를 직접 호출 합니다. 이 기능 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 -pmMod1부터 Mod5까지의 내용을 확인하려면 실행 하십시오. 예를 들어, 모든 수정자를 끄려면을 호출하십시오 X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Mod2에있는 Num Lock을 켜고 동시에 Caps Lock을 끄려면을 호출하십시오 X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


파이썬을 호출하는 대신 작은 바이너리를 만들고 싶다면 C 버전이 있습니다. 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.


답변

X 자동화 도구를 사용하여 필수 키 이벤트를 보낼 수 있습니다.

참고 :
처음 사용하려면이 솔루션을 사용하려면 CAPS가 현재 활성 상태 인 경우 새 도구를 설치하기 위해 올바른 암호를 테이프로 지정해야합니다.

  • SHIFT키를 사용 하여 소문자를 입력 하십시오 .
  • 접근성을 활성화하고 가상 키보드를 오버레이합니다.
  • 외부 키보드를 다시 연결하십시오. ( chris455 감사합니다 )
  • 사무실 작가를 열고 암호를 작성하고 대소 문자를 변경 한 후 복사 한 다음 암호 대화 상자에 붙여 넣습니다.

이전의 모든 옵션을 사용할 수 없거나 작동하지 않으면 Gilles의 answer / python 스크립트로 이동하십시오 . 또한, 추가 도구를 설치할 필요가 없습니다 만 사용 pythonlibX11사전 설치된 공유 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"
    

참고 문헌 :


답변

최신 우분투에서 Gilles python 버전이 작동하지 않는 경우 열린 디스플레이에 올바른 반환 값을 설정하면 트릭을 수행하는 것처럼 보입니다.

#! /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 에서 수정 된 코드 )


답변

내가했던 것처럼 .bashrc에서 다시 매핑했기 때문에 CAPS에 액세스 할 수 없다면 가상 터미널 (alt + ctl + fN)로 전환 한 다음 다시 전환하면 나에게 도움이되었습니다.


답변

나는이 문제가 있었고 OnBoard 키보드 (Ubuntu Mate의 Universal Access)를 사용하여 문제를 해결할 수있었습니다.

전원을 켜면 CapsLock 키가 빨간색으로 표시되거나 잠 겼음을 나타냅니다. 그런 다음을 눌러 해제 할 수 있습니다.