Alfred 中如何做自定义搜索?
2024-01-08 15:39:45
感谢这篇文章 https://www.evanlovely.com/utilities/alfred/snippets/ 给了我基本的框架
背景
我想让 DailyNotes 支持笔记搜索,但是不希望把搜索功能耦合到 DailyNotes 代码中。使用第三方搜索工具是最好的,比如 grep
命令其实就很够用了。为了能够调用 grep
命令,并能方便地显示搜索结果,使用 Alfred 是个不错的主意。之前折腾了几次,没有成功,昨晚突然又想尝试下,终于找到了方法。其实,方法就藏在 Alfred 的文档中,只不过没心思细看。
过程
Alfred 中调用脚本处理数据并输出结果的工作原理为:
- 通过命令激活处理程序。下例中,
s
是命令。 - 处理程序中调用脚本。调用脚本时可以向脚本传递参数。
{query}
指的是查询参数,例如下图中 s 是激活命令,Snowflake 就是查询参数。
- 在脚本里, 可以做任意的处理,输出一个
<items>
结构。例如:
export dir="$1/"
echo "<items>"
if [ "$2" ]
then
export QUERY="$2"
find "$1" -maxdepth 1 -type f -exec grep -i -l "$2" {} + | sort -r | xargs -I {} \
sh -c 'echo "<item arg=\"$1\" type=\"file\" uid=\"$1\"><title>$(echo "${1/$dir/}")</title><subtitle>$(grep -i "${QUERY}" "$1" | head -n 1)</subtitle><icon type=\"fileicon\">$1</icon></item>"' -- {}
else
# No argument provided, list all
echo '<item arg="$dir/PeopleSoft.md" type="file" uid="$dir/PeopleSoft.md"><title>PeopleSoft.md</title><subtitle><![CDATA[人是最重要的!]]></subtitle><icon type="fileicon">$dir/PeopleSoft.md</icon></item>'
fi
echo "</items>"
这里的处理关键就是构造 <items>
,里面的每一个 <item>
就是显示在 Alfred 结果中的一个条目。例如下图中,就包含了 4 个 <item>
:
上面的脚本有个细节:里面有个逻辑判断 if [ "$2" ]
,这是因为当我们输入 s
后,Alfred 就会被立即激活,并且立即开始以空参数的方式调用脚本,此时建议用一个轻量的 <item>
响应一下查询即可,否则可能会导致响应很慢。
为了避免每输入一个字符就触发一次脚本,可以双击 Script Filter,然后编辑触发行为(Run Behavior),触发下一个脚本时杀掉上一个脚本,等待输入完成后再触发脚本等。这么做,响应速度回差一些,但是够用。
- 就这么简单。为了能够打开搜索到的文件,在 Alfred 中建立一个工作流即可:
完工。
Extension
假设我实现了一个搜索引擎,那么我可以用脚本调用搜索引擎获得结果,然后把结果组织成 <items>
,最后在 Alfred 中对接一个 Open URL 的工作流即可。
文章来源:https://blog.csdn.net/maray/article/details/135455726
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!