সমস্ত কীবোর্ড কীগুলি দ্রুত পরীক্ষা করার জন্য স্ক্রিপ্ট


14

খারাপ কীবোর্ড কীগুলির জন্য আমার কয়েকটি নোটবুকগুলি পরীক্ষা করা দরকার, এবং তাই আমি যতটা সম্ভব গতি বাড়িয়ে দিতে চাই।

আমি এই নির্দিষ্ট কাজের জন্য কিছুই পাইনি, সুতরাং আমার ধারণাটি এমন একটি স্ক্রিপ্ট যা চাপা কীগুলি পড়ে এবং সমস্ত কীবোর্ড কী জানে, তাই আমি তাদের দ্রুত তাড়িত করতে পারি এবং এটি জানায় যে কোনটি এখনও চাপা নেই। আমি অনুমান করি যে আমি showkeyবা xevএটির মাধ্যমে আউটপুট গ্রেপ করেই এটি সম্পাদন করতে পারি :

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,

পঠনযোগ্য কীসিয়ামটি বেশ কার্যকর, তবে আমি কীকোডগুলি পরীক্ষা করার জন্য আগ্রহী, কারণ তারা পরিবর্তিত কীগুলি চালু / বন্ধ করা (ক্যাপস লক, নাম লক) হিসাবে পরিবর্তিত হয় না। আমি মারতে নতুন, তাই আমি কিছু একসাথে রাখছি। এটি এখন পর্যন্ত সেরা ফলাফল:

#!/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_সুকসেস পরামর্শ অনুযায়ী স্ক্রিপ্ট আপডেট হয়েছে।


3
অ্যারে এটি পছন্দ করা উচিত list=( a b c d e f Shift_L Return )?
রাহুল পাতিল


@ রাহুল হ্যাঁ, আমি যা পোস্ট করেছি তা একটি স্ট্রিং। আমার পরীক্ষাগুলি এটির সাথে প্রথম কাজ করেছে, তাই যাইহোক আমি পোস্ট করেছি। তবে অবশ্যই, এর জন্য একটি তালিকা আরও উপযুক্ত। আপনার স্নিপেট জন্য ধন্যবাদ।
mdrg

@ রাহুল কিছু পরীক্ষার পরে, আমার প্রায় কার্যকরী স্ক্রিপ্ট রয়েছে। আমি এটি দিয়ে প্রশ্ন সম্পাদনা করেছি।
mdrg

উত্তর:


5

আপনার grepলাইনটি এমন awkস্ক্রিপ্টের সাথে প্রতিস্থাপনের চেষ্টা করুন যা এর আউটপুটকে ফ্লাশ করে।

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

গ্রেট! আমি বলতে পারি এটি হয়ে গেছে, তবে আমি ভাবছিলাম যে আউটপুট প্রিন্ট করতে এতগুলি কী কী স্ট্রোক লাগছে, যেমন 'ফ্লাশ' কাজ করছে না। আমি 'বি' টিপলে এটি প্রদর্শিত হতে 5-6 টি অন্যান্য কীস্ট্রোক লাগবে Pressed 56:b
mdrg

এটি পাওয়া: awk -W interactive। আপনার সাহায্যের জন্য ধন্যবাদ, এটি অপরিহার্য ছিল।
mdrg

1

আরও কিছু ট্রায়াল-এন্ড ত্রুটির পরে গুগল এবং 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, একটি পাঠ্য সম্পাদকের উপর কীবোর্ড স্ম্যাশ এবং রেজেক্স প্রতিস্থাপন) এবং এটিকে প্রতিস্থাপন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.