5分钟写一个alfred中的workFlow

一 工作流是什么

  1. alfred是什么?我想说,都用上mac了,应该都有了解,这里就不详细介绍。
  2. 工作流(Workflow)是一种自定义的自动化方式,用于执行一系列操作来完成特定的任务或流程。工作流可以由多个操作步骤组成,这些步骤可以是系统命令、脚本、应用程序的操作等。
  3. 简单来说就是你传入一些参数,然后可以返回你需要的结果
  4. 官网介绍传送门-》 www.alfredapp.com/help/workfl...
  5. 在alfred的官网上,有很多开源的工作流,如果有喜欢的,可以自己去下载安装使用。当然如果不满足自己使用条件的,也可以通过自己定义一段脚本去执行。

二 前置说明

  1. 要自定义工作流,必须选定一种语言。alfred上默认支持一些语言,不支持的,也可以通过外部引用脚本运行。
  1. 网上有很多自定义的示例,多数都是基于python写的。这次示例使用groovy来写

三 下载

  1. 要使用groovy来写,本地必须先安装groovy的包。
  1. 下载完成后,配置环境变量
  • 在终端使用命令打开配置文件:Vim ~/.zshrc 。注意:是zshrc 而不是 bash_profile
  • 为什么不是bash_profile?Mac默认使用 zsh 作为 shell,所以 ~/.zshrc 中的配置会对所有终端生效,bash_profile 中的配置仅对登录 bash 会话生效,非登录会话不会加载它。
  • 如果你使用bash_profile配置,那么每次终端打开输入版本或其他,都会提示你没有配置环境变量

四 配置示例

  1. export GROOVY_HOME=/opt/homebrew/opt/groovy/libexec

    export PATH= G R O O V Y H O M E / b i n : GROOVY_HOME/bin: GROOVYHOME/bin:PATH

  2. 以上配置需要根据自己安装的路径去修改

五 alfred使用示例

  1. 直接点击下次+号创建
  1. 旁边有个help,可以跳转官网,官网也有示例

  2. 点击+后,选择Blank Workflow 创建一个空白的工作流

  • 创建时,会出现弹框,根据提示填写即可,我这里直接就填名字。
  • 保存后,点击右键,创建一个脚本文件
  • 里面的具体参数,截图最下面是我的一些配置
  • 上面三个提示,设置后要使用时,是这样的形式
  • 选择项里使用默认即可
  • 然后脚本里需要引入你编写好的脚本文件,以及你用哪个环境运行

示例配置:

js 复制代码
   query=$1
  /opt/homebrew/opt/groovy/libexec/bin/groovy  /Users/shouye/workspace/my/alfred/src/SearchTime.groovy $query

/opt/homebrew/opt/groovy/libexec/bin/groovy 是你安装groovy的地址路径

/Users/shouye/workspace/my/alfred/src/SearchTime.groovy 是你脚本的地址路径

六 代码示例

js 复制代码
//以下是一个时间戳转换示例
class SearchTime {

    static void main(String[] args) {

        if (args.length >= 2) {
            def result;
            def buffer = new StringBuffer();
            result = buffer.append(args[0]).append(" ").append(args[1])
            searchConvertTimeType(result as String)
        }
        String arg = null;
        if (args.length < 2) {
            arg = args[0]

            searchTimeTypeArray(arg)
        }

    }




        def timestamp = args[0].substring(0,args[0].length() - 3) // 指定时间戳
        def localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp as long), ZoneId.systemDefault())
        def formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        def formattedDateTime = localDateTime.format(formatter)
        def output = [
                items: [
                        [
                                title: formattedDateTime,
                                arg  : formattedDateTime
                        ]
                ]
        ]

        print new JsonBuilder(output).toPrettyString()

    }

    /**
     *
     * 根据输入的类型转换时间
     */
    static void searchConvertTimeType(String resultTime) {

        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        def time = LocalDateTime.parse(resultTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
                .atZone(ZoneId.of("Asia/Shanghai"))
                .toInstant()
                .toEpochMilli()

       def output = [
                items: [
                        [
                                title: time,
                                arg  : time
                        ]
                ]
        ]
        print new JsonBuilder(output).toPrettyString()
    }
    /**
     *
     * 查询当前时间列表
     */
    static void searchTimeTypeArray(String arg) {
        def output;
        if ("now" == arg) {
            output = [
                    items: [
                            [
                                    title: System.currentTimeMillis(),
                                    arg  : System.currentTimeMillis()
                            ],
                            [
                                    title: LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).toString(),
                                    arg  : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).toString()
                            ],
                            [
                                    title: LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).toString(),
                                    arg  : LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).toString().toString()
                            ],
                            [
                                    title: LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli(),
                                    arg  : LocalDate.now().atStartOfDay().atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli()
                            ],

                    ]
            ]
        } else {

            def timestamp = arg.substring(0, arg.length() - 3) // 指定时间戳
            def localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp as long), ZoneId.systemDefault())
            def formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
            def formattedDateTime = localDateTime.format(formatter)
            output = [
                    items: [
                            [
                                    title: formattedDateTime,
                                    arg  : formattedDateTime
                            ]
                    ]
            ]

        }
        print new JsonBuilder(output).toPrettyString()
    }

}

七 测试

  1. 点击alfred工作流中的右上角有个小虫子(debug)的弹窗,可以自行测试写的代码是否有误。

八 总结:

  1. 配置环境变量时要注意,否则alfred会提示环境错误,读取不到值
  2. 传参的格式可以自己自定义,不限于只传now
  3. 如果不想配置环境变量,需要同时引入jdk的路径才能正常使用。
  4. 本文中给出的例子只是简单的使用,有更高级的需求可以自己写。
相关推荐
Pedantic1 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘2 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆2 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师3 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
行者全栈架构师3 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
雨季mo浅忆3 小时前
VSCode自动格式化三要素
前端
Chenyiax3 小时前
从一次请求看懂 OkHttp:架构、调度与连接管理
后端
爱勇宝4 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
AskHarries4 小时前
工具失败时怎么办:重试、回滚、人工确认和风险提示
后端·程序员