Bagaimana cara mematikan Caps Lock (kunci, bukan kunci) dengan baris perintah?

91

Untuk beberapa alasan laptop saya macet di Caps Lock. Saya memiliki Caps Lockkunci dipetakan oleh xmodmapke hyper_l, jadi saya tidak memiliki caps_lockkunci untuk mematikannya. Apakah ada cara saya dapat mematikannya dengan command line? Akan lebih baik jika saya dapat mengatur ulang status kunci tanpa mengatur ulang komputer saya, terutama untuk referensi di masa mendatang. Ini telah terjadi sebelumnya, tetapi saya ingin tahu sekarang bagaimana melakukannya dengan benar kali ini.

Echogene
sumber
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Menambahkan baris berikut ke .profile atau .bash_profile harus menonaktifkan caps lock:] [2] [xmodmap -e "hapus lock = Caps_Lock"] [3] [1]: askubuntu.com/questions/ 43986 / ... [2]: askubuntu.com/questions/43986/… [3]: askubuntu.com/questions/43986/…
One Zero
setxkbmap -tutup opsi: tidak ada
Pavlos Theodorou
@PavlosTheodorou, yang akan menonaktifkan kunci CAPS, tidak akan mengaktifkan statusnya sebagai persyaratan OP.
user.dz
ada bug di sana. tidak ada perintah saat ini untuk melakukan itu. Anda bisa menggunakan setleds + caps atau -caps tetapi tidak berfungsi. satu-satunya hal yang dapat Anda lakukan sudah dijawab. Anda dapat membuat ulang topi
Pavlos Theodorou

Jawaban:

129

Saya tidak tahu ada alat baris perintah untuk itu di Ubuntu. (Untuk Num Lock, ada numlockx Instal numlockx .) Berikut ini adalah satu-liner yang dapat Anda salin-tempel ke jendela terminal:

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

Ini dia lagi dalam bentuk yang lebih luas. Kami menggunakan pustaka Python ctypes untuk memanggil fungsi C dari pustaka X secara langsung. Fungsi XkbLockModifiersmengubah status kunci keyboard, pada keyboard inti ( XkbUseCoreKbd= 0x0100), memengaruhi Caps Lock (2), mengaturnya ke 0 (mati).

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

Jika Anda memiliki pengubah yang macet, ubah 2 ke penutup pengubah yang ingin Anda matikan. Pengubahnya adalah 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Jalankan xmodmap -pmuntuk melihat apa yang terkait dengan Mod1 hingga Mod5. Misalnya, untuk mematikan semua pengubah, hubungi X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Untuk mengaktifkan Num Lock yang aktif pada Mod2 dan pada saat yang sama mematikan Caps Lock, panggil X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Ini adalah versi C jika Anda ingin membuat biner kecil alih-alih memanggil Python. Kompilasi dengan gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, dengan paket-paket build-essentialsdan libx11-devdiinstal.

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

Yang juga mungkin menarik adalah cara untuk sementara waktu mengabaikan Caps Lock:

xkbset nullify lock

Setelah ini, Caps Lock secara efektif akan mati secara permanen, sampai Anda mengaktifkannya kembali xkbset nullify -lock.

Gilles
sumber
Saya akan mencoba ketika saya berikutnya di laptop saya. Saya di desktop saya untuk saat ini.
Echogene
Hmm, metode python dulu bekerja untuk saya, tapi setelah upgrade ke Yakkety tidak. Bug di mana caps lock macet tetap ada!
Gringo Suave
@ GringoSuave Saya tidak tahu mengapa itu bisa terjadi. Silakan instal xtracedan jalankan 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)'dan posting beberapa baris terakhir, dimulai dengan yang mengandung QueryExtension name='XKEYBOARD'. Saya tidak mengklaim bahwa saya akan memahami hasilnya tetapi saya akan mencoba.
Gilles
2
Saya mendapatkan segfault: diakhiri oleh sinyal SIGSEGV (Address boundary error) Segmentasi kesalahan ...
Gringo Suave
000: <: 0005: 20: Permintaan (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Balas ke QueryExtension: present = true (0x01) major-opcode = 135 peristiwa pertama = 85 kejadian pertama = 85 kesalahan pertama = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension major = 1 minor = 0 000:>: 0006: 32: Balas ke UseExtension: major = 1 minor = 0
Gringo Suave
60

Alat otomatisasi X dapat digunakan untuk mengirim acara utama yang diperlukan.

Catatan:
Untuk penggunaan pertama, Solusi ini mengharuskan Anda untuk merekam kata sandi yang benar untuk menginstal alat baru, jika CAPS Anda saat ini aktif:

  • Gunakan SHIFTtombol untuk mengetik huruf kecil.
  • Aktifkan aksesibilitas, hamparkan keyboard virtual.
  • Pasang kembali keyboard eksternal. (Terima kasih kepada chris455 )
  • Buka kantor penulis, tulis kata sandi di sana, ubah huruf, salin, lalu tempelkan ke dialog kata sandi.

Jika semua opsi sebelumnya tidak mungkin atau tidak berfungsi, Pergilah dengan skrip jawab / python Gilles . Tidak perlu menginstal alat tambahan apa pun, hanya menggunakan python& libX11lib bersama yang sudah diinstal sebelumnya.

Menggunakan xdotool

  1. Pasang itu

    sudo apt-get install xdotool
    
  2. Kirim acara CAPS turun / naik

    xdotool key Caps_Lock
    

Alat lainnya adalah xte

  1. Pasang itu

    sudo apt-get install xautomation
    
  2. Kirim acara kunci / atas CAPS CAPS

    xte "key Caps_Lock"
    

Referensi:

user.dz
sumber
Bagaimana jika ini tidak berhasil?
quant_dev
2
Ini adalah satu-satunya yang bekerja untuk saya. batalkan dan yang lainnya tidak berfungsi.
lnostdal
12
TIDAK BISA MENGINSTAL, PASSWORD TIDAK DITERIMA. :(
Gringo Suave
2
Anda dapat menggunakan tombol Shift untuk memasukkan huruf kecil saat Caps Lock diaktifkan.
chris544
1
Jika Anda menggunakan keyboard eksternal, opsi lain bisa dicolokkan kembali; Pengubah Caps Lock mungkin diatur ulang, sehingga Anda dapat memasukkan huruf kecil.
chris544
14

Sedangkan untuk versi python Gilles yang tidak bekerja di ubuntus yang lebih baru, mengatur pengembalian yang benar untuk tampilan terbuka sepertinya melakukan trik:

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

(Kode diadaptasi dari https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )

diegog
sumber
Ini bekerja dengan sangat baik, adalah penyelamat hidup
Garret Gang
8

Jika Anda tidak dapat mengakses CAPS karena Anda memetakannya kembali di .bashrc, seperti yang saya lakukan, maka cukup beralih ke terminal virtual (alt + ctl + fN) dan kemudian beralih kembali bekerja untuk saya.

Benjamin
sumber
1
Switching tidak cukup berhasil, tetapi itu membuat saya sampai pada titik di mana saya bisa menekan caps lock untuk memperbaikinya.
labirin
1

Saya punya masalah ini dan bisa memperbaikinya dengan menggunakan keyboard OnBoard (di Ubuntu Mate, di bawah Universal Access).

Setelah dihidupkan, Anda akan melihat kunci CapsLock berwarna merah, atau entah bagaimana menunjukkan bahwa itu terkunci. Kemudian Anda dapat menekan untuk mematikan.

jogi
sumber