惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cisco Talos Blog
Cisco Talos Blog
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
J
Java Code Geeks
博客园_首页
Scott Helme
Scott Helme
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
V
Visual Studio Blog
Cloudbric
Cloudbric
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
The Last Watchdog
The Last Watchdog
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
W
WeLiveSecurity
K
Kaspersky official blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hacker News: Ask HN
Hacker News: Ask HN
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
量子位
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 三生石上(FineUI控件)
Recent Commits to openclaw:main
Recent Commits to openclaw:main

HANG ♥ WRITING

ChatGPT 问世两年,我在 AI 的辅助下成为了一名 iOS 业余开发者 如何使用 Netcat 构建简单的安全聊天系统 QuakeSense 震感,一款简洁原生的 iOS 地震通知 App App Store 中国大陆 ICP 备案最佳实践 几款有意思的 Google Chrome 侧边栏扩展应用 GetVM 让编程学习更快一步 WildCard (野卡) - 国内用户零门槛订阅 ChatGPT、Claude、App Store 万里汇开发者收款使用全指南 | 注册、开户与账户绑定教程 中国大陆居民开通华侨银行(OCBC)海外账户完全指南 实用的 macOS 内置命令,省下买第三方应用的钱 《认知觉醒》之触动学习法 不是程序员也可以搞开发,一小时入门 Retool 低代码 疫情来袭,手把手教你在家制作美味炒鸡 企业微信机器人 Webhook 推送语雀更新消息 基于 Cloudflare Workers 部署的 JSON Database 数据库 印象时间:印象笔记出品的时间管理应用 Pixelmator Photo 2.0: 桌面级功能并适配 iPhone Shortery:Mac 快捷指令自动化 Pixelmator Pro 2.3:AI 背景去除 Quit All:一键退出应用程序 Raycast:推出官方扩展商店和开发者平台 简悦 API 2.0:收藏助手和快照功能 HomePod mini 使用体验 Prizmo 5.5:扫描效果增强并新增批注功能 Notion:近期值得关注的新特性 Google Analytics 替代品,零成本和零门槛搭建 umami.is Infuse 7:一款近乎完美的视频播放器 Gyroscope 4.14:新的产品名称和多项改进 V day:在手机上创作短视频 Things 3.14:备注支持 Markdown,同步速度加快 MoneyWiz 2021:新的通知选项和视觉改善 Doppler:管理和分享你的本地音乐 CARROT Weather:5.3 带了多项新特性 Obsidian:知名知识管理工具推出移动应用 NOMO RAW:专业 ProRAW 相机 Tape:全能且好用的录屏软件 Apple Design Award 2021 Craft 1.6:每日笔记重磅更新 Trakt:官方 iOS 应用全新上线 Notion:支持 API 和自动化集成 Varlens:iOS 专业相机应用 Infuse 7:不只是 M1,支持所有 Mac 简悦:支持 API 和自动化流程 奇妙组件:小而美的自定义 iOS 小组件 Farbox 2:支持自部署和多站点的开源博客系统 图图记账:高颜值记账应用 Coppice:帮助整理你的想法 DarkModeBuddy:基于光线切换深色模式 走进微软成都 Office,聊一聊 Microsoft 365 HapiGo:符合国情的效率启动器 Eagle 2.0:数十项功能更新 + 数倍的性能提升 无需记账,通过更新余额了解自己有「多少资产」 Dato:支持日历和时区的菜单栏时钟 Pixelmator Pro 2.0.2:增加新效果,支持 ProRAW Raycast:面向开发人员的效率启动器 Sorted:全新的 Mac 版本,原生支持 Apple Silicon App Store 和 Google Play 的 2020 年度 App 榜单 VSCO:全新的视频效果和拍摄模式 Pixelmator Pro 2.0:全新设计并支持 M1 芯片 Maipo 4:全功能新浪微博 macOS 客户端 Bartender 4:Mac 菜单栏定制工具 JSBox:适配并支持 iOS 14 小组件 Little Snitch 5:macOS 上出色的流量监控与防火墙应用 Photoshop:更多的 AI 创意工具 Capslox:文本操作快捷键增强效率工具 Airport:TestFlight 测试应用商店 Disk Drill 4:全新设计,支持 macOS 11 Big Sur OneWidget:小组件中的瑞士军刀 Todoist:新增看板视图 IFTTT Pro:合理的定价、全新的特性 PooPoo Privacy Policy QuakeSense Privacy Policy | 震感 App 隐私政策 ThenNow Privacy Policy | 今昔 App 隐私政策 LaunchBar 6.13:支持 macOS Big Sur 24 Hour Wallpaper:近百张 Mac 动态壁纸 简悦 2.0 阅读模式 + 标注系统 + 稍后读 绕过 App Store 付费,Setapp 采用新的 iOS 付费应用解锁策略 Noto 笔记:2.3 版本带来 10 余项功能更新 PliimPRO:让 Mac 一键进入演示模式 Pixelmator Pro 1.7:文字输入、画布旋转和 ML 超分辨率更新 Ulysses 20:新增导航面板和中文拼写检查 Mailbrew:新增 Inbox 集中订阅 Newletter Fluent Reader:免费跨平台 RSS 阅读器 Moment:高颜值 Mac 状态栏倒数日应用 Meeter:集中管理你的远程会议 Adobe Lightroom:新版带来了众多实用特性 WWDC:在 Mac 上观看 WWDC 直播和视频 LongWe:Mac 上的文本长图生成工具 Photoshop Camera:风格独特的艺术效果 Empoche:任务管理和时间追踪二合一 Camera+ 2:Magic ML 带来照片处理新魔法 Tuck:将窗口停靠在屏幕边缘 Wormhole:在电脑上操作 iOS 和 Android 设备 Coherence X:一键将网页转换为桌面应用 Charty:让快捷指令支持图表可视化 Edison Mail:又一款免费邮件客户端 Service Station:定制 Mac 右键菜单 WatchSmith:前所未有地个性化 Apple Watch Data Jar:为捷径设计的数据库 Zappy:Zapier 出品的截图录屏应用
极具潜力的效率启动器 App,Raycast 脚本功能详解
huhuhang · 2021-01-01 · via HANG ♥ WRITING

