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= <math xmlns="http://www.w3.org/1998/Math/MathML"> G R O O V Y H O M E / b i n : GROOVY_HOME/bin: </math>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. 本文中给出的例子只是简单的使用,有更高级的需求可以自己写。
相关推荐
tERS ERTS12 小时前
头歌答案--爬虫实战
java·前端·爬虫
byterun12 小时前
LangChain4j 完整学习指南:从入门到企业级应用实战,看完这一篇你就是AI应用开发工程师
后端
当时只道寻常13 小时前
Vue3 集成 NProgress 进度条:从入门到精通
前端·vue.js
kyriewen13 小时前
React性能优化:从“卡成狗”到“丝般顺滑”的5个秘诀
前端·react.js·性能优化
米丘13 小时前
Vue 3.x 单文件组件(SFC)模板编译过程解析
前端·vue.js·编译原理
helloweilei13 小时前
Web Streams 简介
前端·javascript
悟空瞎说13 小时前
Flutter热更新 Shorebird CodePush 原理、实现细节及费用说明
前端·flutter
didadida26213 小时前
从“不存在”的重复请求,聊到 Web 存储的深坑
前端
掘金者阿豪13 小时前
为什么 LINUX DO 突然这么火?一个程序员拆解背后的5个互联网逻辑
后端