명령 행으로 Caps Lock (키가 아닌 잠금)을 끄려면 어떻게해야합니까?


91

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


[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = 이스케이프"| sudo loadkeys] [1] [.profile 또는 .bash_profile에 다음 행을 추가하면 caps lock이 비활성화됩니다.] [2] [xmodmap -e "remove lock = 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

우분투의 명령 줄 도구를 모르겠습니다. Num Lock의 경우 numlockx가 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.


다음에 랩탑 컴퓨터를 타면 갈 것입니다. 나는 지금 내 바탕 화면에 있습니다.
Echogene

흠, 파이썬 방법은 나를 위해 일했지만 Yakkety로 업그레이드 한 후에는 그렇지 않습니다. 캡 잠금 장치가 멈추는 버그는 물론 지속됩니다!
Gringo Suave 2011

@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에 대한 응답 : present = true (0x01) major-opcode = 135 first-event = 85 first-error = 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 감사합니다 )
  • 사무실 작가를 열고 암호를 작성하고 대소 문자를 변경 한 후 복사 한 다음 암호 대화 상자에 붙여 넣습니다.

이전의 모든 옵션을 사용할 수 없거나 작동하지 않으면 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"
    

참고 문헌 :


이것이 작동하지 않으면 어떻게합니까?
quant_dev 2016 년

2
이것은 나를 위해 일한 유일한 것입니다. 무효화하고 다른 사람들은 작동하지 않았습니다.
lnostdal

12
설치할 수 없습니다. 비밀번호가 허용되지 않습니다. :(
Gringo Suave

2
Caps Lock이 활성화 된 상태에서 Shift 키를 사용하여 소문자를 입력 할 수 있습니다.
chris544

1
외장 키보드를 사용하는 경우 다른 옵션을 다시 연결했을 수 있습니다. Caps Lock 수정자가 재설정 될 수 있으므로 소문자를 입력 할 수 있습니다.
chris544

14

최신 우분투에서 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 에서 수정 된 코드 )


이것은 정말 잘 작동하고 구세주입니다
Garret Gang

8

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


1
전환은 그다지 좋지 않았지만, 뚜껑 잠금을 눌러 일을 올바르게 할 수있는 지점으로 안내했습니다.
미로

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.