Variable Expansion in Applescript

AppleScript 是 Apple 平臺 用來操控系統(tǒng)及 app 的一種腳本語言, 簡單使用時非常便利, 但是在一些靈活場景下便難以勝任, 這篇談談我遇到的 variable expansion
問題

himg

事件背景: EuDic 提供了 AppleScript 腳本控制功能, 我想要寫一個 AppleScript 腳本來快速查找單詞, 但是 EuDic 有 Pro / Lite 兩種版本,

  • Pro
    • app name: Eudic.app
    • bundle id: com.eusoft.eudic
  • Lite
    • app name: Eudb_en_free.app
    • bundle id: com.eusoft.freeeudic

因此我必須在腳本中區(qū)分出用戶安裝的版本, 然后進行相應版本的調用

在腳本編寫過程中, 我發(fā)現(xiàn) AppleScript 在某些位置是不支持 variable expansion

-- script1.applescript
set appName to "EuDic"
tell application "System Events"
    tell application appName
        activate
        show dic with word "hello"
    end tell
end tell
-- script2.applescript
tell application "System Events"
    tell application "EuDic"
        activate
        show dic with word "hello"
    end tell
end tell

運行 script1 腳本會報錯: script error: Expected end of line, etc. but found identifier. (-2741), 運行 script2.applescript 則完全沒有問題,
這就讓我感到很奇怪了, 難道一個 AppleScript 連 variable expansion 能力都沒有? 經(jīng)過了大量資料查找后, 我發(fā)現(xiàn)它真的沒有這個能力...

因為 AppleScript 編譯器采用了各種技巧來支持那些花哨的類英語關鍵字. 這些技巧中最主要的是尋找 tell application "..." 行, 這樣它就知道在 tell
塊中編譯語句時要查找哪些特定于應用程序的關鍵字.

大多數(shù)情況下, 這對于簡單的代碼來說已經(jīng)足夠了, 但是一旦你想讓你的代碼更加靈活, 這種聰明反而會為你帶來羈絆. 因為腳本直到運行時才提供應用程序名稱,
編譯器在編譯時不知道查找該應用程序的術語, 因此只能使用 AppleScript 中預定義的那些關鍵字和任何加載的 osaxen.

在我們這個例子中, show dict with word 術語是由 EuDic 定義的, 但是直到運行時, AppleScript 才知道他要找的術語是 EuDic 提供的, 這時如果直接運行
show dic with word 術語, 那么就會報錯(在這種情況下, activate 并不會報錯, 因為 activate 是預定義的術語), 對于這種情況,
我在網(wǎng)上找到的解決辦法大致如下:

  1. 直接使用原始 "com.eusoft.eudic"

  2. 將相關代碼包含在 using terms from application ... 塊中. 這明確告知編譯器在編譯所附代碼時從何處獲取附加術語.

    set appName to "EuDic"
    
    tell application "System Events"
        tell application appName
            activate
            using terms from application "EuDic"
                show dic with word "hello"
            end using terms from
        end tell
    end tell
    

很明顯, 上面兩種方式需要直接把 "EuDic" 寫死, 那么到底有沒有方法能在 AppleScript 中動態(tài)地 variable expansion 呢? 我想到了在 Shell 中調用 AppleScript
的方式. 根據(jù) so 的回答, 我們有三種方式可以在 shell 中調用
AppleScript, 其中 Here Doc 方式是支持 variable expandsion 的, 因此我的方案就是 Shell + AppleScript + Here Doc

Shell 的 here doc 默認支持 variable expansion(當然, 我們可以使用引號 <<'EOF' 使該功能關閉), 具體實現(xiàn)如下:

#!/usr/bin/env bash

if [[ -d /Applications/Eudb_en_free.app ]]; then
    eudicID=$(osascript -e 'id of app "Eudb_en_free"')
elif [[ -d /Applications/Eudic.app ]]; then
    eudicID=$(osascript -e 'id of app "Eudic"')
fi

if [[ -z "$eudicID" ]]; then
osascript <<EOF
display dialog "Please install EuDic"
EOF
   exit
fi

osascript <<EOF
tell application "System Events"
    do shell script "open -b $eudicID"
    tell application id "$eudicID"
        activate
        show dic with word "$1"
    end tell
end tell
EOF

這樣, 我們便可以同時利用 AppleScript 的便利性與 Shell 的靈活性了.

這是目前我自己能想到的比較好的解決辦法, 如果你有更好的方法可以留言交流 ??

Project

hanleylee/alfred-eudic-workflow

Ref

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末搏熄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子歼捏,更是在濱河造成了極大的恐慌撮抓,老刑警劉巖回右,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡继薛,警方通過查閱死者的電腦和手機盖腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門爽待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來损同,“玉大人,你說我怎么就攤上這事鸟款「嗳迹” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵何什,是天一觀的道長组哩。 經(jīng)常有香客問我,道長处渣,這世上最難降的妖魔是什么伶贰? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮罐栈,結果婚禮上黍衙,老公的妹妹穿的比我還像新娘。我一直安慰自己悠瞬,他們只是感情好们豌,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浅妆,像睡著了一般望迎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凌外,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天辩尊,我揣著相機與錄音,去河邊找鬼康辑。 笑死摄欲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的疮薇。 我是一名探鬼主播胸墙,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼按咒!你這毒婦竟也來了迟隅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤励七,失蹤者是張志新(化名)和其女友劉穎智袭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掠抬,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吼野,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了两波。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳步。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡闷哆,死狀恐怖,靈堂內的尸體忽然破棺而出谚攒,到底是詐尸還是另有隱情阳准,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布馏臭,位于F島的核電站野蝇,受9級特大地震影響,放射性物質發(fā)生泄漏括儒。R本人自食惡果不足惜绕沈,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帮寻。 院中可真熱鬧乍狐,春花似錦、人聲如沸固逗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烫罩。三九已至惜傲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贝攒,已是汗流浹背盗誊。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隘弊,地道東北人哈踱。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像梨熙,于是被迫代替她去往敵國和親开镣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容