Preciso verificar alguns blocos de anotações em busca de teclas defeituosas no teclado e, portanto, gostaria de acelerar isso o máximo possível.
Não encontrei nada para esta tarefa específica; portanto, minha ideia é um script que leia as teclas pressionadas e conheça todas as teclas do teclado, para que eu possa bater rapidamente nelas e relate quais ainda não foram pressionadas. Suponho que eu poderia conseguir isso com um showkey
ou outro xev
, saudando a saída:
xev | grep keysym
Saída de amostra:
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,
O keyym legível é bastante útil, mas eu preciso testar os códigos de chave, pois eles não mudam à medida que as teclas modificadoras são ativadas / desativadas (caps lock, num lock). Eu sou novo no bash, então estou montando algo. Este é o melhor resultado até agora:
#!/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
Enquanto eu usava grep
, estava apenas imprimindo a saída quando eu fechei xev
e não a mataria no final também. A awk
sugestão do @ 200_success resolveu esses problemas, mas não imprime a saída imediatamente: são necessárias 5-6 pressionamentos de tecla para que a saída seja "liberada". Como posso consertar isso?
Nota: Eu sei que esse script exigiria uma lista diferente de teclas para cada modelo diferente de teclado, mas tudo bem, pois só tenho alguns modelos para testar.
Editar 1: editei a pergunta com o meu código de script mais recente.
Edição 2: script atualizado de acordo com a sugestão @ 200_success.
list=( a b c d e f Shift_L Return )
não é?Respostas:
Tente substituir sua
grep
linha por umawk
script que libere sua saída.fonte
Pressed 56:b
que apareça.awk -W interactive
. Obrigado pela sua ajuda, foi essencial.Após mais algumas tentativas e erros, o Google e
man
esta versão funcionam como eu esperava:Crie sua lista com base na
xev
saída (usei com pressaxev | grep keycode
, esmagamento do teclado e substituições de regex em um editor de texto) e substitua-a.fonte