效率启动器是一类工具的总称,主要方便通过键盘操作快速检索信息、开启应用、甚至完成一系列自定义工作流。Mac 上的 Spotlight 搜索实际上可以看作是系统自带的效率启动器,默认情况下你可以通过 ⌘ + 空格键快速唤出,并执行文件搜索、天气查询、词典查询、计算器等一系列方便实用的操作。

Spotlight 词典查询

不过 Spotlight 正如它的名字一样,功能更偏重于搜索。相比之下,Mac 上最具代表性的第三方效率启动器 Alfred 和 LaunchBar 则拥有更强大的功能。特别是第三方效率启动器支持的脚本功能,能够实现大量的自定义操作。

Alfred 的脚本通过 Workflows 功能中的 Run Script Action 执行,支持 Bash,PHP,Ruby,Python,Perl,AppleScript 和 JavaScript 等多种语言。

Alfred Workflows 示例

同样,LaunchBar 也支持 Bash,Ruby,Python,Swift,AppleScript 和 JavaScript 等常用的脚本语言,并通过 Action Editor 进行管理。

Action Editor 界面

相比之下,Raycast 支持的脚本语言最少,目前只支持 Bash,Swift,AppleScript 等 3 种。对脚本语言支持较少是 Raycast 目前的劣势,但相比之下 Raycast 创建和管理脚本的方式最为简洁,入门成本最低。

创建脚本

使用 Raycast 创建一个脚本非常简单,没有 Alfred 和 LaunchBar 复杂流程和选项,只需要在 Raycast 中搜索 Create Script Command 命令即可。

通过命令新建自定义脚本

接下来,你会进入到创建脚本的引导界面。此时,需要选择脚本语言和运行模式,并输入脚本名称和脚本描述。界面中还有 2 个复选框,分别是运行脚本前需确认,以及脚本支持传入参数。

