这篇文章主要探讨的是一种结合 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 的搜索引擎配置

自定义搜索引擎

Ai Search 不仅内置了多种多样的搜索引擎,而且还允许用户添加自定义搜索引擎。添加方法隐藏得比较深,需要在「搜索引擎推荐」的页面中,长按左上角的回形针图标,在弹出的对话框中输入搜索引擎名称和网页地址即可完成添加。名称和网址的添加方法接下来会详细解释,并且根据下面提到的内容,你会很快建立一个少数派的搜索引擎。

关于名称

这里的建议是命名时,为每个名称都加上一个特殊符号。以少数派的搜索为例,引擎命名为「☑︎sspai」(本文将在此命名方法的基础上进行讲解)。这个命名是为了避免某些使用场景的不便。因为 Ai Search 有一个缺点(在快捷搜索这方面上是优点),如果搜索内容包含搜索标签,它就启动相应的搜索。

例如,假设有一个标签名为「Google」的搜索引擎,在 Ai Search 中输入「Google Trees」,就是在 Google 中搜索「Trees」。问题在于,如果输入的内容是「Google Google 和 Amazon 的不同」,得到的结果就是在 Google 中搜索了「和 Amazon 的不同」,所有「Google」字样都被省略了。如果碰巧你有一个标签名为「Amazon」的搜索引擎,那么 Ai Search 就会同时启用这两个搜索引擎,搜索的内容是「和 的不同」。这缺点在搜索英文内容或者关键词的时候表现得更为不便。

特殊符号的快速输入方法会在 Drafts 的配置中提到。

命名的时候要注意的是:

  1. 特殊符号和名称之前最好不要有空格。

    在新建搜索引擎的时候,会附带为这引擎新建一个同名标签,如果添加空格会增加搜索的不便。标签在本文方法中占据了很重要的作用,标签就相当于搜索引擎的身份识别码,也就相当于 Alfred 中的搜索引擎关键字。

    名称和标签的作用其实不一样,为了方便理解,这里把名称和标签设置为同名(默认生成),标签的添加和优点将会在文末进阶章节说明,只要存在一个标签,就不会影响本文方法的构建。

  2. 特殊符号不能是 Emoji,因为这会导致备份失败,曾向开发者反馈,还没修复。
  3. 名称最好是英文,方便输入。

关于 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= + 搜索内容 + 搜索源标签

具体创建步骤:

  1. 在 Drafts 中打开右边抽屉,然后点击右上角「+」选择 Create Action。
  2. 命名,名字随意,我的命名是「快捷搜索」。
  3. 点击 Steps。
  4. 先选择一个 Cliboard Step,这是把 Drafts 里输入的内容保存到 Cliboard 中,这一步非必要,但是可以防止误点这个 Action 后,把内容删掉的悲剧。
  5. 关键点,选择 URL Step,填入 aisearch://command?q=,然后在键盘上方一行快捷输入中选择「clipboard」就行了(如果没有使用第五步,就选择「draft」)。勾选「URL encode tag output」。
  6. 保存后返回上一层 Action 页面,滑动到最下方定义「After Success」的操作,这操作的意义在于整个动作完成后,Drafts 会按照你的方式处理内容。这里我选择的是「Trash」,把内容扔到 Trash 中,这样 Drafts 里面就可以保持干净整洁了。

创建运行 Action 的 Keyboard Key

使用 Drafts 并且开启 Extended Keyboard 是一个很不错的使用体验,可以做到快速输入 Markdown 格式、运行 Actions、使用剪贴板和输入特定字符等等。

这里,需要创建一个 Keyboard Key 运行刚刚新建的 Action「快捷搜索」。

创建步骤如下:

  1. 在 Extended Keyboard 最右边选择「笔」的图标,然后点击「+」新建。
  2. 因为这个键是运行「快捷搜索」这个 Action,所以这里选择「Run Action」。
  3. 「Action Name」中点击「+」选择自己刚刚新建的 Action 就可以了。也可以通过输入 Action 名字来选择,输入的名字必须和 Action 的名字一模一样。
  4. 「Label」可以理解为在扩展键盘中显示的图标,这里我用了一个「?」的 Emoji,使用 Emoji 的优点在于直观和节省空间。
  5. 「Keyboard Shortcut」可以根据自己需要为设备的外接键盘添加快捷键。
  6. 保存后就可以在 Extended Keyboard 上看到图标为「?」的按键并且可以使用了。

创建输入特殊符号「☑」的 Keyboard Key

如上所述,Extended Keyboard 不仅可以运行 Actions,还可以输入特定字符。这就是本文对于快速输入特殊符号的解决方案。

