我目前正在尝试对Sylpheed进行过滤,以从命令中删除服务器中的消息,并且我正在考虑编写一个bash脚本,当您按下诸如F8之类的命令时,该脚本将返回true,然后将其用作论点。
不幸的是,这似乎比预期的要难。到目前为止,我已经尝试了以下代码:
#!/bin/sh
f8='^[[19~'
f9='^[[20~'
echo please enter the F8 function key
read -n5 key # Read 5 characters.
echo -n "$key" | grep "$f8" #Check if character code detected.
if [ "$?" -eq $SUCCESS ]
then
echo "F8 key pressed."
return 0
fi
echo -n "$key" | grep "$f9" #Check if character code detected.
if [ "$?" -eq $SUCCESS ]
then
echo "F9 key pressed."
return 0
fi
我在网上找到了并进行了一些修改,但是不幸的是,它似乎不起作用(使用Fedora LXDE)。我通过在终端中使用control-v来获取F8和F9键的按键数据,然后按F8键和F9键相同。
我已经尝试过通过删除^并将读取的-n5更改为读取的-n4来进行变体,但是grep仍然会说“ grep:不匹配”等。有人可以帮忙吗?
也向任何可以向我展示如何在Slypheed上创建过滤器以从服务器删除电子邮件的人开放,作为替代解决方案(显然可以,但是我无法使其正常工作;目前正在对其进行测试)在gmail帐户上,并且在客户端中删除的所有邮件都不会在gmail上删除,而且我似乎无法使过滤器在标记邮件,彩色邮件或上述任何允许用户选择他们要从服务器删除的邮件)。由于客户端规范,我无法切换到IMAP。
答案 0 :(得分:0)
在网络上找到此脚本:
#!/bin/bash
_key()
{
local kp
ESC=$'\e'
_KEY=
read -d '' -sn1 _KEY
case $_KEY in
"$ESC")
while read -d '' -sn1 -t1 kp
do
_KEY=$_KEY$kp
case $kp in
[a-zA-NP-Z~]) break;;
esac
done
;;
esac
printf -v "${1:-_KEY}" "%s" "$_KEY"
}
_key x
case $x in
$'\e[11~' | $'\e[OP') key=F1 ;;
$'\e[12~' | $'\e[OQ') key=F2 ;;
$'\e[13~' | $'\e[OR') key=F3 ;;
$'\e[14~' | $'\e[OS') key=F4 ;;
$'\e[15~') key=F5 ;;
$'\e[16~') key=F6 ;;
$'\e[17~') key=F7 ;;
$'\e[18~') key=F8 ;;
$'\e[19~') key=F9 ;;
$'\e[20~') key=F10 ;;
$'\e[21~') key=F11 ;;
$'\e[22~') key=F12 ;;
$'\e[A' ) key=UP ;;
$'\e[B' ) key=DOWN ;;
$'\e[C' ) key=RIGHT ;;
$'\e[D' ) key=LEFT ;;
?) key=$x ;;
*) key=??? ;;
esac
echo "You have pressed $key"
答案 1 :(得分:0)
我也遇到过这个问题。问题之一是不同的不可打印键有不同数量的字符,所以经过一些实验我写了以下脚本:
# Special keypress could take variable amount of characters
keypress=""
# waiting for any key press down
read -rsN1 keytap
# loop while read can read any additional character and join all of them
while [ -n "$keytap" ]; do
keypress="${keypress}${keytap}"
read -sN1 -t 0.01 keytap
done
现在您可以使用 case 来检查:
case "$keypress" in
$'\e[11~') echo F1
$'\e[21~') echo F10
$'\e[A') echo Up arrow
$'\t') echo Tab key
$'\e[3~') echo Del key
esac