Tüm klavye tuşlarını hızlı bir şekilde test etmek için komut dosyası


14

Bazı dizüstü bilgisayarlarda kötü klavye tuşları olup olmadığını kontrol etmem gerekiyor ve bu yüzden bunu mümkün olduğunca hızlandırmak istiyorum.

Bu özel görev için hiçbir şey bulamadım, bu yüzden fikrim basılan tuşları okuyan ve tüm klavye tuşlarını bilen bir komut dosyası, bu yüzden onları hızlı bir şekilde bastırabilirim ve hangilerinin henüz basılmadığını bildirir. Ben ya showkeyya xev, çıktı grepping ile başarabilirim sanırım :

xev | grep keysym

Örnek çıktı:

state 0x10, keycode 46 (keysym 0x6c, l), same_screen YES,
state 0x10, keycode 33 (keysym 0x70, p), same_screen YES,
state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
state 0x10, keycode 51 (keysym 0x5d, bracketright), same_screen YES,
state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,

Okunabilir tuş takımı oldukça kullanışlıdır, ancak değiştirici tuşlar açık / kapalı (kapak kilidi, num kilidi) değiştikçe anahtar kodlarını test etmeye hazırım. Ben bash için yeniyim, bu yüzden bir şeyleri bir araya getiriyorum. Bu şimdiye kadarki en iyi sonuç:

#!/bin/bash

function findInArray() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
    if [[ ${!i} == ${value}* ]]; then
    echo "${!i}"
    return 0
    fi
    }
    echo
    return 1
}

list=( 38:a 56:b 54:c 40:d 26:e 36:Return 50:Shift_L )
xev | \
# old grep solution
# grep -Po '(?<=keycode )[0-9]+(?= \(keysym 0x)' | \
# 200_success' suggestion
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; 
do
  found=$(findInArray "${list[@]}" ${keycode})
  if [[ $found ]]; then
    echo Pressed $found
    list=(${list[@]/${keycode}\:*/})
    echo 'Remaining ===>' ${list[@]}
    if [[ ${#list[@]} == 0 ]]; then
      echo All keys successfully tested!
      pkill xev
      exit 0
    fi
  fi
done

Kullanırken grepçıktıyı yalnızca kapattığım zaman yazdırıyordu xevve sonunda da öldürmeyecekti. awk@ 200_success gelen öneri bu konuları çözüldü, ancak immediatelly çıktı yazdırmıyor: o "kızarmış" olarak çıkış için 5-6 tuş vuruşlarını alır. Bunu nasıl düzeltebilirim?

Not: Bu komut dosyasının her farklı klavye modeli için farklı bir anahtar listesi gerektireceğini biliyorum, ancak test etmek için sadece birkaç modelim olduğu için bu sorun değil.


Edit 1: Soruyu en son script kodumla düzenledim.

Düzenleme 2: komut dosyası @ 200_success önerisine göre güncellendi.


3
dizi böyle olmalı list=( a b c d e f Shift_L Return )değil mi?
Rahul Patil


@Rahul evet, gönderdiğim bir dize. Testlerim ilk önce onunla çalıştı, bu yüzden yine de gönderdim. Ama elbette, bunun için bir liste daha uygundur. Snippet'in için teşekkürler.
mdrg

@Rahul Bazı testlerden sonra neredeyse işlevsel bir senaryom var. Soruyu onunla birlikte düzenledim.
mdrg

Yanıtlar:


5

Satırınızı çıktısını temizleyengrep bir awkkomut dosyasıyla değiştirmeyi deneyin .

xev | \
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; do
    # etc.
done

Harika! Yapıldığını söyleyebilirim, ancak çıktıyı yazdırmak için neden bu kadar fazla tuş vuruşu gerektirdiğini merak ediyordum, çünkü 'floş' çalışmıyor. 'B' tuşuna basarsam, tuşunun Pressed 56:bgörünmesi 5-6 tuşa daha basar.
mdrg

Buldum: awk -W interactive. Yardımınız için teşekkürler, çok önemliydi.
mdrg

1

Biraz daha deneme yanılma sonrasında Google ve manbu sürüm beklediğim gibi çalışıyor:

#!/bin/bash

function findInArray() {
  local n=$#
  local value=${!n}
  for ((i=1;i < $#;i++)) {
    if [[ ${!i} == ${value}:* ]]; then
      echo "${!i}"
      return 0
    fi
  }
  echo
  return 1
}

list=( 10:1 11:2 12:3 36:Return 37:Control_L 38:a 39:s 134:Super_R 135:Menu )
clear
echo -e "${#list[@]} keys to test\n\n${list[@]}"
xev | \
awk -W interactive '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; 
do
  found=$(findInArray "${list[@]}" ${keycode})
  if [[ $found ]]; then
    clear
    echo Pressed $found
    list=(${list[@]/$found/})
    remaining=${#list[@]}
    stdbuf -oL -eL echo -e "$remaining keys remaining\n\n${list[@]}"
    if [[ $remaining == 0 ]]; then
      clear
      echo All keys successfully tested!
      pkill xev
      exit 0
    fi
  fi
done

Listenizi xevçıktıya göre oluşturun (aceleyle kullandım xev | grep keycode, bir metin düzenleyicide klavye parçalarını ve regex değiştirmelerini) ve değiştirin.

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.