创建步骤如下:

  1. 因为这个键是输入「☑︎」这个符号,所以这里选择「Text」。
  2. 「Label」可以设置为「☑」或者是 Emoji「☑️」。
  3. 「Output」是指这个按键会输出的内容,所以填入「☑」。
  4. 保存后就可以在 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」这个标签即可。

标签小结

  1. 给同类搜索引擎共用一个或多个标签,可以同时调用多个搜索引擎进行搜索
  2. 给搜索引擎添加一个容易记忆的缩写标签,提高输入效率

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 负责处理网站搜索。

「☑︎+一个或者两个字母」功能组合的用途解释:

  1. 该组合可以代表是某些 App 的缩写,例如,「☑︎1p」代表 1Password 这个 App。
  2. 该组合不可以使用多个,因为系统限制,所以如果使用了多个跳转到 App 的组合,只能跳转到其中一个 App 中。
  3. 该组合可以在搜索内容的开头或者末尾出现,如果同时出现,就只认末尾出现的组合,开头的组合将会从搜索关键字中删除。

只要「☑︎+一个或者两个字母」功能组合和 Ai Search 中的引擎标签不一致,就不会影响 Ai Search 中引擎的调用。

接下来就是创建判断这种功能组合的 Drafts Action。

创建 Drafts Action:「神奇搜索」

  1. 和之前一样,先创建一个 Cliboard Step,但这一步变成必要了,因为之后的 JavaScript 是通过获取 Clipboard 来完成的,我试过获取 Drafts 内容,但没成功,有人试成功了可以讨论一下。
  2. 创建一个 Script Step,在 Script 那一步填写下面提供的代码。如果你按照本文的流程来创建,直接复制粘贴代码即可使用搜索 App Store 和淘宝的功能。

  3. 创建一个 URL Step,和之前不同,这里需要填写的是 [[uri]]{{[[clipboard]]}},不勾选「URL encode tag output」。因为不勾选,所以要加上 {{}} 套住 [[clipboard]] ,这有 encode 的效果。为什么这样做,我也不清楚,勾选过后会出现错误,所以就直接用 {{}}[[uri]] 这是在第二步代码中定义的。注意一下,这里填写的是 uri 不是 url。

  4. 「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. 如果你使用的是和本文不一样的特殊符号,本文为「☑︎」,你就需要搜索替换代码中所有「☑︎」符号。1⃣2⃣4⃣ 就是需要替换的地方。
  2. 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 代表的是 单词的开始或结束| 代表的是 或者

  3. 4⃣以下分界线内就是赋予组合功能的地方。如图每一个 casebreak 之间都是一个代码模块,通过添加修改这个代码模块就可以添加和修改功能。每个代码模块需要在两条 /--------------- ?分界线 ---------------/ 之间添加。
    //注释
    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 下载链接。

  1. 这里使用了 Launcher 的 URL Scheme 来实现主屏的效果。Launcher 经过多次更新后,不再需要把自己弄崩溃来返回主屏了,新的方法会自带优雅的返回动画。
    主要功能功能关键字URL Scheme
    返回主屏 ☑︎h launcher://homescreen
  2. 利用「After Success」机制删除当前编写内容。因为 Drafts 的 Action 运行后会有一个「After Success」的操作,「神奇搜索」的「After Success」操作是「Trash」,所以原理就是运行一次这个 Action,编写内容就会被删除了。
    主要功能功能关键字URL Scheme
    删除当前编写内容 ☑︎x drafts4://
  3. 快速生成 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=
  4. 利用 墨客 发微博,这里会给出一个使用多个关键字的功能模块案例。
    主要功能功能关键字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 好的地方是并不需要在意搜索关键字的位置,可以出现在开头或者结尾。相信大家都会有忘记自己要搜什么的经历,因此我个人偏向于先输入自己想要搜索的内容,再决定怎么处理这内容。希望你会喜欢这种搜索体验并创造更多的可能,如果对文中方法有什么意见欢迎提出交流。

最后两个小技巧

  1. 推荐一个搜索引擎

    网站名称作用
    fnd.io 第三方搜索 App Store、iTunes Store 和 iBook Store 内容的引擎,可以搜索不同区的内容

    搜索源添加网址:

    我把 fnd.io 搜索中区和美区链接都设置在 Ai Search 里,并且共用一个名为「☑fnd」的标签,只要我输入「Drafts ☑fnd」,Ai Search 就为我同时搜索出 Drafts 这款应用在美区和中区的价格和其它信息。

  2. 在 Drafts 中,我使用了一个粘贴剪贴板的 Extended Keyboard Key,因为用到 JavaScript,所以直接使用了别人做的「Paste」。Drafts 提供了一个平台包含了很多有用的 Actions 和 Keys,可以浏览 http://drafts4-actions.agiletortoise.com 进行搜索查找。