这篇文章主要探讨的是一种结合 Ai Search 和 Drafts 进行快速网站搜索的方法。Ai Search 扮演的是一个搜索引擎库,而 Drafts 是提高调用搜索引擎效率的工具。文中方法的关键点在于键盘输入,搜索内容和选择搜索引擎的操作都可以通过键盘输入完成。
搜索方法流程
如果你在 Mac 上有使用 Alfred,对这种 搜索引擎关键字 + 搜索内容
的方法一定不会陌生。Alfred 通过先输入搜索引擎关键字,如「bing」,确定将要使用的搜索引擎,接着输入搜索内容,就可以搜索必应网站的内容。
Alfred 搜索流程
本文利用 Ai Search 和 Drafts 达到类 Alfred 的效果,不仅可以搜索网页内容,还可以跳转到其它 App 中进行搜索。和 Alfred 不同的是,搜索引擎关键字
和 搜索内容
的位置可以互换,为了方便解释,本文会以 搜索内容 + 搜索引擎关键字
的顺序调用搜索。
网页搜索和 App 搜索演示
如果只使用 Ai Search,也是可以达到类 Alfred 的效果,但是某些搜索场景会带来一些麻烦,接下来在 Ai Search 配置章节将会详细说明这问题。引入 Drafts,可以很好地解决这问题,而且带来更多的可能性,让这方法不仅仅局限于搜索。
本文导航(点击可快速跳转至对应章节)
- Ai Search 的搜索引擎配置
- Drafts 的 Action 和 Keyboard key 配置
- 小结
- 进阶方法一:Ai Search 的标签和默认搜索源
- 进阶方法二:用 JavaScript 改造「快捷搜索」
- 结语
Ai Search 的搜索引擎配置
自定义搜索引擎
Ai Search 不仅内置了多种多样的搜索引擎,而且还允许用户添加自定义搜索引擎。添加方法隐藏得比较深,需要在「搜索引擎推荐」的页面中,长按左上角的回形针图标,在弹出的对话框中输入搜索引擎名称和网页地址即可完成添加。名称和网址的添加方法接下来会详细解释,并且根据下面提到的内容,你会很快建立一个少数派的搜索引擎。
关于名称
这里的建议是命名时,为每个名称都加上一个特殊符号。以少数派的搜索为例,引擎命名为「☑︎sspai」(本文将在此命名方法的基础上进行讲解)。这个命名是为了避免某些使用场景的不便。因为 Ai Search 有一个缺点(在快捷搜索这方面上是优点),如果搜索内容包含搜索标签,它就启动相应的搜索。
例如,假设有一个标签名为「Google」的搜索引擎,在 Ai Search 中输入「Google Trees」,就是在 Google 中搜索「Trees」。问题在于,如果输入的内容是「Google Google 和 Amazon 的不同」,得到的结果就是在 Google 中搜索了「和 Amazon 的不同」,所有「Google」字样都被省略了。如果碰巧你有一个标签名为「Amazon」的搜索引擎,那么 Ai Search 就会同时启用这两个搜索引擎,搜索的内容是「和 的不同」。这缺点在搜索英文内容或者关键词的时候表现得更为不便。
特殊符号的快速输入方法会在 Drafts 的配置中提到。
命名的时候要注意的是:
- 特殊符号和名称之前最好不要有空格。
在新建搜索引擎的时候,会附带为这引擎新建一个同名标签,如果添加空格会增加搜索的不便。标签在本文方法中占据了很重要的作用,标签就相当于搜索引擎的身份识别码,也就相当于 Alfred 中的搜索引擎关键字。
名称和标签的作用其实不一样,为了方便理解,这里把名称和标签设置为同名(默认生成),标签的添加和优点将会在文末进阶章节说明,只要存在一个标签,就不会影响本文方法的构建。
- 特殊符号不能是 Emoji,因为这会导致备份失败,曾向开发者反馈,还没修复。
- 名称最好是英文,方便输入。
关于 URL
添加的网址需要包含一个「*」符号,这个符号替代了搜索内容。寻找「*」位置的方法就是先在搜索引擎中输入搜索内容,然后将搜索内容替换为「*」即可。
继续以少数派为例,先在少数派中搜索「Apple」,会得到一个这样的网址 https://sspai.com/search/?q=Apple
,网址中「Apple」的位置就是「*」的位置,因此需要在 Ai Search 填入的是:
https://sspai.com/search/?q=*
除了添加网址外,还可以填入 URL Schemes 实现跳转到其它 App 中进行搜索。以 Tweetbot 为例,只需在网址区域的 http://
替换成 tweetbot:///search?query=*
即可。
至此,Ai Search 的搜索引擎配置就完成了。现在你应该有一个名称和标签都为「☑︎sspai」的少数派搜索引擎,当然大家也可以添加各种自己偏好的搜索引擎以满足需求。这时候,可以试试在 Ai Search 中通过输入 Drafts ☑︎sspai
来搜索少数派中关于 Drafts 的内容,你会发现符号「☑︎」会是搜索输入中的痛点,接下来 Drafts 就会解决这问题。
Drafts 的 Action 和 Keyboard key 配置
搜索引擎库有了,接下来就是配置一个快速调用该库的工具,Drafts 就是充当这样的存在。接下来的配置会涉及 Drafts 的 Action 和 Extended Keyboard Key 的添加。
创建 Drafts Action:「快捷搜索」
将要创建的 Action 主要作用是通过 Ai Search 的 URL Schemes 把搜索内容传递到 Ai Search 里,然后 Ai Search 就会进行相应的搜索。
这里会用到 Ai Search 的 URL Scheme: aisearch://command?q=
+ 搜索内容
+ 搜索源标签
具体创建步骤:
- 在 Drafts 中打开右边抽屉,然后点击右上角「+」选择 Create Action。
- 命名,名字随意,我的命名是「快捷搜索」。
- 点击 Steps。
- 先选择一个 Cliboard Step,这是把 Drafts 里输入的内容保存到 Cliboard 中,这一步非必要,但是可以防止误点这个 Action 后,把内容删掉的悲剧。
- 关键点,选择 URL Step,填入
aisearch://command?q=
,然后在键盘上方一行快捷输入中选择「clipboard」就行了(如果没有使用第五步,就选择「draft」)。勾选「URL encode tag output」。 - 保存后返回上一层 Action 页面,滑动到最下方定义「After Success」的操作,这操作的意义在于整个动作完成后,Drafts 会按照你的方式处理内容。这里我选择的是「Trash」,把内容扔到 Trash 中,这样 Drafts 里面就可以保持干净整洁了。
创建运行 Action 的 Keyboard Key
使用 Drafts 并且开启 Extended Keyboard 是一个很不错的使用体验,可以做到快速输入 Markdown 格式、运行 Actions、使用剪贴板和输入特定字符等等。
这里,需要创建一个 Keyboard Key 运行刚刚新建的 Action「快捷搜索」。
创建步骤如下:
- 在 Extended Keyboard 最右边选择「笔」的图标,然后点击「+」新建。
- 因为这个键是运行「快捷搜索」这个 Action,所以这里选择「Run Action」。
- 「Action Name」中点击「+」选择自己刚刚新建的 Action 就可以了。也可以通过输入 Action 名字来选择,输入的名字必须和 Action 的名字一模一样。
- 「Label」可以理解为在扩展键盘中显示的图标,这里我用了一个「?」的 Emoji,使用 Emoji 的优点在于直观和节省空间。
- 「Keyboard Shortcut」可以根据自己需要为设备的外接键盘添加快捷键。
- 保存后就可以在 Extended Keyboard 上看到图标为「?」的按键并且可以使用了。
创建输入特殊符号「☑」的 Keyboard Key
如上所述,Extended Keyboard 不仅可以运行 Actions,还可以输入特定字符。这就是本文对于快速输入特殊符号的解决方案。
创建步骤如下:
- 因为这个键是输入「☑︎」这个符号,所以这里选择「Text」。
- 「Label」可以设置为「☑」或者是 Emoji「☑️」。
- 「Output」是指这个按键会输出的内容,所以填入「☑」。
- 保存后就可以在 Extended Keyboard 上使用了。
特殊符号「☑」也可以通过 TextExpander 或者文本替换进行输入,具体可以搜索相关教程。
至此,Drafts 的配置就完成了。进行搜索操作,先需要输入搜索内容和搜索引擎,然后点击扩展键盘上的「?」就可以快速跳转到 Ai Search 中进行搜索。
小结
综上,现在已经可以利用 Drafts 实现 搜索内容 + 搜索引擎关键字
的方法来进行类 Alfred 的搜索体验了。另外,大家可以自己添加一个 URL Scheme 的搜索引擎,感受一下跳转到第三方 App 中的搜索体验。
一个小技巧:如果输入的是网址而不是关键字,是可以直接在 Ai Search 打开网址的。Ai Search 不止可以搜索还可以直接打开网页。
如果你试了跳转到第三方 App 中进行搜索,会发现,系统先跳到 Ai Search,然后才会跳到第三方 App 中,而首图中,并不会先跳到 Ai Search 就可以跳转到第三方 App 中。这里就涉及一些进阶的设置,如果有兴趣可以继续通过本文进行探索。和进阶方法相比,上述方法修改起来会比较方便,主要修改的地方就是 Ai Search 的搜索库,但会带来跳转的不便和搜索速度的减慢。
接下来的进阶方法将会介绍通过 Ai Search 的标签和默认搜索源设置提高搜索的效率和通过 JavaScript 增加「快捷搜索」的可能。
虽然进阶方法会涉及一些正则表达式和 JavaScript 的知识,但本文会尽量做到在不需要相关知识的前提下,也可以把代码改造成符合自己的需求。
进阶方法一:Ai Search 的标签和默认搜索源
Ai Search 的标签
在上文「Ai Search 的搜索引擎配置」中的名称说到标签相当于搜索引擎的身份标识码,但其实这并不准确,标签和搜索引擎是个多对多的关系,一个搜索引擎可以拥有多个标签,一个标签可以被多个搜索引擎共用。Ai Search 是同时进行多个页面的搜索,例如可以把淘宝和亚马逊的搜索都打上「☑︎Shopping」的标签,这样如果搜索内容包含「☑︎Shopping」就可以同时搜索淘宝和亚马逊,方便比价。
搜索引擎的名称是为了方便整理的存在,而标签则是提高搜索效率的存在。引擎名称可以和标签不一样,我在搜索引擎的名称前加了和标签不一样的特殊符号,如「№ 少数派」。
标签的添加
标签可以在搜索引擎列表中,点击每个搜索引擎的右方按钮进行添加,为了避免前文说到的问题,记得每个标签都加上同一个特殊符号。除此之外,还可以在设置中,选择在首页显示的标签,这样做的好处是,如果你从 Drafts 中搜索一样东西,但忘记输入或者漏输入搜索引擎,就可以在首页重新通过点击来选择搜索引擎,而不用返回 Drafts 中。
为了提高输入效率,添加标签的时候可以不输入搜索引擎的全称,只输入缩写。如 Google 的搜索引擎,用「☑g」这个标签即可。
标签小结
- 给同类搜索引擎共用一个或多个标签,可以同时调用多个搜索引擎进行搜索
- 给搜索引擎添加一个容易记忆的缩写标签,提高输入效率
Ai Search 的默认搜索源
在搜索引擎源列表中,可以通过点按来设定默认搜索源,默认搜索源的作用就是如果搜索的时候没有选择搜索源,就默认在该搜索源中搜索。如图,选中的搜索源左边竖条会变成红色,我的默认搜索引擎是 Google。因此,如果在 Drafts 中没有输入任一搜索引擎关键字,就会自动去 Google 进行搜索。另外,默认搜索源可以设置为一个或者多个。
进阶方法二:用 JavaScript 改造「快捷搜索」
这个方法不仅仅解决了在其它应用内搜索需要先跳转到 Ai Search 的问题,还给「快捷搜索」的搜索键带来更多的功能,如返回主屏、删除当前 Draft 和添加 Fantastical 事件等。学会这方法还可以自行扩充其功能,接下来我会详细解释具体的实现思路和修改方法。
为了方便理解和快速体验效果,这里提供了 Action 的添加链接。打开后按「Install」添加即可。这个 Action 包含了两个功能组合:「☑︎a」和「☑︎tb」,分别对应的是 App Store 搜索和淘宝 App 搜索。因为这个 Action 可以比「快捷搜索」功能更多,为了区分就叫「神奇搜索」。
主要思路
这方法的思路主要是,判断在 Drafts Action 的记录中是否存在「☑︎+一个或者两个字母」的功能组合,如果有,就跳转到相应的 App 中进行搜索,如果没有,跳转到 Ai Search 中搜索。也就是说,这方法把第三方 App 跳转和网站搜索这两种搜索方式分开处理,Drafts 负责处理 App 的跳转,Ai Search 负责处理网站搜索。
「☑︎+一个或者两个字母」功能组合的用途解释:
- 该组合可以代表是某些 App 的缩写,例如,「☑︎1p」代表 1Password 这个 App。
- 该组合不可以使用多个,因为系统限制,所以如果使用了多个跳转到 App 的组合,只能跳转到其中一个 App 中。
- 该组合可以在搜索内容的开头或者末尾出现,如果同时出现,就只认末尾出现的组合,开头的组合将会从搜索关键字中删除。
只要「☑︎+一个或者两个字母」功能组合和 Ai Search 中的引擎标签不一致,就不会影响 Ai Search 中引擎的调用。
接下来就是创建判断这种功能组合的 Drafts Action。
创建 Drafts Action:「神奇搜索」
- 和之前一样,先创建一个 Cliboard Step,但这一步变成必要了,因为之后的 JavaScript 是通过获取 Clipboard 来完成的,我试过获取 Drafts 内容,但没成功,有人试成功了可以讨论一下。
- 创建一个 Script Step,在 Script 那一步填写下面提供的代码。如果你按照本文的流程来创建,直接复制粘贴代码即可使用搜索 App Store 和淘宝的功能。
- 创建一个 URL Step,和之前不同,这里需要填写的是
[[uri]]{{[[clipboard]]}}
,不勾选「URL encode tag output」。因为不勾选,所以要加上{{}}
套住[[clipboard]]
,这有 encode 的效果。为什么这样做,我也不清楚,勾选过后会出现错误,所以就直接用{{}}
。[[uri]]
这是在第二步代码中定义的。注意一下,这里填写的是 uri 不是 url。 - 「After Success」的操作选择「Trash」。
创建 Drafts Action 后,根据之前提到的方法,创建一个 Extended Keyboard Key。这样「神奇搜索」就完成了。
JavaScript 代码
本文就不解释全部代码了,但会重点标注要注意的地方,基本修改那些地方就可以正常使用了。
代码如下,欢迎指正优化:
var keyword = getClipboard();
var appkey = keyword.match(/\s*☑︎\b\w\w?\s*$|^\s*☑︎\w\w?\b\s*/igm); //1⃣
var i;
switch (true) {
case /\s*☑︎\b\w\w?\s*$|^\s*☑︎\w\w?\b\s*/igm.test(keyword): //2⃣
for (i = (appkey.length - 1); i > -1; i--) {
//3⃣把涉及的组合缩写在这里罗列
if (appkey[i].match(/\ba\b|\btb\b/im)) {
appkey = appkey[i];
}
else {
appkey[i] = null;
}
}
keyword = keyword.replace(appkey, "");
//4⃣以下分界线内就是赋予组合功能的地方
switch (true) {
/*--------------- ?分界线 ---------------*/
//App Store ☑︎a
case /\ba\b/im.test(appkey):
draft.defineTag("uri", "itms-apps://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/search?media=software&term=");
keyword = keyword.replace(/\s*☑︎\b\w\w?\b\s*/igm, "");
break;
//Taobao ☑︎tb
case /\btb\b/im.test(appkey):
draft.defineTag("uri", "taobao://s.taobao.com/?q=");
keyword = keyword.replace(/\s*☑︎\b\w\w?\b\s*/igm, "");
break;
/*--------------- ?分界线 ---------------*/
default:
draft.defineTag("uri", "aisearch://command?q=");
}
break;
default:
draft.defineTag("uri", "aisearch://command?q=");
}
setClipboard(keyword);
代码修改方法
- 如果你使用的是和本文不一样的特殊符号,本文为「☑︎」,你就需要搜索替换代码中所有「☑︎」符号。1⃣2⃣4⃣ 就是需要替换的地方。
- 3⃣是把罗列所有用到的功能组合的地方,主要修改部分为图中高亮处,也就是
\ba\b|\btb\b
。这里可以把这行代码拆分理解:
\b
+功能关键字
+\b
是一个整体,这个整体是用|
来进行连接。(为了方便理解,下文会把这整体称作关键字模块)例如,我需要的第一个功能组合是「☑︎a」(App Store),第一个关键字模块就是
\ba\b
,这里不需要包含特殊符号「☑︎」,然后第二个功能组合是「☑︎tb」(淘宝),那么第二个关键字模块就是\btb\b
,最后用|
来进行连接这两个模块,就形成了代码中的\ba\b|\btb\b
。以此类推,加上第三个功能组合「☑︎1p」(1Password)就是\ba\b|\btb\b|\b1p\b
。这其实是一行正则表达式,
\b
代表的是单词的开始或结束
,|
代表的是或者
。 - 4⃣以下分界线内就是赋予组合功能的地方。如图每一个
case
和break
之间都是一个代码模块,通过添加修改这个代码模块就可以添加和修改功能。每个代码模块需要在两条 /--------------- ?分界线 ---------------/ 之间添加。//注释 case /第二步的关键字模块/im.test(appkey): draft.defineTag("uri", "这里填写 URL Schemes"); keyword = keyword.replace(/\s*☑︎\b\w\w?\b\s*/igm, ""); break;
在 Drafts Action 中用到的
uri
模块就是在这里定义的,uri
相当于,填写的 URL Schemes。例如,我要创建一个新的代码模块,该功能的主要信息如下:
主要功能 功能关键字 URL Scheme 搜索 1Password 中内容 ☑︎1p onepassword://search/ 根据上面信息,创建的代码模块为:
//搜索 1Password 中内容 ☑︎1p case /\b1p\b/im.test(appkey): draft.defineTag("uri", "onepassword://search/"); keyword = keyword.replace(/\s*☑︎\b\w\w?\b\s*/igm, ""); break;
「神奇搜索」小结
至此,你就可以通过修改代码增加删除功能,让「神奇搜索」更加符合你的需求。本文只讨论「☑︎+一个或者两个字母」的功能组合,如果你需要「☑︎+多个字母」的功能组合,就需要修改代码了。
用 Drafts 而不是 Ai Search 作为搜索入口的好处,不仅仅是可以快速输入特殊符号,Drafts 迅速的启动速度和强大的输入功能可以带来搜索的快捷,如支持 TextExpander 可以快速输入特定短语,Extended Keyboard 的功能可以帮助你进行快速粘贴和移动光标。
先把脑海中想到的东西记录下来,再决定下一步的操作是我偏好的使用体验。使用本文方法,手指可以在键盘区域就完成搜索操作,而不需要去其它地方寻找特定功能,这种行云流水的感觉希望你会喜欢。
文章的最后我会提供一些「神奇搜索」的功能案例,供大家参考。
四个「神奇搜索」的功能案例
下面每个功能都会提供相应的信息,建立代码模块后,添加到原代码中即可增加功能,章节末尾会附带所有功能的 Drafts Action 下载链接。
- 这里使用了 Launcher 的 URL Scheme 来实现主屏的效果。Launcher 经过多次更新后,不再需要把自己弄崩溃来返回主屏了,新的方法会自带优雅的返回动画。
主要功能 功能关键字 URL Scheme 返回主屏 ☑︎h launcher://homescreen - 利用「After Success」机制删除当前编写内容。因为 Drafts 的 Action 运行后会有一个「After Success」的操作,「神奇搜索」的「After Success」操作是「Trash」,所以原理就是运行一次这个 Action,编写内容就会被删除了。
主要功能 功能关键字 URL Scheme 删除当前编写内容 ☑︎x drafts4:// - 快速生成 Fantastical 事件。正如前文说到,「神奇搜索」可以承载更多的功能,搜索内容其实就是传递到 App 中的内容,所以我们可以通过 App 的 URL Schemes 做很多事情。
主要功能 功能关键字 URL Scheme 在 Fantastical 中创建事件并返回 Home Screen ☑︎fa fantastical2://x-callback-url/parse?add=1&x-success=launcher%3A%2F%2Fhomescreen&sentence= - 利用 墨客 发微博,这里会给出一个使用多个关键字的功能模块案例。
主要功能 功能关键字 URL Scheme 利用墨客发微博 ☑︎mk 或 ☑︎w moke:///post?text= 代码模块:
//利用墨客发微博 ☑︎mk 或 ☑︎w case /\bmk\b|\bw\b/im.test(appkey): draft.defineTag("uri", "moke:///post?text="); keyword = keyword.replace(/\s*☑︎\b\w\w?\b\s*/igm, ""); break;
这里就用到之前提到的正则表达式中的「或」
|
来连接两个关键字。
最后,附带关于以上四个功能模块和之前功能的 Drafts Action,这个 Action 还附带了一个快速增加 Fantastical 待办事项的功能,提供另外一种可能供参考。这功能并不是通过判断「☑︎+一个或者两个字母」功能组合来完成的,而是判断开头是否存在「reminder」的字样,如果有,就会使用 Fantastical 的 URL Scheme,不想要这功能只需将带有「reminder」的「case」删掉即可。
结语
文章「小结」前的方法其实已经可以满足大部分需求了,打开网址、网页搜索和应用搜索都可以通过一个 Action 完成。进阶方法则拓展了这个 Action 的可能,在一定程度上可以减少 Drafts 中 Actions 和 Extended Keyboard Keys 的数量。
个人觉得这种类 Alfred 的搜索体验在 iOS 上表现得很优秀,Ai Search 的多网页同时搜索极大地提高了查找资料的效率。还有比 Alfred 好的地方是并不需要在意搜索关键字的位置,可以出现在开头或者结尾。相信大家都会有忘记自己要搜什么的经历,因此我个人偏向于先输入自己想要搜索的内容,再决定怎么处理这内容。希望你会喜欢这种搜索体验并创造更多的可能,如果对文中方法有什么意见欢迎提出交流。
最后两个小技巧
-
推荐一个搜索引擎
网站名称 作用 fnd.io 第三方搜索 App Store、iTunes Store 和 iBook Store 内容的引擎,可以搜索不同区的内容 搜索源添加网址:
- 美区:https://fnd.io/#/us/search?mediaType=all&term=*
- 中区:https://fnd.io/#/cn/search?mediaType=all&term=*
我把 fnd.io 搜索中区和美区链接都设置在 Ai Search 里,并且共用一个名为「☑fnd」的标签,只要我输入「Drafts ☑fnd」,Ai Search 就为我同时搜索出 Drafts 这款应用在美区和中区的价格和其它信息。
-
在 Drafts 中,我使用了一个粘贴剪贴板的 Extended Keyboard Key,因为用到 JavaScript,所以直接使用了别人做的「Paste」。Drafts 提供了一个平台包含了很多有用的 Actions 和 Keys,可以浏览 http://drafts4-actions.agiletortoise.com 进行搜索查找。