สคริปต์เพื่อทดสอบแป้นคีย์บอร์ดอย่างรวดเร็วทั้งหมด


14

ฉันต้องตรวจสอบโน้ตบุ๊กบางตัวเพื่อหาแป้นคีย์บอร์ดที่ไม่ดีดังนั้นฉันจึงอยากเร่งความเร็วให้มากที่สุด

ฉันไม่พบสิ่งใดสำหรับงานนี้ดังนั้นความคิดของฉันคือสคริปต์ที่อ่านคีย์ที่กดและรู้ว่าแป้นคีย์บอร์ดทั้งหมดดังนั้นฉันจึงสามารถทุบตีมันได้อย่างรวดเร็วและรายงานว่ายังไม่ได้กด ฉันคิดว่าฉันจะประสบความสำเร็จที่มีทั้งshowkeyหรือxev, grepping เอาท์พุท:

xev | grep keysym

ตัวอย่างผลลัพธ์:

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,

Keysym ที่สามารถอ่านได้มีประโยชน์มาก แต่ฉันต้องทดสอบรหัสเนื่องจากไม่มีการเปลี่ยนแปลงเนื่องจากปุ่มตัวปรับเปลี่ยนจะเปิด / ปิด (ตัวล็อค, ตัวล็อค NUM) ฉันใหม่เพื่อทุบตีดังนั้นฉันจึงรวบรวมบางอย่างเข้าด้วยกัน นี่คือผลลัพธ์ที่ดีที่สุดจนถึงตอนนี้:

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

ในขณะที่ฉันใช้grepมันเป็นเพียงการพิมพ์ผลลัพธ์เมื่อฉันปิดxevและมันจะไม่ฆ่ามันในตอนท้ายเกินไป awkข้อเสนอแนะจาก @ 200_success แก้ไขปัญหาเหล่านี้ แต่ก็ไม่ได้พิมพ์เอาท์พุท immediatelly: มันจะใช้เวลา 5-6 กดแป้นพิมพ์สำหรับการส่งออกจะเป็น "แดง" ฉันจะแก้ไขได้อย่างไร

หมายเหตุ: ฉันรู้ว่าสคริปต์นี้จะต้องมีรายการคีย์ที่แตกต่างกันสำหรับคีย์บอร์ดแต่ละรุ่น แต่นี่ก็โอเคเพราะฉันมีรุ่นทดสอบสองรุ่นเท่านั้น


แก้ไข 1: ฉันแก้ไขคำถามด้วยรหัสสคริปต์ล่าสุดของฉัน

แก้ไข 2: อัปเดตสคริปต์ตามคำแนะนำ @ 200_success


3
อาร์เรย์ควรเป็นเช่นนี้list=( a b c d e f Shift_L Return )ใช่ไหม
ราหุลปาติล


@Rahul ใช่สิ่งที่ฉันโพสต์เป็นสตริง การทดสอบของฉันเพิ่งใช้งานได้ก่อนดังนั้นฉันจึงโพสต์ต่อไป แต่แน่นอนรายการมีความเหมาะสมกว่านี้ ขอบคุณสำหรับตัวอย่างของคุณ
mdrg

@Rahul หลังจากการทดสอบฉันมีสคริปต์ที่ใช้งานได้เกือบ ฉันแก้ไขคำถามด้วย
mdrg

คำตอบ:


5

คุณลองเปลี่ยนgrepสายกับawkสคริปต์ที่วูบวาบเอาท์พุท

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

ที่ดี! ฉันสามารถบอกได้ว่ามันทำเสร็จแล้ว แต่ฉันสงสัยว่าทำไมการกดแป้นจำนวนมากเพื่อพิมพ์ผลลัพธ์เช่น 'flush' ไม่ทำงาน หากฉันกด 'b' จะต้องใช้การกดแป้นพิมพ์อื่น ๆ 5-6 ครั้งเพื่อPressed 56:bให้ปรากฏ
mdrg

awk -W interactiveพบว่า: ขอบคุณสำหรับความช่วยเหลือของคุณมันเป็นสิ่งจำเป็น
mdrg

1

หลังจากทดลองใช้และข้อผิดพลาดเพิ่มเติม Google และmanรุ่นนี้ทำงานได้ตามที่ฉันคาดไว้:

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

สร้างรายการของคุณตามxevผลลัพธ์ (ฉันใช้อย่างเร่งด่วนxev | grep keycode, แป้นพิมพ์ smash และการแทนที่ regex ในโปรแกรมแก้ไขข้อความ) และแทนที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.