首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

推荐一个 MacOS 上用了就无法自拔的神器 [Hammerspoon]

  easternslope · 218 天前 · 18621 次点击
这是一个创建于 218 天前的主题,其中的信息可能已经有所发展或是发生改变。

推荐一个 MacOS 上用了就无法自拔的 App

Hammerspoon

Hammerspoon 是 MacOS 上的自动化工具,许多介绍 Hammerspoon 的文章都主要介绍了它是一个窗口管理工具,但是 Hammerspoon 能做到的远远不仅如此。

Hammerspoon 开源、免费和支持插件,将大多数系统层面的接口封装成了 Lua API,这就让这把小锤子在 MacOS 上近乎无所不能,可玩性极高

我都用 Hammerspoon 做了些什么?

  • 菜单栏显示最近几天天气情况
    • 参考示例
    • 请求免费的天气 API,在深圳这个多雨的城市里提醒我别忘记带伞。
  • 剪切板历史记录

    • 参考示例
    • 记录剪贴板历史,点击某一项再重新复制。
  • 音量调节快捷键

    • 参考示例

    • 当我使用外接键盘时,自定义快捷键 cmd + up/down 调节系统音量

  • 窗口管理

    • 参考示例
    • 快捷键实现二分屏、三分屏和全屏
  • Wi-Fi 自动脚本

    • 参考示例
    • 根据 Wi-Fi SSID 判断是否在公司还是在家,例如在家里自动挂载 NAS 服务器,如果在公司 sshfs 挂载服务器目录等。
  • 蓝牙耳机自动连接

  • 输入法自动切换

    • 参考示例
    • 在每个 App 界面自动切换成搜狗输入法,配合搜狗输入法自动中英文切换,再也不用在系统默认的英文输入法和搜狗输入法之间来回切换了。
  • 定时自动提交代码

    • 参考示例
    • 使用 hs.timer 定时器,定时自动推送我的笔记和下载的电子书到 Github 仓库。
  • USB 设备连接记录

    • 参考示例
    • 记录插上你电脑的每一个 USB 设备信息,凡插过必留记录。
  • 消息推送

  • TTS 发声

    • 参考示例
    • 调用 say hello world 合成 TTS,模拟真人发音,让 Mac 会说话。
  • 更多... (完全停不下来啊)

其他插件思路

  • 番茄钟
  • 应用搜索
  • 桌面小部件
  • ...

使用入门

Hammerspoon 已经将与 MacOS 之间的系统交互封装成了 Lua 的 API,配置 ~/.hammerspoon/init.lua 脚本可以与系统进行交互,只需要了解一些基本的 Lua 语法,就可以 Happy Hacking 了。

我的参考配置

如果你懒得配置,可以参考我的配置,

wangshub/hammerspoon-config

最后

已经完全停不下来了,Hammerspoon 每天至少省下了 30 分钟的时间 😀⏱

155 回复  |  直到 2019-08-12 13:41:06 +08:00
1  2  
    101
cuixiao603   218 天前
@kwGao 一样问题
    102
letmeformatyou   218 天前
不错,下载下来研究一下
    103
ladypxy   218 天前 via iPhone   ♥ 1
用了 mac 才知道,窗口管理真是一坨屎
    104
MrUser   218 天前
用的清歌输入法,怎么替换 ime.lua 中的搜狗?
如何获得 APP 的包名?
    105
rppig42   218 天前
@yangg 微信 Mac 的心跳检测特别长,关掉微信要等很久才会被认为下线,所以单纯的关掉微信进程并不能解决问题...

类似防撤回小助手之类的逆向可能可以解决这个问题,但好像没人做...
    106
easternslope   218 天前 via Android   ♥ 1
@MrUser 我这里加载了一个快捷键调试函数,ctl+cmd+. 就可以获得当前应用 id

https://github.com/wangshub/hammerspoon-config/blob/master/hotkey/hotkey.lua
    107
martint028   218 天前
又可以来个新语言了
    108
hujianxin   218 天前
这个真心不错,不过楼主的几个功能都是 macos 自带的
    109
luozhiyun   218 天前
自动挂载 NAS 服务器 的代码是什么呀?可以发一下吗?
    110
xiubin   218 天前 via iPhone
输入法切换和搜狗自带的 app 切换有什么区别吗?
    111
ligyxy   218 天前
不错,看来可以淘汰 ControlPlane 了
    112
Soutxx   218 天前 via iPhone
mac 小白一个 能新建文件吗? txt 的
    113
ShuoHui   218 天前 via iPhone
哇看起来很不错
    114
djyde   218 天前
感谢分享
    115
vjnjc   218 天前 via Android
看起来不错,明天上班去配一个
    116
lxml   218 天前
感觉是不是支持 Js 好一些,Lua 还是太小众了耶
    117
logozy   217 天前 via Android
好东西
    118
Zchary   217 天前 via iPhone
活久见,估计我 mbp 上可以卸载至少 5 款软件。
    119
rppig42   217 天前
@yangg 昨天半夜想到个方法,logout 就行了...写了个脚本亲测有效

    120
easternslope   217 天前
@lxml 我也是头一回接触 Lua,用起来很容易上手哦
    121
TheLamb   217 天前
感觉有点意思的 app,就差一台 mbp 了
    122
feYAN7   217 天前
@lzs5240 怎么安装这个字体啊
    123
feYAN7   217 天前
@easternslope 楼主你截图的字体怎么安装啊
    124
anonym233   217 天前
感谢推荐,回去试试
    125
jjww   217 天前
消息推送部分的 [参考实例] 链接是 TTS 发声的 [参考实例] 的地址.

@easternslope
    126
zealinux   217 天前
我想要个功能,能不能 切换 SS 梯子?

