Büyük Harf Kilidini (anahtarı değil kilidi) komut satırından nasıl kapatabilirim?


91

Nedense dizüstü bilgisayarım Caps Lock'a takıldı. Ben Caps Locktarafından eşleştirilmiş anahtarı xmodmapiçin hyper_l, bu yüzden bir yok caps_lockkapatmak için tuşuna. Komut satırıyla kapatmamın bir yolu var mı? Bilgisayarımı sıfırlamadan özellikle ileride başvurmak üzere kilitleme durumunu sıfırlayabilsem iyi olur. Bu daha önce de oldu, ama şimdi bu sefer nasıl doğru şekilde yapılacağını bilmek istiyorum.


[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Kaçış" | sudo loadkeys] [1] [Aşağıdaki satırın .profile veya .bash_profile dosyasına eklenmesi büyük harf kilidini devre dışı bırakmalıdır:] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]: askubuntu.com/questions/ 43986 / ... [2]: askubuntu.com/questions/43986/... : [3] askubuntu.com/questions/43986/...
Bir Sıfır

setxkbmap -option caps: none
Pavlos Theodorou

@PavlosTheodorou, CAPS anahtarını devre dışı bırakacak, durumunu OP gereksinimi olarak değiştirmeyecek.
user.dz

orada bir böcek var. şu anda bunu yapacak bir komut yok. setled + caps veya -caps kullanabilirsiniz, ancak çalışmaz. Yapabileceğin tek şey zaten cevaplanmış. kapaklar remap edebilirsiniz
Pavlos Theodorou

Yanıtlar:


129

Ubuntu'da bunun için herhangi bir komut satırı aracı bilmiyorum. (Num Lock için numlockx var Numlockx yükleyin .) İşte bir terminal penceresine kopyalayıp yapıştırabileceğiniz bir astar:

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

İşte yine daha genişletilmiş bir biçimde. Biz kullanmak Python ctypes kütüphanesi C işlevleri çağırmak için X kütüphanesine doğrudan. İşlev XkbLockModifiersçekirdek klavyedeki klavye kilitlerinin durumunu değiştirir ( XkbUseCoreKbd= 0x0100), Caps Lock'u (2) etkileyerek 0 (kapalı) olarak ayarlar.

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

Sıkışmış bir değiştiriciniz varsa, kapatmak istediğiniz değiştiricilerin maskesini 2 ile değiştirin. Değiştiriciler 1 = Shift, 2 = Kilit (Büyük Harf Kilidi), 4 = Kontrol, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. xmodmap -pmMod1'den Mod5'e neyin karşılık geldiğini görmek için çalıştırın . Örneğin, tüm değiştiricileri kapatmak için arayın X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Mod2 açık olan Num Lock'u açmak ve aynı zamanda Caps Lock'u açmak için çağrı yapın X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Python'u çağırmak yerine küçük bir ikili dosya yapmak istiyorsanız, işte C sürümü. İle derlemek gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11paketleri ile, build-essentialsve libx11-devyüklenmiş.

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

Ayrıca muhtemelen ilgi çekici olan Caps Lock'u geçici olarak yok saymanın bir yoludur:

xkbset nullify lock

Bundan sonra Caps Lock, yeniden etkinleştirilinceye kadar etkin bir şekilde kapalı kalacaktır xkbset nullify -lock.


Dizüstü bilgisayarımda bir sonraki adımda gideceğim. Şimdilik masaüstümdeyim.
Echogene

Hmm, python yöntemi benim için çalışıyordu, ancak Yakkety'ye yükselttikten sonra kullanmıyor. Büyük harflerin kilitlendiği hata elbette devam ediyor!
Gringo Suave

@GringoSuave Bunun neden olabileceği hakkında hiçbir fikrim yok. Lütfen son birkaç satırı, içerisinden başlayarak kurun xtraceve çalıştırın . Çıktıyı anladığımı iddia etmiyorum ama deneyeceğim. 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
Bir segfault alıyorum: SIGSEGV sinyaliyle sonlandırıldı (Adres sınırı hatası) Segmentasyon hatası…
Gringo Suave

000: <: 0005: 20: İstek (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: QueryExtension yanıtı: present = true (0x01) major-opcode = 135 ilk olay = 85 ilk hata = 137 000: <: 0006: 8: XKEYBOARD İsteği (135,0): UseExtension major = 1 minor = 0 000:>: 0006: 32: UseExtension: major = 1 minor = 0
Gringo Suave

59

Gerekli anahtar olayları göndermek için X otomasyon araçları kullanılabilir.

Not:
İlk kullanımda, Bu çözüm, CAPS'nız şu anda etkinse, yeni aracı yüklemek için doğru şifreyi bantlamanız gerekir:

  • SHIFTKüçük harfleri girmek için tuşunu kullanın .
  • Erişilebilirliği sağlayın, sanal klavyeyi paylaşın.
  • Harici bir klavyeyi tekrar takın. ( Chris455 sayesinde )
  • Ofis yazıcısını açın, orada şifre yazın, harf harfini değiştirin, kopyalayın ve ardından şifre iletişim kutusuna yapıştırın.

Önceki tüm seçenekler mümkün değilse veya çalışmazsa, Gilles'un cevapla / python komut dosyasıyla gidin . Herhangi bir ek araç kurmasına gerek yoktur, sadece önceden yüklenmiş olan pythonve sadece libX11paylaşılan kütüphaneyi kullanır .

kullanma xdotool

  1. Yükle

    sudo apt-get install xdotool
    
  2. CAPS aşağı / yukarı etkinliği gönder

    xdotool key Caps_Lock
    

Başka bir araç xte

  1. Yükle

    sudo apt-get install xautomation
    
  2. CAPS lock down / up olayı gönder

    xte "key Caps_Lock"
    

Referanslar:


Ya bu işe yaramazsa?
quant_dev

2
Bu benim için çalışan tek şey. geçersiz kılma ve diğerleri işe yaramadı.
lnostdal

12
KURULAMAZ, ŞİFRE KABUL EDİLEMEZ. :(
Gringo Suave

2
Caps Lock etkinken küçük harf girmek için Shift tuşlarını kullanabilirsiniz.
chris544

1
Harici bir klavye kullanıyorsanız, başka bir seçenek yeniden takmak olabilir; Büyük Harf Kilidi değiştiricisi sıfırlanabilir, böylece küçük harfleri girebilirsiniz.
chris544

14

Gilles python versiyonu yeni ubuntusta çalışmıyorsa, açık ekran için doğru dönüşü ayarlamak hile yapmış gibi görünüyor:

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

(Kod, https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress adresinden uyarlanmıştır )


Bu gerçekten iyi çalışıyor, bir hayat kurtarıcı
Garret Gang,

8

CAPS'a erişemiyorsanız, çünkü bunu yaptığım gibi .bashrc dosyasında yeniden aldınız, daha sonra sanal bir terminale (alt + ctl + fN) geçmek ve sonra geri dönmek benim için çalıştı.


1
Geçiş yapmak tam olarak işe yaramadı, ama doğru olanı yapmak için büyük harf kilidine basabileceğim bir noktaya getirdi.
labirent

1

Bu sorunu yaşadım ve OnBoard klavyesini (Ubuntu Mate'de Universal Access altında) kullanarak düzeltebildim.

Bir kez açıldığında CapsLock tuşunun kırmızı olduğunu veya bir şekilde kilitli olduğunu belirtmelisiniz. Daha sonra geçiş yapmak için basabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.