Alfred实现快速打开项目

May 10, 2020

问题

我会把所有的web项目都放在一个dev目录下,编辑代码有时候会用vscode,有时候会用webstorm。这就带来个问题,每次启动的时候,要么是从编辑器的最近文件中启动,要么是从终端快速启动,但是感觉都不太快捷。而且有时候还要找一下才能找到。刚好最近买了个正版Alfred,来试试用Alfred启动项目。

实现效果

想实现的效果是这样的:

  1. 输入code + 文件名,可以过滤出包含文件名的项目目录。
  2. 选择项目之后,会再让用户选择使用vscode还是webStorm打开。

两个步骤的示意图如下:

image-20200510225015418

image-20200510225037864

实现方式

1. 读取目录下文件并且响应过滤

按理说Aflred也有文件过滤的功能,但是发现没有对指定目录过滤的,只能自己实现了。其实实现也比较简单,看到有个Alfred的python库。还比较方便的,帮忙处理了一些逻辑。所以就用python来写吧。

从Alfred的文档里可以看出,过滤的实现原理是,脚本响应用户输入的字符,然后返回json格式的内容供Alfred展示。

使用了上面提到的python库,拼接json字符串的工作,就可以省略了。如下,最后调用send_feedback就可以把选项提交给Alfred了。

# 获取文件列表
def getFileList():
   path = wf.args[1]
   log.debug('path: ' + path)
   path = expanduser(path)
   return [f for f in listdir(path) if isdir(join(path, f))]

def main(wf):
    # 获取搜索参数
    searchKey = wf.args[0]
    log.debug('searchKey: ' + searchKey)
    # 文件列表缓存3s
    fileList = wf.cached_data('projects', getFileList, max_age=3)
    # 根据query过滤目录
    for x in fileList:
        if (searchKey and (searchKey in x)):
            wf.add_item(title=x, arg=x, valid=True);
    
    # 把应该展示的内容发送给Alfred
    wf.send_feedback()

这个脚本有两个参数,一个是query一个是项目目录。

image-20200510234834961

path是这个项目设置的全局变量,点击右上角的图标设置的,使用前需要修改成自己的项目目录:

image-20200510234937480

2. 参数转换

刚才的脚本执行之后,可以获得想要打开的目录路径,使用Arg and Vars把得到的query转换成filename给后面的流程使用。

image-20200510235308049

3. 选择打开方式

通过Alfred的List Filter来提供两个选项,是使用webstorm还是使用vscode。

image-20200510235534651

4. 判断并启动

分别使用ConditionalOpen File

image-20200510235612585

image-20200510235649619

整体图:

image-20200511000149645

Git地址

下载地址

这里可以根据自己的需求修改编辑器,如果只需要一个编辑器,可以把listFilter和条件判断直接去掉了。

本文首发于 一粟(https://www.zeyio.com),欢迎转载,但是必须保留本文的署名和链接。

本文永久链接:https://www.zeyio.com/alfred-tool/