すべてのキーボードキーをすばやくテストするスクリプト


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,

読み取り可能なキーシムは非常に便利ですが、修飾キーがオン/オフに切り替えられても変化しないため(キャップ​​スロック、numロック)、キーコードをテストしました。私はbashが初めてなので、何かをまとめています。これはこれまでのところ最高の結果です:

#!/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からの提案はこれらの問題を解決しましたが、すぐに出力を印刷しません。出力を「フラッシュ」するには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

すごい!私はそれが完了したと言うことができましたが、なぜ「フラッシュ」が機能していないように、出力を印刷するのに多くのキーストロークが必要なのか疑問に思っていました。「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し、テキストエディターでキーボードスマッシュと正規表現の置換を使用)、置換します。

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