キーボードのキーが間違っていないかノートブックを確認する必要があるので、できる限り高速化したいと思います。
この特定のタスクには何も見つかりませんでしたので、私のアイデアは、押されたキーを読み取り、すべてのキーボードのキーを知っているスクリプトです。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の提案に従ってスクリプトを更新しました。
list=( a b c d e f Shift_L Return )
が好きですよね?