自定义脚本模版初始化

点击右下角的 Create Script 创建并保存脚本。此时,非常建议大家在 iCloud Drive 或者你其他常用的云同步应用中新建一个名为 Raycast Scripts 的文件夹用于存放脚本。这会极大地方便你在不同设备之间同步创建的自定义脚本。

保存自定义脚本到指定目录

创建完成之后,使用编辑器打开相应的脚本文件,你会看到 Raycast 创建好的脚本模板。

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Echo SSPAI
# @raycast.mode compact
# Optional parameters:
# @raycast.icon 🤖

echo "Hello World!"

上面是一个简单的 Bash 脚本,通过 echo 命令支持打印出 Hello World! 字符串。其中,注释掉的部分是脚本配置项。其中包含参数:

  • schemaVersion:架构版本,Raycast 预留为将来 API 的变化做准备。目前只有第 1 版。
  • title:脚本名称,初始化脚本时填入的名称,支持在脚本中直接修改。
  • mode:运行模式,目前 Raycast 支持 3 种运行模式,下文中会介绍。
  • icon:脚本显示图标,支持 Emoji 或者绝对路径引用本地图片。

此外,Raycast 脚本还支持的配置参数有:

  • argument:脚本支持参数传入。
  • needsConfirmation:运行前是否需要二次确认。
  • packageName:作为副标题显示的名称。当没有提供时,名称将使用脚本文件名。
  • iconDark:和 icon 参数一样,用于配置明亮和暗色主题不同的图标。
  • refreshTime:脚本运行在 inline 模式下的刷新时间。
  • currentDirectoryPath:自定义脚本执行路径,默认在脚本存放路径。
  • author:作者名称。
  • authorURL:作者链接。
  • description:脚本描述信息。

运行模式

@raycast.mode 参数所支持配置的脚本运行模式是 Raycast 脚本功能中最为值得一提的特性,目前支持:

  • fullOutput:命令在单独的视图中打印整个输出。
  • compact:命令在 Raycast 窗口下方运行并打印结果。
  • silent: 命令关闭 Raycast 窗口并在后台运行。
  • inline:将脚本设置为以刷新仪表板的方式显示,支持配置参数 refreshTime。

默认情况下,Raycast 的脚本运行模式为 compact,即在窗口下方显示运行状态和打印输出结果。例如上方的示例脚本采用 compact 模式执行之后的效果如下,呈现在左下角的小窗口是否简洁,同时还能展示较少的关键信息。

compact 模式显示效果

fullOutput 模式则适合脚本输出信息较多的情况,因为 compact 显示的信息长度有限。例如在一个支持 Ping 服务的脚本中,需要打印较多的信息,那么这些信息则会在单独的窗口中显示出来。

支持 Ping 服务器的自定义脚本

silent 模式很好理解,即脚本在后台静默执行,例如下面清空废纸篓 Empty Trash 的脚本中,我们不需要打印任何输出,只需要脚本执行即可。

silent 模式下不会展示任何输出

Empty Trash 的脚本源码如下:

#!/usr/bin/osascript

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Empty Trash
# @raycast.mode silent
# @raycast.packageName System
# Optional parameters:
# @raycast.icon 🗑

# Documentation:
# @raycast.description Empty the trash.

tell application "Finder" to empty trash

inline 则直接在 Raycast 窗口中显示脚本输出信息。该模式下,我们不需要回车执行脚本,而脚本支持配置 refreshTime 参数支持固定频率刷新,并将输出信息缓存在 Raycast 界面中。

inline 模式直接在界面展示信息

例如上方显示系统 CPU 和内存占用信息的脚本中,代码配置了 5s 刷新一次。这种模式下,我们期望少量的信息直观呈现,而不需要多余的交互。

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title System Activity
# @raycast.mode inline
# @raycast.refreshTime 5s
# @raycast.packageName Dashboard
# Optional parameters:
# @raycast.icon 📈

