ฉันต้องตรวจสอบโน้ตบุ๊กบางตัวเพื่อหาแป้นคีย์บอร์ดที่ไม่ดีดังนั้นฉันจึงอยากเร่งความเร็วให้มากที่สุด
ฉันไม่พบสิ่งใดสำหรับงานนี้ดังนั้นความคิดของฉันคือสคริปต์ที่อ่านคีย์ที่กดและรู้ว่าแป้นคีย์บอร์ดทั้งหมดดังนั้นฉันจึงสามารถทุบตีมันได้อย่างรวดเร็วและรายงานว่ายังไม่ได้กด ฉันคิดว่าฉันจะประสบความสำเร็จที่มีทั้ง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
list=( a b c d e f Shift_L Return )
ใช่ไหม