我同时使用两三个个梯子,
但是有时某个梯子不好用,
我想切换一下。

每天都要切换个两三次。
    127
Heanes   217 天前
看着感觉不错,准备试下
    128
IBNOTW   217 天前
「 Hammerspoon 每天至少省下了 30 分钟的时间」然后用这省下来的 30 分钟鼓捣各种新奇古怪的用法,不能自拔😂
    130
yuanshuai1995   217 天前
收藏了,等我买笔记本之后再来看
    131
easternslope   217 天前
@zealinux 嗯嗯,记下了,我也想要这个功能,调研一下有没有 ss 客户端支持的
    132
easternslope   217 天前
    133
H0H   217 天前
兄弟,你列举的这么多其实平时使用频率并不算高的场景,手动切换也没多麻烦。这种自动化脚本,你调试脚本+长期维护要花多少时间?

我最开始用电脑时,也是狂记快捷键,现在 Win 系统下也就能记住 Win+R,Mac 下基本都是触摸板点点点。其实效率也没降低多少
    134
feYAN7   217 天前
@easternslope 安装好了,谢谢楼主
    135
easternslope   217 天前
@H0H 这其实是一些启发性的示例而已,纯属个人习惯,当一件事情需要我重复做 3 次我就会考虑用代码解决,而这花费的时间对我来说是相同甚至是更少的。并且可以从中获得一些小乐趣。:)
    136
MrUser   217 天前
@H0H
大众创业万众创新,生命在于折腾,哈哈
    137
MrUser   217 天前
LZ 能写个 hs.location 进入某个范围后干点什么事的示例么?官方的 API 手册看不太懂
@easternslope
    138
H0H   217 天前
@easternslope 我自己也是开发人员出身,以前也非常喜欢玩这些东西。后来发现这些自动化的东西,其实花的时间要比手工方式更多。所以我现在自动化的东西,基本上要求为『一次配置,永远运行』,如果达不到这点那就拆分成『部分操作一次配置永远运行+其他操作手工进行』。

所以现在家庭网络只有 Samba、NFS、FTP、TimeMachine 这类已经问世 n 年并且协议功能以及足够完善足够稳定的东西,我才考虑配置后日常使用,新奇的东西坚决不用。

日常个人照片备份,也只是写个简单工具抽取照片中 exif 信息然后按月分类到不同文件夹。但往自己真实归档目录拷贝时,依然选择手工方式,以免自动化方式有 bug 导致老照片被覆盖。

个人数据在多个归档磁盘同步时,只是选择 BeyondCompare 作为辅助,但同步操作依然是人工确认后点击复制。
    139
easternslope   217 天前 via Android
@H0H Cool 完全赞同:一次配置,一劳永逸。平时有很多重复性工作需要安排,所以造了很多工具和脚本来解决自己的问题,省下了很多时间,单纯的为了折腾而折腾实在有点无用功。
    140
dany813   217 天前
收藏
    141
cuixiao603   217 天前
光标错位的问题怎么解决呢 我看你的截图貌似没这个问题
    142
yoohwzy   217 天前
借着帖子问一下, Hammerspoon 的两种 watcher:start() 哪种更好一些, 还是没有区别, 抑或是有其它更好的写法?

https://pastebin.com/8uj3RkVd

第一种是两个不同的功能, start 两个 watcher. 第二种是将新建 fun, 汇聚两个功能函数, 然后 start 一个 watcher.
    143
firhome   217 天前
楼主,你的自动提交 git 和 拉取 git 的 .sh 可以提供一下吗?
    144
ahonn   217 天前
有意思,自己写了个窗口管理脚本 https://github.com/ahonn/dotfiles/blob/master/hammerspoon/modules/window.lua

还是这种能够深度按自己需求定制的软件给力啊
    145
ahonn   217 天前
    146
phpcyy   217 天前
@yangg

我发现我也有这个需求,看下下边的可以不

function caffeinateCallback(eventType)
if (eventType == hs.caffeinate.watcher.screensDidSleep) then
timer = hs.timer.doAfter(300, function()
local wechat = hs.application.get("WeChat")
wechat:kill()
end)
print("timer started")
elseif (eventType == hs.caffeinate.watcher.screensDidWake) then
timer:stop()
print("timer canceled")
elseif (eventType == hs.caffeinate.watcher.screensDidLock) then
print("lock")
elseif (eventType == hs.caffeinate.watcher.screensDidUnlock) then
print("unlock")
end
end

caffeinateWatcher = hs.caffeinate.watcher.new(caffeinateCallback)
caffeinateWatcher:start()
    147
Volekingsg   217 天前
当初拉我入 Hammerspoon 坑的是这篇文章的题图,通过鼠标滑动一个建立一个 iTerm2 的窗口,酷爆了,虽然后来发现还是 Hotkey Window 方便🤣
https://blog.theodo.fr/2018/03/making-runtime-funtime-hammerspoon/
    148
circleee   217 天前
厉害
    149
EINDEX   217 天前 via iPhone
可以实现状态栏 文字分两行吗
    150
nobody123123   216 天前
@ladypxy 这话真不假,装了一堆窗口管理插件用起来还是屎一样难受。为了贪念原生的命令行和 Cmd 快捷键。 默默忍受 3 年了
    151
superzzy   216 天前
collection list
    152
biabia123456   215 天前 via iPhone
已搞定家里 WiFi 自动设置指定网关 公司 WiFi 自动设置指定 ip 其余默认 DHCP 美滋滋
    153
cooooler   195 天前
自动切换输入法在我这无效
    154
zuorn   137 天前
真的爱了,相见恨晚。
    155
LudwigWS   93 天前
Mark 一下,参考学习
1  2  
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2247 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 34ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
♥ Do have faith in what you're doing.