Quantcast
Channel: 少数派
Viewing all articles
Browse latest Browse all 13768

我如何用 Keyboard Maestro 替代 TextExpander

$
0
0

不知道大家还记不记得前阵子的 Mac ‘Pick a Bundle’ 2017(我派文章:《这也许是 2017 年省钱最多的 Mac Bundle 软件套装》),我当时犹豫了很久,因为我不知道我是不是真的需要这些 App,不过后来还是剁了。因为之前没有用过,我很天真的以为 TextExpander 是买断制的,激活的时候才发现自己亏了。

对很多人来说 TextExpander(下称 TE)的必要的功能 Keyboard Maestro(下称 KM)基本可以代替。而且 KM 在中文输入法下也能正常工作,TE 则会有很多问题。本文尝试给出一个全面的替代方案帮助你省钱省心。还没有尝试过这种效率工具的朋友也可以照着教程弄一个试试,说不定就有用呢。参考链接中还有一些 KM 的其他使用场景,希望你能帮到你。如果你已经用了一阵子 TE,还有比较方便的迁移方案

不过如果你比较在意在 iOS 上做这件事情,那恐怕还要继续用 TE,很显然在 iOS 上除了用功能单一的系统自带的文本替换,并没有什么好的办法来代替它。

基本的文本替换

这是一个邮箱地址的 snippet:

快速输入邮箱

这是其在 KM 中的实现:

快速输入邮箱

激活条件

点击 New trigger 添加一个激活条件。

激活条件

我这里选择的是 Typed string trigger,和 TE 的激活方法是一样的:用户在某一文本框中输入一些关键词。你也可以按自己的习惯把一部分常用的 snippet 改成用快捷键激活。

  • Case dose not matter 可以选择侦测是否大小写敏感,TE 也有类似的设置。
  • Match after any character 可以设置替换的时机,我目前的选择代表只要侦测到字符就替换。如果你改成了 Match after a word break 则在字符前没有一个空格作为分隔的话,就不会被替换。
  • Diacritical matter 我搞不懂有什么意义,不过改掉会让带有特殊符号的关键词失效,所以就这样吧。
  • Simulate n deletes before executing 如果不选中那就是只执行脚本不删除关键词。这是一个 TE 没有的功能。

你还可以再添加一个 trigger 来指定这个脚本只在某些程序内执行。避免不必要的干扰。

输入方式

点击 New Action 添加一个动作,在左边的列表里找到 Text 可以看到前两项是我们需要的东西。

这里又是一个 KM 的优势,在 TE 中建立的 snippet 是不能在密码框工作的,在网页中也需要调整 Safari 的安全选项才能输入密码。比如说我们移动文件到系统目录需要确认,这个时候就可以用 KM 做一个快速确认的脚本。

  • Insert text by Pasting 文本会被先复制到剪贴板再粘贴到区域。(输入到 Apple ID 登录框时要使用此选项)
  • Insert text by Typing 文本会被以模拟键盘的方式输入到区域。(输入到系统密码区域或想避免影响剪贴板时使用此选项)

一般我都会用前者,大部分情况下都是适用的。因为有用一些剪贴板管理软件,所以也不在乎影响剪贴板。顺便给出我输入系统密码的脚本。(不过注意,密码是明文存储的,如果别人有可能碰到你电脑,我不建议你这么做。)

输入系统密码的脚本

复杂点的模版输入

在 TE 中我们可以指定一个模版,比如说邮件回复的模版,在实际使用的时候可以直接在模版中填空来输入大段文字。下面是一个案例:

教你怎么节约时间

运行效果大概是这样的:

运行效果

这是其在 KM 中的实现:

教你怎么节约时间

运行效果大概是这样的:

运行效果

询问输入

添加的第一个 Action 是 Variables/Prompt for User Input。

  • Title 和 Prompt 没什么好说的,就是标题和提示语
  • Variables and Default Values 这里你可以定义需要输入的变量名和他们的默认值,注意变量名不能重复,必要时可以后面加 123 之类的。这些变量名也会显示在要求输入的提示框里。

构造文本

点击 Insert Token 就可以在文本中加入之前的变量。

菜单

只需要把光标定位在变量要放的位置然后加就行了,如果你熟悉语法也可以自己打字,这都没关系的。

