一 工作流是什么
- alfred是什么?我想说,都用上mac了,应该都有了解,这里就不详细介绍。
- 工作流(Workflow)是一种自定义的自动化方式,用于执行一系列操作来完成特定的任务或流程。工作流可以由多个操作步骤组成,这些步骤可以是系统命令、脚本、应用程序的操作等。
- 简单来说就是你传入一些参数,然后可以返回你需要的结果
- 官网介绍传送门-》 www.alfredapp.com/help/workfl...
- 在alfred的官网上,有很多开源的工作流,如果有喜欢的,可以自己去下载安装使用。当然如果不满足自己使用条件的,也可以通过自己定义一段脚本去执行。
二 前置说明
- 要自定义工作流,必须选定一种语言。alfred上默认支持一些语言,不支持的,也可以通过外部引用脚本运行。
- 网上有很多自定义的示例,多数都是基于python写的。这次示例使用groovy来写。
三 下载
- 要使用groovy来写,本地必须先安装groovy的包。
- 直接使用命令 brew install groovy 安装
- 在官网下载zip包,解压即可。官网传送门-》groovy.apache.org/download.ht...
- 下载完成后,配置环境变量
- 在终端使用命令打开配置文件:Vim ~/.zshrc 。注意:是zshrc 而不是 bash_profile
- 为什么不是bash_profile?Mac默认使用 zsh 作为 shell,所以 ~/.zshrc 中的配置会对所有终端生效,bash_profile 中的配置仅对登录 bash 会话生效,非登录会话不会加载它。
- 如果你使用bash_profile配置,那么每次终端打开输入版本或其他,都会提示你没有配置环境变量
四 配置示例
-
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
-
以上配置需要根据自己安装的路径去修改
五 alfred使用示例
- 直接点击下次+号创建
-
旁边有个help,可以跳转官网,官网也有示例
-
点击+后,选择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()
}
}
七 测试
- 点击alfred工作流中的右上角有个小虫子(debug)的弹窗,可以自行测试写的代码是否有误。
八 总结:
- 配置环境变量时要注意,否则alfred会提示环境错误,读取不到值
- 传参的格式可以自己自定义,不限于只传now
- 如果不想配置环境变量,需要同时引入jdk的路径才能正常使用。
- 本文中给出的例子只是简单的使用,有更高级的需求可以自己写。