cpu_mem=$(ps -A -o %cpu,%mem | awk '{ cpu += $1; mem += $2} END {print "CPU: "cpu"% MEM: "mem"%"}')
echo "${cpu_mem}"

总之,Raycast 提供的四种运行模式各有适用场景:

  • fullOutput 模式:适合脚本输出信息较多的场景,展示美观。
  • compact 模式:适合脚本输出信息较少的场景,简约大方。
  • silent 模式:适合脚本无输出信息的场景,后台静默执行。
  • inline 模式:适合脚本输出信息需要直观展示的情形。

参数输入

Raycast 1.2 版本中,自定义脚本正式支持传入参数,这是里程碑式的特性。之前不能传参的脚本功能更为死板,没有可交互的能力。而支持参数输入之后,你就可以打造更多更有意思的脚本。

脚本传入参数的方式非常简单,只需要在脚本中添加参数配置项即可。例如上方演示的 Ping 脚本中,其支持通过参数输入需要 Ping 的域名或服务器地址,所以我们可以输入 sspai.com 测试相应的 Ping 值。

#!/bin/bash

# @raycast.title Ping
# @raycast.author Caleb Stauffer
# @raycast.authorURL https://github.com/crstauf
# @raycast.description Ping an IP address or URL.
# @raycast.icon 🌐
# @raycast.mode fullOutput
# @raycast.packageName Internet
# @raycast.schemaVersion 1
# @raycast.argument1 { "type": "text", "placeholder": "URL or IP address" }

ping -i 0.25 -t 3 "$1"

脚本代码中的 argument1 即为支持的第一个参数,而后方的字典配置项中支持定义参数的默认类型和占位提示信息。如果你的脚本需要传入多个参数,则可以使用 argument2 这样罗马数字递增的方式,添加更多的参数配置项目即可。

而在 Bash 脚本中,我们只需要使用脚本内获取参数的标准格式 $N 即可获取参数值。

Python 脚本

目前,Raycast 仅支持 Bash,Swift,AppleScript 等 3 种脚本语言。如今是全民学 Python 的时代,尚不支持如此「时髦」的语言有点说不过去了。

但实际上,只要我们的脚本能够通过命令行运行,都可以结合 Bash 采用曲线救国的方式来编写脚本代码,在 Raycast 脚本中运行 Python 代码自然可行。

例如上方的 Hello World 代码中,我们除了可以使用 Bash 支持的 Echo 命令直接打印信息,还可以结合 Python 来打印输出。

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Echo SSPAI
# @raycast.mode fullOutput
# Optional parameters:
# @raycast.icon 🤖

# 方法 1:使用 Bash 执行
echo "Bash: Hello World!"

# 方法 2:使用 Python 输出结合 Bash 执行
echo $(python -c "print('Python: Hello,World.')")

运行输出如下:

2 种方法下的输出信息

再例如,我之前分享过一个《Setapp 设备一键解绑 LaunchBar 动作》,该动作用于一键删除 Setapp 登录设备,方便登录设备超出限额时使用。这个 LaunchBar Action 是通过 Python 代码实现。那么如果将其转写成 Raycast 脚本,实际上也非常简单。

首先,我们在 Raycast 脚本目录中单独创建一个 Python 脚本文件,比如命名为 delete-setapp.py。下面的代码中,我们可以在 Python 脚本中基于 Setapp 提供的 API 来删除已登录的设备。

import json
import requests

# 配置 Setapp 登录名和密码
EMAIL = "邮箱"
PASSWORD = "密码"

def auth():
    """获取 token

    """
    response = requests.post(
        url="https://user-api.setapp.com/v1/auth",
        headers={
            "Accept": "application/json",
            "Content-Type": "text/plain; charset=utf-8",
        },
        # 请在此处填入用户名和密码
        data=json.dumps(
            {"email": EMAIL, "password": PASSWORD, "remember": True})
    )
    token = response.json()['data']['token']
    return token

