01 引言
作为一名 javaer, 日常开发自然是离不开 IDEA, 经常需要打开不同项目的代码, 每次在 IDEA 里面选择项目自然是十分麻烦, 再加上有使用 Alfred 的习惯, 于是自己搞了一个简单的 Workflow 来实现快速打开 IDEA 项目, 实际效果如下图, 使用上下方向键选择, 按回车即可使用 IDEA 打开

02 准备工作
2.1 环境
macOS 14.5
2.2 JetBrains Toolbox
一个 JetBrains 官方的 APP, 提供了很多方便的管理 JetBrains 系列 IDE 的功能, 例如不需要去下载安装包直接在 APP 内安装 IDE, 版本升级/回退, 使用起来非常方便, 强力推荐. 这里需要使用到 toolbox 的一个功能是生成一个用于启动 IDEA 的脚本, 按照下面的步骤生成即可


2.3 Alfred
一个效率工具, 基础功能可以完全替代 macOS 搜索功能, 本文需要用到 Alfred 的付费功能 Workflows, 需要借助自定义的 shell 脚本实现搜索功能
2.4 ugrep
本来用的是 find 命令来做的, 但是想实现一些模糊匹配的效果, 最后改用了 ugrep
macOS 可以直接使用 Homebrew 安装
brew install ugrep
2.5 一个图标(非必需)
搜索出的目录加一个漂亮的图标, 增加仪式感
03 具体步骤
懒得看不想自己拖一个工作流的可以直接下载我导出的,Open-with-IDEA.alfredworkflow, 下载完成后双击导入配置一下环境变量即可
3.1 新建一个空白 Workflow


3.2 配置几个环境变量
为了保留一定的扩展性, 能够分享给其他人使用, 配置一些环境变量
- icon_path 搜索结果目录图标
- idea_shell_path 准备工作中生成的 idea shell 脚本的绝对路径
- workspace_dir 需要搜索的目录的绝对路径, 目前脚本只会检索这个目录-1层级的目录


3.3 拖拽构建自己的工作流
- 添加一个 Script Filter, 并配置触发的关键词, placeholder...
- 编写 shell 脚本, 这是最关键的步骤, 脚本的作用是检索目录并按照 Alfred 的要求生成输出 json 格式的结果
- 添加一个 Run Script, 接收上一部传过来的项目目录, 调用 idea shell 打开
- 最后别忘记把两个组件连起来


bash
key_word=$1
icon_path=$icon_path
items=""
for dir in $workspace_dir
do
for f in $(ls -l "$dir" | awk '/^d/ {print $9}' | ug -i -Z1 "$key_word")
do
# 修复路径拼接:如果 $dir 末尾没有 /,则自动补上
if [[ "$dir" != */ ]]; then
abs_path="$dir/$f"
else
abs_path="$dir$f"
fi
item='{"title":"'$f'","subtitle":"'$abs_path'","valid":true,"arg":"'$abs_path'","text":{"copy":"'$abs_path'"},"icon": {"path": "'$icon_path'"}}'
if [ "$items" ]; then
items="$items,"
fi
items="$items$item"
done
done
echo '{"items":['${items}']}'


bash
$idea_shell_path $1

04 其他
目前对我来说足够用, 但是其实还挺简陋的, 大佬可以来优化分享一下
- 只检索了一级目录, 这个是考虑到我所有项目都在一起, 还有就是要快
- 拼接 json 是用字符串硬拼的, 有些特殊字符可能有问题, 使用 jq 可能更好一些, 这个其实也是为了快