コマンドラインでCaps Lock(キーではなくロック)をオフにするにはどうすればよいですか?


91

何らかの理由で、ラップトップがCaps Lockでスタックしています。私が持っているCaps Lockことにより、マッピングされたキーxmodmapにするhyper_lので、私は持っていないcaps_lock、それをオフにするキーを押します。コマンドラインで無効にする方法はありますか?特に将来の参照のために、コンピューターをリセットせずにロック状態をリセットできればいいと思います。これは以前にも起こりましたが、今回は適切に行う方法を知りたいと思います。


[echo -e "$(dumpkeys | grep ^ keymaps)\ nkeycode 58 = Escape" | sudo loadkeys] [1] [.profileまたは.bash_profileに次の行を追加すると、capsロックが無効になります。] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]:askubuntu.com/questions/ 43986 / ... [2]:askubuntu.com/questions/43986/... [3]:askubuntu.com/questions/43986/...
ワンゼロ

setxkbmap -optionキャップ:なし
Pavlos Theodorou

@PavlosTheodorouは、CAPSキーを無効にし、OP要件としてのステータスを切り替えません。
user.dz

そこにバグがあります。現在、それを行うコマンドはありません。setleds + capsまたは-capsを使用できますが、機能しません。あなたができる唯一のことはすでに答えられています。キャップを再マップできます
パブロスセオドアー

回答:


129

Ubuntuのコマンドラインツールは知りません。(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 -pmしてMod1から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))


Pythonを呼び出す代わりに小さなバイナリを作成する場合のCバージョンを次に示します。gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11パッケージを使用してbuild-essentialslibx11-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

うーん、pythonメソッドは以前は機能していましたが、Yakketyにアップグレードした後は機能しません。Caps Lockがスタックするバグはもちろん持続します!
グリンゴサーブ

@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(アドレス境界エラー)で終了しましたセグメンテーションエラー…
Gringo Suave

000:<:0005:20:Request(98):QueryExtension name = '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:Reply to UseExtension:major = 1 minor = 0
Gringo Suave

59

Xオートメーションツールを使用して、必要なキーイベントを送信できます。

注:
初めて使用する場合、このソリューションでは、CAPSが現在アクティブな場合、新しいツールをインストールするために正しいパスワードをテープで記録する必要があります。

  • SHIFTキーを使用して小文字を入力します。
  • アクセシビリティを有効にし、仮想キーボードをオーバーレイします。
  • 外付けキーボードを再接続します。(chris455に感謝
  • オフィスライターを開き、そこにパスワードを書き、大文字と小文字を変更してコピーし、パスワードダイアログに貼り付けます。

以前のオプションがすべて使用できない場合、または機能しない場合は、Gillesのanswer / python scriptを使用してください。追加のツールをインストールする必要はありません。事前にインストールされているpythonlibX11共有ライブラリのみを使用します。

を使用して 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

2
これは私のために働いた唯一のものです。nullifyなどは機能しませんでした。
-lnostdal

12
インストールできません。パスワードは受け入れられません。:(
グリンゴサーブ

2
Caps Lockが有効な場合、Shiftキーを使用して小文字を入力できます。
chris544

1
外部キーボードを使用している場合、別のオプションで再接続することができます。Caps Lock修飾子はリセットされる可能性があるため、小文字を入力できます。
chris544

14

Gillesのpythonバージョンが新しい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

.bashrcでマップし直したためにCAPSにアクセスできない場合は、仮想ターミナル(alt + ctl + fN)に切り替えてから元に戻すだけでうまくいきました。


1
切り替えではうまくいきませんでしたが、Caps Lockを押して問題を解決できるようになりました。
ラビリンス

1

この問題があり、OnBoardキーボード(Ubuntu MateのUniversal Access)を使用して修正できました。

オンにすると、CapsLockキーが赤色で表示されるか、何らかの形でロックされていることが示されます。次に、を押してオフに切り替えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.