第一次用 Applescript 增強了 Evernote 的功能
出發點
我是 Evernote 的比較資深的用戶。但用著用著希望增強一點它的功能。具體見文章:為 Evernote 添加 Archive 功能快捷鍵
作為程序員之前大概了解 Applescript 可以方便地做一些事情,但之前沒有較真過。也可以說是,之前對桌面編程興趣向來不大。近期陸續買了幾個付費的 App,也是越來越覺得桌面工具的方便,提高使用效率是非常重要的,應該要多投入時間關注“工具”。要不買,要不自己實現。
實現思路
首先,確認到 Applescript 是 Mac OS X 上用來做 App 功能增強、自動化完成更復雜的任務的官方很 Cool 的途徑:
- 可以通過 Applescript 類似于語言描述(英文)的語法,來系統級或者針對某個 App 或者多個 App 做一些動作;
- 如果對某 App 如 Evernote 做操作,需要該 App 對 Applescript 有做接口支持。系統級的 App 一般都有支持。
Evernote 這個 Mac App 有沒有對 Applescript 的支持?Google … 后發現有。
第一次真正要用 Applescript,參考官方提供的示例文檔,也順便看下該如何寫 Applescript。
另外一個需要看的資源是:Evernote 的 Applescript 字典。
Applescript 字典
對于寫 Applescript 腳本,字典是其依據,是最核心的。
一個應用的 Applescript 字典可以被認為是該應用支持的 Applescript 的 API 文檔。
字典打開步驟:
- 打開“腳本編輯器”。這是 Applescript 的編輯與運行環境。
- 點擊“文件”菜單,點擊“打開字典”,從彈出的選框中,選擇需要查看的 App。這里選擇 Evernote。
打開 Evernote Applescript 字典后發現其有 2 個系列(基于可以做的“動作”):
-
標準系列:系統統一定義的一些標準的動作,比如:selection, exists, move 等。
這里有個小坑,有一定編程經歷的人才能比較好地理解:看文檔描述,這個系列的動作一般是普遍的描述。看了幾個官方的 App 的字典描述,也沒有特別的。但是,這些動作實際使用中確是針對當前 App 的,其背后的使用要基于你的經驗來“猜”了。比如下邊貼出的代碼中,就使用了 exists, move 二個標準的動作,但是如何用?猜的。
-
Evernote特定的。
如果這里某些你想要的功能沒有,你可以看看標準系列是不是某些動作可能是實現了這個功能。嗯,我是這樣做的:)
下圖是微信提供的 Applescript 字典。我們看到目前微信只支持一個功能:可以發起一個聊天。

實現代碼
先貼在 Script Editor 里要寫的代碼。簡單幾行(暫無復雜的容錯)。
tell application "Evernote"
if not (exists notebook "Archive") then
create notebook "Archive"
end if
set noteList to selection
repeat with theNote in noteList
move theNote to notebook "Archive"
end repeat
end tell
簡單解釋:
- 操作對象是:application “Evernote”
- 檢查是否存在名稱 “Archive” 的 notebook,如果沒有則創建一個
- 把當前選項的 note,賦值到 noteList 變量(這里可以做更多的容錯)
- 循環處理 noteList
- 把處理的 theNote 移動到名稱為 “Archive” 的 notebook
具體的操作
編寫 Applescript 腳本
打開 Applescript 腳本編輯器,輸入上述代碼。

點擊“運行”按鈕,即可運行這個腳本。切換到 Evernote 可以看到效果(基于默認情況 Evernote 里筆記瀏覽界面,有選擇的 note),即當前的 note 被移動到了 “Archive” 筆記本。
用 Alfred 來定義快捷鍵
Alfred workflow 具有簡單而強大的功能。如果你自稱喜歡 Mac 但還沒有接觸 Alfred,建議一定看看。推薦池建強老師的入門文章 神兵利器——Alfred。
打開 Alfred Preferences,切換到 Workflows 界面。點擊左下角 + 號,如下圖從 template 添加一個支持 Applescript 的 workflow。

在彈出的輸入框里,會讓你輸入名稱、ID 之類,名稱填寫一個之外,其他可以根據你的定義隨便填。結果就創建成功了一個 workflow。二個圖標中前邊一個是關鍵詞觸發圖標,可以探索下。下邊告訴你加 Hotkey。我們這個功能不需要 keyword。
之后雙擊腳本圖標(Run NSApplescript),在彈出的編輯框里輸入上面所貼的代碼段。

保存代碼后,回到這個 workflow 主界面。點擊右上角 +, Triggers, HotKey。如下圖。

至此大功告成,workflow 定義搞定了。
切換到 Evernote 界面,選擇一個 note(或者多個),按 ctrl + option + e,則被移到 Archive 筆記本。
要下載與使用這個 workflow 請參考文章:為 Evernote 添加 Archive 功能快捷鍵
用服務來定義快捷鍵
Mac 內置的為你定制的功能可以定義快捷操作的方式,就是創建一個服務。
創建服務要用到 Mac 里另外一個內置工具,叫 Automator。打開這個應用,按照如下圖所示做基本的選項,輸入上文提到的功能實現 Applescript 腳本。

針對創建的這個服務,定義快捷鍵,需要進到另外一個界面:系統設置 -> 鍵盤 -> 快捷鍵,你剛才創建的服務在這個服務列表里有了。找到它,雙擊后邊區域,出現一個輸入框,按組合鍵,輸入你想要的快捷鍵。這就是定義好了,就可以按剛才的組合快捷鍵來操作功能了。

Magic
本人也是剛接觸 Applescript,感覺它的確很好用。每個基于 Mac 電腦工作的人,一定可以基于 Applescript 定制幾個功能組合來提高其生產效率 - 原來 N 個步驟完成的動作,減少為一個步驟。
Alfred workflow 可以減輕這個工作的復雜度。它需要更少的編程能力。但如果稍復雜的功能,尤其是涉及到某個 App 內部操作的,則還是要借助 Applescript 了。
舉個例子。我現在用 Markdown 來寫作,有很多截圖要做。我的步驟是:1)截圖;2)打開七牛網站相應界面上傳圖片拿到圖片URL(這里N個動作);3)寫 Markdown 格式的圖片鏈接。
如果長期大量地文章中要貼圖片,有個工具能夠按幾下鍵上面的動作就自動完成,該節省多少人肉啊。能夠實現成什么樣?請腦補。
編程界向來有個理想:普通人,任何人都可以編程。Applescript 是 Apple 的努力之一。還有很多其他的努力,以后弄篇文章專說。但結果如何呢?
資源
- Evernote 官方 Applescript 示例文檔:Wrangle Evernote with AppleScript
- 另外一篇用 Applescript 完善 Evernote 里功能的文檔:用AppleScript增強Mac下Evernote的編輯能力