我解释一下其他两个重要选项:

  • Calculation 会在你的文本中插入一段计算代码,默认是 %Calculate%1+2% 你可以利用这个语法来对输入的变量进行一些计算。比如说你有两个变量「单价」和「数量」,就可以写一个 %Calculate%单价+数量%,会输出相乘的结果。这是一个 TE 没有的功能。
  • Position Cursor 输入文本后将光标放在某处。如果你需要在模版中间再自己打字的话,这是一个很方便的选项。

再重点介绍一下和时间有关的公式:

Date 子菜单
  • Date/Formatted (ICU) Date Time 会插入一个格式化的当前时间戳,默认格式是 %ICUDateTime%EEE, MMM d, yyyy h:mm%。你可以调整百分号之间的 EEE(星期)yyyy(年)MMM(月)d(日)h(小时)mm(分)ss(秒)的位置和周围的字符串来形成一个自己需要格式的一般时间戳。
  • Date/Formatted (ICU) Date Time For 默认会插入一个 30 秒后的时间戳,默认格式是 %ICUDateTimeFor%NOW()+30%EEE, MMM d, yyyy h:mm:ss%。修改数字 30 可以指定距今多少秒,可以配合一些变量实现输入之类的。格式调整同上。
  • Date/Formatted (ICU) Date Time Minus 默认会插入一个 21 天前的时间戳,默认格式是 %ICUDateTimeMinus%3*7%Days%EEE, MMM d, yyyy h:mm%。可以修改数字和单位,都是时间单位英语的复数。格式调整同上。
  • Date/Formatted (ICU) Date Time Plus 默认会插入一个 21 天后的时间戳,默认格式是 %ICUDateTimeMinus%3*7%Days%EEE, MMM d, yyyy h:mm%。参数修改方法同上。

剩下的东西如果大家需要可以自己研究一下或者参见官方文档

富文本问题

有时候我们会需要输入一些带有格式的文本,KM 并不能原生对这种东西提供支持,这是一个很尴尬的缺点。不过办法还是有的,比如说可以用 RTF 文件。

我们先用文本编辑新建一个文件。内容如图:

文本编辑

然后在 KM 里加入 File/Read a File 和 Clipboard/Paste,把文件定位到刚才建立的文件上。

脚本内容

效果如下:

插入到邮件

你也可以把这个操作穿插到之前的「模版输入」章节中使用。

其它常用操作

插入图片

插入图片的做法如图,注意过程中会修改剪贴板。

脚本内容

分别是 Image/Read a File 和 Clipboard/Paste。

运行脚本

运行脚本的 Action 可以在 Execute 中找到。

运行脚本

用法也都很简单,和 Automator 类似。

脚本内容

模拟功能键

脚本内容

Interface Control/Type a Keystroke。

小技巧

你可以把一些 snippet 放在一个文件夹中,并制作一个弹出选择菜单的脚本来做备忘。内容和效果如图:

脚本内容
选择菜单

Keyboard Maestro/Show Macro Group 会让这个菜单一直显示,Keyboard Maestro/Show Macro Group for One Action 则会在执行后消失。

数据迁移

我在 Github 上找到了一个迁移脚本,可以帮助你把那些简单的 snippet 直接迁移到 KM。但是那个脚本中的配置文件位置已经是上一个版本的了,我更新了一下放在我自己的 GitHub,大家可以取用。(GitHub 链接

先把这个脚本下载到本地,再在终端中运行:python TE.py 就可以在桌面生成 KM 的配置文件,双击导入即可。

对于比较「花哨」的 snippet,你可能就需要自己去折腾一下了。可以先做一个模版,然后多复制几遍改一改。这里是我上面模版输入的 snippet 文件

小结

本文的内容是一些我个人的使用经验。在可以被众多工具代替的情况下,TE 采用订阅制销售真的是一个正确的做法吗?订阅制销售的关键在于「软件即服务」,而 TE 这样的工具类 App 仅仅凭借其自身有一个同步平台我觉得并不是能够做到这一点。而现在的销售方式无疑会让一些原来的 TE 用户去寻找更便宜的替代品。你对这件事情怎么看呢?不管是对本文内容有补充还是评价我的观点,欢迎在评论区和我交流。顺带吐槽一下,KM 这个 UI 啊,虽然大多数时候看不着,但是拜托能不能做的好看点 🌚。

相关链接



Viewing all articles
Browse latest Browse all 13768

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>