def delete():
    """删除用户

    """
    try:
        token = auth()
        headers = {
            "Authorization": f"Token {token}",
            "Content-Type": "application/json",
            "Accept": "application/json",
        }
        devices = requests.get(
            url="https://user-api.setapp.com/v1/devices", headers=headers).json()
        if len(devices['data']) == 0:
            return "无在线设备"
        else:
            device_id = devices['data'][0]['id']
            r = requests.delete(
                f'https://user-api.setapp.com/v1/devices/{device_id}', headers=headers)
            if r.status_code == 204:
                return f'成功删除设备 {device_id}'
            else:
                return f'删除失败,返回值 {r.status_code}'
    except:
        return '请求失败'

if __name__ == "__main__":
    print(delete())

接下来,我们基于 Bash 创建一个 Raycast 脚本,其中只需要添加一行 echo 命令将 Python 脚本执行的返回结果打印输出即可。

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Delete Setapp Device
# @raycast.mode compact
# Optional parameters:
# @raycast.author huhuhang
# @raycast.authorURL https://github.com/huhuhang
# @raycast.icon icons/delete.png
# @raycast.packageName Delete Setapp Device

echo $(python delete-setapp.py)

最后,在 Raycast 中执行该脚本即可看到运行结果。

使用 compact 模式删除 Setapp 设备

虽然 Raycast 目前官方支持的脚本语言不如 Alfred 和 LaunchBar 多,但理论上你均可以使用 Bash 曲线救国方案,结合你自己熟悉的脚本语言来实现更多自定义操作。

脚本管理

效率启动器的脚本管理是绕不开的话题。以我熟悉的 LaunchBar 为例,创建和管理脚本都需要依赖于 Action Editor 功能。虽然我长期使用 LaunchBar,但却对其管理脚本的方式并不满意,因为它太复杂了。

如下图所示,实际上到目前为止我都不知道 Action Editor 中的一部分功能和选项是什么意思。例如界面中的 Default Script,Suggestions Script,Action URL Script 三者有何区别,该怎样使用?虽然我知道 LaunchBar 官方应该提供了相应的说明文档,但是其对于普通用户而言,上手门槛实在太高了。我相信很多人应该和我一样,看到这个复杂界面的时候就已经头大了。

LaunchBar 复杂的脚本管理界面

相比之下,Raycast 的脚本管理界面就简洁很多。因为其支持直接从文件夹中加载包含的全部脚本。还记得我在文章一开始提到推荐大家在 iCloud Drive 或者你其他常用的云同步应用中新建一个名为 Raycast Scripts 的文件夹用于存放脚本吗?如果你这样做,只需要在 Raycast 设置中关联相应的文件夹即可加载文件夹下的全部脚本。

Raycast 的脚本管理界面

如果有需要的话,你还可以将不同类型的脚本存放在不同的文件夹中,Raycast 支持关联多个文件夹,并实现脚本的自动 Reload,即在脚本代码更新之后自动更新,保证 Raycast 会执行最新的脚本。

如果你习惯使用 Git,那么对创建的脚本进行版本管理也就十分方便了,直接在脚本文件夹中初始化 Git 仓库即可。

脚本推荐

除了我文章中提到的部分脚本,目前 Raycast 官方维护了一个 GitHub 脚本仓库用于分享 社区开发的实用脚本。虽然 Raycast 的社区脚本共享量还远不如 Alfred 和 LaunchBar,但由于 Raycast 本身的定位就是开发人员,随着用户越来越多,相信也会有更多实用的脚本被分享出来。

自定义脚本解决的核心需求往往并不具有普适性,所以我个人经常使用的脚本无法分享出来,因为仅和自己所做的事情有关,用于提升我个人的工作效率。授人以鱼不如授人以渔,如果你期望用好 Raycast 或者其他效率启动器的脚本功能,可以尝试学习 Bash 或者 Python 等任意一种脚本语言,实际上掌握基础语法写一个简单脚本并不困难,网络上免费的学习资源也非常丰富。

如果你想了解 Raycast 作为效率启动器的基础功能,可以 搜索并阅读相关文章。目前,Raycast 完全免费,可以 前往官网下载 使用。