在Mac上,Alfred这类启动器不只是快速打开应用,配合Powerpack的工作流能力,可以把重复性文件生成操作压缩成几条键盘输入。比如创建一个带基础CSS的HTML5文件,常规做法是打开编辑器、新建文件、保存为.html、再粘贴骨架和样式,步骤不少。借助Alfred工作流,只要唤起输入框、敲入关键词和文件名,就能在目标目录生成结构完整的页面。接下来围绕这一需求,从脚本编写到工作流配置逐一说明。

准备工作:Alfred Powerpack与新建工作流
要使用工作流功能,必须先安装Alfred并解锁Powerpack。免费版只提供基础搜索和应用启动,工作流属于付费扩展能力。装好之后打开Alfred偏好设置,进入Workflows面板,点击左下角加号,选择Blank Workflow新建一个空白工作流,填写名称即可。
工作流的基本单位是节点,由一个触发器、若干动作和可选输出组成。生成HTML5页面这个任务里,触发器可以使用Keyword Input,动作使用Run Script。Alfred支持把用户输入作为参数传给脚本,脚本执行后可以输出通知。先不用急着配置节点,建议先在终端里把脚本跑通,再把脚本嵌入工作流,这样排查问题更直接。
Run Script节点支持多种语言,包括/bin/bash、/bin/zsh、/usr/bin/osascript等。对HTML生成这种文件操作,Bash配合Heredoc是最直观的选择。如果你更熟悉Python或Node,也可以选择对应语言,但需要额外确认环境路径。考虑到macOS系统自带Bash与AppleScript,本文示例保持零依赖。
核心脚本:用Bash生成HTML5骨架和内嵌CSS
脚本需要完成三件事:接收文件名参数、补齐.html扩展名、把HTML模板写入目标目录。Alfred传入的参数可以直接用{query}表示,也可以设置成argv方式。下面这段脚本使用{query}读取文件名,并处理默认名称与扩展名。模板中放了CSS变量、简单重置样式和一个居中的内容容器,方便生成后直接开始编辑。
#!/bin/bash
# 读取Alfred传入的文件名
fileName="{query}"
fileName=$(echo "$fileName" | xargs)
if [ -z "$fileName" ]; then
fileName="index"
fi
case "$fileName" in
*.html) ;;
*) fileName="${fileName}.html" ;;
esac
targetDir="$HOME/Desktop"
filePath="$targetDir/$fileName"
cat > "$filePath" <<EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${fileName%.html}</title>
<style>
:root {
--bg: #f6f8fa;
--text: #1f2328;
--primary: #0969da;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
padding: 2rem;
}
.container {
max-width: 960px;
margin: 0 auto;
background: #fff;
border-radius: 12px;
padding: 2rem;
box-shadow: 0 8px 24px rgba(0,0,0,0.08);
}
h1 { color: var(--primary); margin-bottom: 1rem; }
a { color: var(--primary); }
</style>
</head>
<body>
<div class="container">
<h1>${fileName%.html}</h1>
<p>这是一个由Alfred工作流生成的HTML5页面,内嵌CSS已准备好。</p>
</div>
</body>
</html>
EOF
echo "已创建:$filePath"
这个脚本里,xargs用来去掉首尾空格,case判断负责自动补上.html后缀。如果用户输入的名字已经包含.html则保持不变,否则追加。目标目录可以先固定为桌面,后面再改成动态获取Finder路径。生成完成后用echo输出文件路径,Alfred可以把这个结果显示在通知中心。
需要注意Heredoc里包含大量HTML尖括号,在终端中执行没问题;嵌入到Alfred的Run Script节点时也无需特殊转义,但在本文的网页展示中这些尖括号被转义成了<和>。实际复制时按代码原样使用即可。
接入Alfred:关键词触发、参数传递与目录选择
回到Alfred工作流,添加一个Keyword Input节点。关键词可以设置成html5,标题写新建HTML5页面。参数这里选择Required Argument,意思是必须输入一个参数,否则触发后不会执行后续节点。参数类型保持文本即可。这样在Alfred输入框里敲html5 about,about就会作为文件名传入脚本。
接着添加Run Script节点,语言选/bin/bash,脚本内容粘贴上面整理好的代码。在输入方式上,如果希望使用{query}直接读取参数,就保持默认的with input as query。如果脚本改成读取argv,可以在节点中切换为with input as argv,并在脚本中用$1接收。两种方式没有本质区别,但建议优先使用argv,因为参数里如果包含特殊字符,它能减少转义问题。
目录选择方面,固定桌面适合快速演示,但实际使用更希望文件生成在当前Finder窗口。可以借助AppleScript获取Finder当前路径。在Bash脚本开头加入下面这行,把目标目录替换成Finder的插入位置:
targetDir=$(osascript -e 'tell application "Finder" to get POSIX path of (insertion location as alias)' 2>/dev/null) [ -z "$targetDir" ] && targetDir="$HOME/Desktop"
如果Finder没有返回有效路径,比如没有打开任何窗口,就会回退到桌面。这样工作流的体验更接近“在哪打开就生成到哪”。之后filePath="$targetDir/$fileName"不用改动。脚本执行完后,可以用Alfred的Post Notification节点显示创建成功,也可以在脚本里直接输出结果并通过Large Type展示。
扩展思路:模板参数、外部CSS与多文件生成
上面的实现已经能满足基础需求,但如果经常做不同风格的页面,只生成固定CSS会有点局限。一个简单做法是通过Alfred的可选参数或环境变量,让文件名后面带模板类型。例如输入html5 blog时,脚本识别第二个参数blog并选择博客模板。Alfred的Keyword节点可以设置Argument Optional,但如果需要更多结构化输入,使用List Filter会更直观。
另一个方向是生成独立的CSS文件,而不是全部内嵌在style标签里。脚本里可以先创建目录,再输出index.html和style.css两个文件。HTML文件中通过<link rel="stylesheet" href="style.css">引入。这样后续维护样式更方便,也符合真正项目的组织方式。脚本代码需要拆分成两次cat写入,第一段写HTML,第二段写CSS。
如果对CSS预处理有需求,还可以把脚本扩展成自动执行Sass编译,但那样需要本机安装sass命令。或者用Python生成更动态的内容,比如根据日期、时间或剪贴板内容填充标题。关键在于Alfred的Run Script节点只负责调度,真正的生成逻辑完全可以按自己的习惯替换,不必局限于Bash。
常见问题与调试技巧
配置过程中最容易遇到的是脚本没有执行或文件没生成。先检查Alfred工作流右上角的Debug按钮,它会打印每个节点的输入输出,尤其能看到脚本报错。其次确认Run Script节点的语言选择正确,Bash脚本必须放在/bin/bash,而不是其他解释器。文件路径包含空格时,要确保引用变量时用双引号包住,比如"$filePath",否则写入会失败。
如果Alfred传递的参数为空,可能是Keyword Input节点没有设置Required Argument,或者触发时只输入了关键词而没带文件名。另一个隐藏问题是权限:如果目标目录需要管理员权限,脚本会静默失败。可以先在终端里用同样命令手动执行一遍,能很快定位是脚本本身问题还是Alfred调用环境问题。
最后,保持工作流可维护性。随着脚本变长,建议把生成逻辑单独保存成脚本文件,比如放在工作流目录下,Run Script节点只写调用命令bash generate.sh "$1"。这样修改脚本时不必在Alfred的小文本框里来回复制,也方便纳入版本控制。