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. 本文中给出的例子只是简单的使用,有更高级的需求可以自己写。
相关推荐
热河暖男3 小时前
【实战解决方案】Spring Boot+Redisson构建高并发Excel导出服务,彻底解决系统阻塞难题
spring boot·后端·excel
水银嘻嘻5 小时前
12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建
运维·前端·自动化
小嘟嚷ovo5 小时前
h5,原生html,echarts关系网实现
前端·html·echarts
十一吖i6 小时前
Vue3项目使用ElDrawer后select方法不生效
前端
只可远观6 小时前
Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
前端·flutter
周胡杰6 小时前
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
前端·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
敲代码的小吉米6 小时前
前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)
前端·javascript·pdf·状态模式
是千千千熠啊6 小时前
vue使用Fabric和pdfjs完成合同签章及批注
前端·vue.js
九月TTS7 小时前
TTS-Web-Vue系列:组件逻辑分离与模块化重构
前端·vue.js·重构
我是大头鸟7 小时前
SpringMVC 内容协商处理
前端