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

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

  easternslope · 2019-04-09 10:27:30 +08:00 · 25400 次点击
这是一个创建于 484 天前的主题,其中的信息可能已经有所发展或是发生改变。

推荐一个 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 分钟的时间 😀⏱

156 条回复    2019-11-28 17:08:54 +08:00
1  2  
cuixiao603
    101
cuixiao603   2019-04-09 21:59:26 +08:00
@kwGao 一样问题
letmeformatyou
    102
letmeformatyou   2019-04-09 22:04:42 +08:00
不错,下载下来研究一下
ladypxy
    103
ladypxy   2019-04-09 22:07:00 +08:00 via iPhone   ❤️ 1
用了 mac 才知道,窗口管理真是一坨屎
MrUser
    104
MrUser   2019-04-09 22:09:31 +08:00
用的清歌输入法,怎么替换 ime.lua 中的搜狗?
如何获得 APP 的包名?
rppig42
    105
rppig42   2019-04-09 22:16:00 +08:00
@yangg 微信 Mac 的心跳检测特别长,关掉微信要等很久才会被认为下线,所以单纯的关掉微信进程并不能解决问题...

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

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

easternslope
    120
easternslope   2019-04-10 10:18:56 +08:00
@lxml 我也是头一回接触 Lua,用起来很容易上手哦
TheLamb
    121
TheLamb   2019-04-10 10:20:13 +08:00
感觉有点意思的 app,就差一台 mbp 了
feYAN7
    122
feYAN7   2019-04-10 10:31:27 +08:00
@lzs5240 怎么安装这个字体啊
feYAN7
    123
feYAN7   2019-04-10 10:31:47 +08:00
@easternslope 楼主你截图的字体怎么安装啊
anonym233
    124
anonym233   2019-04-10 10:32:04 +08:00
感谢推荐,回去试试
jjww
    125
jjww   2019-04-10 10:33:45 +08:00
消息推送部分的 [参考实例] 链接是 TTS 发声的 [参考实例] 的地址.

@easternslope
zealinux
    126
zealinux   2019-04-10 10:45:28 +08:00
我想要个功能,能不能 切换 SS 梯子?

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

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

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

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

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

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

https://pastebin.com/8uj3RkVd

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

还是这种能够深度按自己需求定制的软件给力啊
ahonn
    145
ahonn   2019-04-10 14:21:14 +08:00
phpcyy
    146
phpcyy   2019-04-10 15:03:23 +08:00
@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()
Volekingsg
    147
Volekingsg   2019-04-10 16:55:45 +08:00
当初拉我入 Hammerspoon 坑的是这篇文章的题图,通过鼠标滑动一个建立一个 iTerm2 的窗口,酷爆了,虽然后来发现还是 Hotkey Window 方便🤣
https://blog.theodo.fr/2018/03/making-runtime-funtime-hammerspoon/
circleee
    148
circleee   2019-04-10 17:33:22 +08:00
厉害
EINDEX
    149
EINDEX   2019-04-10 20:26:31 +08:00 via iPhone
可以实现状态栏 文字分两行吗
nobody123123
    150
nobody123123   2019-04-11 09:38:06 +08:00
@ladypxy 这话真不假,装了一堆窗口管理插件用起来还是屎一样难受。为了贪念原生的命令行和 Cmd 快捷键。 默默忍受 3 年了
superzzy
    151
superzzy   2019-04-11 10:18:51 +08:00
collection list
biabia123456
    152
biabia123456   2019-04-12 08:59:46 +08:00 via iPhone
已搞定家里 WiFi 自动设置指定网关 公司 WiFi 自动设置指定 ip 其余默认 DHCP 美滋滋
cooooler
    153
cooooler   2019-05-02 23:21:32 +08:00
自动切换输入法在我这无效
zuorn
    154
zuorn   2019-06-29 11:33:29 +08:00
真的爱了,相见恨晚。
LudwigWS
    155
LudwigWS   359 天前
Mark 一下,参考学习
MrUser
    156
MrUser   251 天前
> 回复 @EINDEX 在 #149 发表的:
> 可以实现状态栏 文字分两行吗
--------
直接使用 \n 就行了,不过 2 行中间间距很大而且不知道怎么调这个间距
1  2  
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3122 人在线   最高记录 5168   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 11:09 · PVG 19:09 · LAX 04:09 · JFK 07:09
♥ Do have faith in what you're doing.