在集智俱乐部注意力与知识管理群里最近讨论起了 Alfred,一位同志建议我使用它,他跟我分享了 alfred-github-workflow 说:「感觉作为入口,它做得很不错了。可以直接搜索我的收藏夹、本地文档(甚至 PDF 内容。不过我用不到)、github、api 文档。极少找不到的时候,回车就跳到 google 搜索」。

但事实上 Alfred 的大部分搜索功能都能靠浏览器的搜索框完成,比如搜索 Steam ,在火狐中需要在搜索框上右键把它添加到收藏夹里: 图 add custom search engine firefox 然后就可以用「设定的搜索引擎关键字 + 空格 + 搜索词」来搜索了。

对于程序员来说,把 https://devdocs.io/ 的搜索框关键词设置为 doc,未来在 VSCode 里写到一半需要查某个 API 用法的时候,只需 Command + T 唤起浏览器输入框,键入例如 doc compact 回车就能查询 lodash → compact 的用法了。

在 Chrome 上会自动添加用过的搜索引擎,只需要键入部分网址后按 Tab 即可用网址提供的搜索引擎搜索。

以下是我正在使用的部分搜索引擎: 图 my search engine list

快速唤起浏览器

所以想要实现 Alfred 的功能,我要做的就是用一个快捷键快速唤起浏览器的输入框,就像用快捷键唤起 Alfred 输入框那样。

我很快找到了网上的一段陈年代码,简单改造后如下:

# To run:
# osascript firefox-open-tab.applescript http://technosophos.com
#
# References:
# https://support.mozilla.org/en-US/questions/1130718
# https://stackoverflow.com/questions/3645763/how-do-i-instruct-applescript-to-open-a-new-firefox-window-with-a-link

#on firefoxRunning()
# tell application "System Events" to (name of processes) contains "firefox"
#end firefoxRunning

on run
  #if (firefoxRunning() = false) then
  # do shell script "open -a Firefox "
  # delay 1
  #end if
  tell application "Firefox"
    activate
    tell application "System Events" to keystroke "t" using command down
  end tell
end run

其中大部分都被注释掉了,因为我平时一直保持火狐狸浏览器在打开状态,不会遇到浏览器关闭的情况。如果想唤起 Chrome ,只需把 "Firefox" 改为 "Chrome"

要为这段脚本添加快捷键,需要用 Mac OS 自带的 Automator (自动操作)应用程序,创建一个快捷操作(在「系统设置 → 快捷键」里会显示为「服务」):

图 add automator workflow

然后在「操作」里搜索「script」,并添加 AppleScript 或 JXA (Javascript for Automation):

图 add applescript in automator

把「运行 AppleScript」拖动到右侧,并把脚本黏贴进去,点击锤子图标可以高亮代码(苹果的代码编辑器居然不支持即时编译的语言服务器):

图 add script

保存(默认是保存到 iCloud)后就能在快捷键设置里看到它了:

add keyboard shortcut

这时候可以给它加一个方便的快捷键,比如 Alfred 用的 option + space 或者打开新标签页用的 command + T

如果出现快捷键冲突,比如想要在访达(Finder)里面使用这个快捷键,但是它与访达的「新建标签页」冲突了,这时可以新增加一个应用快捷键,选取应用程序「访达」,并在菜单标题一栏里填写「新建标签页」,替换一个别的没啥用的功能的快捷键,比如 command + N,这样在访达里也能快速调用浏览器输入框了:

图 override finder keyboard shortcut

权限设置

这时在 VSCode 里使用这个快捷键可能会被系统拦下来,说一通「操作“运行 AppleScript”遇到了错误:““System Events”遇到一个错误:“com.automator.runner.xpc”不允许发送按键。”」之类的模棱两可的官腔。

这意味着在使用这个系统服务快捷键前要先在「安全性与隐私 → 辅助功能」里把「自动操作」和「 VSCode 」勾选上:

图 enable automator

图 enable vscode

如果想在其他应用里使用这个快捷键,也得点击「+」把这个应用添加到「辅助功能」列表里并勾选。

如此一来,想要查看某个库的 API 时,只需在 VSCode 里用 Shift + Control + Command + → 扩大选取选中一段文字,比如选中 param.macro,然后按 Command + T 唤出一个崭新的浏览器输入框,并键入 npm Command+V 就可以搜其 API 了:

图 search it on search box

其他输入框功能

在火狐浏览器里,输入框也带有「使用其他搜索引擎搜索」的功能,比如装了 Wikipedia + Wikiwand 插件后,使用搜索框下面的图标就能在 Wikiwand 里打开搜索词了。

如果输入的关键字包含在某个已经打开的 Tab 的 Title 里、历史记录里、收藏夹里,那么也会显示在下拉列表里,可以直接打开。

计算器、单位换算、单词句子翻译等等功能是 Google 自带的,输入并回车后半秒就能看到结果,所以也能算是浏览器输入框带有的功能吧。

当然,不得不承认 Alfred 等工具能调用 AppleScript,从而管理大量自定义服务(我刚刚定义的「唤起并打开浏览器新标签页」就是一个自定义服务),可以想见,当我自定义了数十个这样的服务后,可能会记不清其快捷键,这就是 Alfred 上场的时候了。

不过目前我还没想到本地还有什么可以自动化的操作,毕竟现在我的文档都在印象笔记和 Notion 上,代码都在 Github 上,而这些在线服务的搜索引擎都可以被浏览器直接调用。本地其实只是作为 git repo 的缓存而已,没有什么值得搜索和自动化的东西啦。