AppleScript名:実行中のコンピュータのアイコン画像を取得してデスクトップにPNG形式で保存 |
— Created 2016-02-09 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" –Get Computer Icon set anImage to current application’s NSImage’s imageNamed:(current application’s NSImageNameComputer) set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/" set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png") set fRes to saveNSImageAtPathAsPNG(anImage, savePath) of me –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –成功ならtrue、失敗ならfalseが返る end saveNSImageAtPathAsPNG |
カテゴリー: System
USBゲームコントローラーの情報を取得する
MacにUSB接続しているゲームコントローラーの情報を取得するAppleScriptです。
あくまでUSB接続しているコントローラーに限られ、同時にBluetooth接続のゲームコントローラー(PlayStation 3用のDual Shock3)があっても無視されるようです。
AppleScript名:USBゲームコントローラーの情報を取得する |
— Created 2017-03-21 18:47:15 +0900 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "GameController" set aController to current application’s GCController’s controllers() –> (NSArray) {(_GCController) <GCController 0x6080004a2580 vendorName=’USB Game Device’ deviceHash=0xbe8dba5719e63307>} set aCon to aController’s firstObject() if aCon = missing value then return set aGameCon to aCon’s gamepad() –> (_GCMFiGamepadControllerProfile) <_GCMFiGamepadControllerProfile: 0x6000000df870> set aExGameCon to aCon’s extendedGamepad() –> missing value set aMicGameCon to aCon’s microGamepad() –> (_GCMFiGamepadControllerProfile) <_GCMFiGamepadControllerProfile: 0x6000000df870> set aMotion to aCon’s motion() –> missing value set aVendor to aCon’s vendorName() as string –> "USB Game Device" set anAttached to aCon’s isAttachedToDevice() –> false |
指定名称のアプリケーションをフルスクリーン表示
指定名称のアプリケーションをフルスクリーン表示するAppleScriptです。
AppleScript自体とフルスクリーン表示の相性はよくありません。操作対象のGUIアプリケーションとスクリプトエディタ(Script Debuggerでも可)と最低でも2つのウィンドウがオープンしていることが望ましいので、Scriptを書いている最中でフルスクリーン表示というのはありえません。
ただ、運用段階でフルスクリーン表示をしたい、というニーズがないこともないので、やり方を調べておきました。
AppleScript名:指定名称のアプリをフルスクリーン表示 |
— Created 2015-07-29 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions set a to "Safari" set aRes to dispAppWithFullScreen(a) of me –指定名称のアプリケーション(起動中のもの)をフルスクリーン表示 on dispAppWithFullScreen(applicationName) set appName to returnExactNameOfAnApp(applicationName) if appName = false then return false –指定のアプリがなかった、あるいはアプリケーション名を間違って指定した set pID to id of application appName tell application appName reopen activate end tell tell application "System Events" tell (process 1 whose bundle identifier is pID) set b1List to every button of window 1 whose subrole is "AXFullScreenButton" –Full Screen set b2List to every button of window 1 whose subrole is "AXZoomButton" –Zoom if b1List = {} then set targB to first item of b2List –フルスクリーン表示機能を持たないアプリの場合 else set targB to first item of b1List –フルスクリーン表示機能を持つアプリの場合 end if click targB end tell end tell return true end dispAppWithFullScreen –Displayed Nameでアプリケーション名が与えられた場合に、正しい名称を返す on returnExactNameOfAnApp(aName) tell application "System Events" set ap1List to every process whose name is equal to aName if ap1List = {} then set ap1List to every process whose displayed name is equal to aName if ap1List = {} then return false end if set anApp to contents of first item of ap1List return name of anApp end tell end returnExactNameOfAnApp |
mouseClickを用いて指定座標をクリック
ネット上に転がっていたサンプルコードをかき集めて作ったmouseClick.frameworkを用いて指定座標のクリックを行うAppleScriptです。
# ご注意:マウスカーソルの移動やクリックを行うのは、本来のAppleScriptの処理ではありません
# ご注意:他のマシン上で同じ動作を再現することが(初心者には)難しいため、おすすめしません
強制的なマウスカーソル移動とクリック(プレスともいいますね)は、「仕方なくほかに方法がなくなった場合」の、アプリケーション操作の最終手段です。やらないに越したことはない「必要悪」ともいえます。Automatorの作業記録機能が「クリック座標を記録する」という仕組みで実装されているため、AutomatorからAppleScriptに移ってきたユーザーがその調子で組もうとしてドツボにハマる姿がたまに見られます。
step1: 対象のGUIアプリケーションがAppleScript対応であれば、AppleScript用語辞書を調べて、目的の機能が呼び出せるかを確認する
step2: 対象のGUIアプリケーションの特殊機能(Custom URL Protocolなど)で目的の機能が呼び出せないかを確認する(URL Protocolだと非同期実行なので、あまり当てにならないので役に立たないケース多し)
→ とくに、Maps.appではURL Protocol経由で、しかもCustom URL schemeでもなく、http://maps.apple.comで操作するようになっています
step3: step1,2で目的の機能が呼び出せないことがわかったら、GUI Scripting経由で(メニューやボタンを操作して)呼び出せないかを試す
step4: step3でもどうしても呼び出せない場合に、GUI Scriptingで座標を指定してクリックイベントを送るという操作をためす
step5: ごくまれに、step4でも操作できないアプリケーションがある。AdobeのCreativeアプリケーションはポップアップメニューの内容を毎回プログラムから再生成していたりして、これがGUI Scriptingでも操作できない事態を引き起こす。この段階でマウスの強制移動とクリックの使用が検討される
これまで、古い仕組みを使ってマウスカーソル移動とクリックを行なっていましたが、とうとうmacOS 10.13で動かなくなり(これはバグではなく仕方ない話。OS X 10.6あたりでDeprecatedになったので)、代替手段を探していました。
CGEventRef mousedown = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, mousedown);
CGEventRef mouseup = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, point, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, mouseup);
こんな感じでカーソル移動とクリックを行なっています。サンプルコードではCGPointでパラメータを受け渡していましたが、AppleScriptから呼びやすいようにNSPointで座標値を受け渡すよう書き換えてみました。
本Framework+AppleScript「mouseClickを用いて指定座標をクリック v2」はmacOS 10.13上で動きます。
–> mouseClick.framework (To ~/Library/Frameworks/)
後日談:
なぜか、CGPostMouseEventの機能はmacOS 10.14でふたたび使えるようになり、macOS 12上でも動作しています。deprecatedとは?
AppleScript名:mouseClickを用いて指定座標をクリック v2 |
— Created 2018-03-10 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "mouseClick" use scripting additions my clickAt(100, 10) on clickAt(newX, newY) set aPoint to current application’s NSMakePoint(newX, newY) current application’s ForceClick’s alloc()’s init()’s click:aPoint end clickAt |
AppleScript名:ASOCでマウスの強制移動とクリック(macOS 10.12まで) |
— Created 2015-10-04 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" –max version macOS 10.12 use scripting additions use framework "Foundation" use framework "ApplicationServices" use framework "Quartz" my clickAt(100, 10) on clickAt(newX, newY) set pt to current application’s CGPointZero set x of pt to newX set y of pt to newY current application’s CGPostMouseEvent(pt, 1, 1, 1) current application’s CGPostMouseEvent(pt, 1, 1, 0) end clickAt |
Mail.appで選択中のメールからMessage IDを取得する
MailCore2.frameworkを利用して、Mail.app上で選択中のメールのヘッダーからMessage IDを取得するAppleScriptです。
Mail.appから取得したヘッダーテキストから、MailCore2.frameworkでヘッダーオブジェクトを生成し、同フレームワークの機能を利用してMessage IDを取得します。1メールあたり0.03秒ぐらいで取得します。
ヘッダーのテキストを行単位でparseしてサーチしても全然いいのですが、メール関連は割と込み入った仕様がてんこ盛りなので、AppleScriptでもMailCore2をよく活用しています。
もはや、MailCore2がないとできない処理が多すぎて、これが使えないとけっこう泣きが入ります。
MailCore.framework(To ~/Library/Frameworks/)
AppleScript名:Mail.appで選択中のメールからMessage IDを取得する.scptd |
— – Created by: Takaaki Naganoya – Created on: 2018/03/12 — – Copyright © 2018 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions use framework "MailCore" –https://github.com/MailCore/mailcore2 tell application "Mail" set a to selection if a = {} then error "No Selection" set aa to first item of a set aSource to source of aa –メールのソースを取得 end tell set aStr to current application’s NSString’s stringWithString:aSource set aData to aStr’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set aHeader to current application’s MCOMessageHeader’s headerWithData:aData set aMessageID to (aHeader’s messageID()) as string –> "0A23983C-81B0-4E33-9C0B-B4A934A0E284@xxxxxx-xxx.xxx.xx" |
Enable Script Menu
メニューバー上にあるScript Menuを表示状態に設定変更するAppleScriptです。
Script Menuの表示・非表示はスクリプトエディタ内の環境設定で制御するようになっていますが、Script Menu自体はMenu Extraでスクリプトエディタとは独立して動作しているので、外部からオンにすることが可能です。
▲Default
▲実行後
AppleScript名:Enable System Wide Script Menu |
tell application "Finder" open (POSIX file "/System/Library/CoreServices/Menu Extras/Script Menu.menu") as alias end tell |
AppleScript名:Enable System Wide Script Menu (Shell) |
do shell script "open " & quoted form of "/System/Library/CoreServices/Menu Extras/Script Menu.menu" |
追記:macOS 10.14でOS標準装備のScript MenuがMenu Extraから単体のアプリケーションに変更になったので、Enableの方法も変更になりました。
AppleScript名:Enable System Wide Script Menu_10.14.scpt |
tell application "Finder" open (POSIX file "/System/Library/CoreServices/Script Menu.app") as alias end tell |
defaultsAppLibを呼び出してURLスキームに対応するアプリケーション情報を取得、設定
defaultappを呼び出して、指定のURLスキームに対応するdefault applicationを取得したり設定したりするAppleScriptです。
–> defaultAppLib (To ~/Library/Script Libraries/)
AppleScript名:defaultsAppLibを呼び出してURLスキームに対応するアプリケーション情報を取得、設定 |
use AppleScript version "2.4" use scripting additions use defautApLib : script "defaultAppLib" –https://github.com/Grayson/defaultapp –指定のURLスキームに対応するアプリケーションのパスを取得 set aRes to getDefaultAppForScheme("http") of defautApLib –> "/Applications/Safari.app" set bRes to getDefaultAppForScheme("ftp") of defautApLib –> "/Applications/Transmit.app" –指定のURLスキームに対応するアプリケーションを設定 set cRes to setDefaultAppForScheme("ftp", "Safari") of defautApLib –> true –指定のURLスキームに対応するアプリケーションのパスを取得(再確認) set dRes to getDefaultAppForScheme("ftp") of defautApLib –> "/Applications/Safari.app" |
光学ドライブ情報の取得
AppleScript名:光学ドライブ情報の取得.scptd |
— – Created by: Takaaki Naganoya – Created on: 2018/03/10 — – Copyright © 2018 Piyomaru Software, All Rights Reserved — use AppleScript version "2.5" — El Capitan (10.11) or later use framework "Foundation" use scripting additions set dInfoList to getOpticalDrivesInfo() of me –> {{driveNum:"1", vendorName:"BUFFALO", productName:"Optical Drive", supportLevel:"Unsupported", revisionNo:"BFT6", busName:"USB", suppoortLevel:"Unsupported"}, {driveNum:"2", vendorName:"MATSHITA", productName:"BD-MLT UJ240AS", supportLevel:"Unsupported", revisionNo:"1.00", busName:"USB", suppoortLevel:"Unsupported"}} –光学ドライブの情報を返す on getOpticalDrivesInfo() set dList to paragraphs of (do shell script "drutil list") set d2List to removeItemFromList(dList, "") of me if length of d2List = 1 then return false –No Optical Drive set d2List to rest of d2List –skip first header row set dMainList to {} repeat with i in d2List set tmpA to (current application’s NSString’s stringWithString:i) set tmpB to (tmpA’s componentsSeparatedByString:" ") as list –parse string by space character set tmpC to removeItemFromList(tmpB, "") of me –remove empty item from list set dNum to first item of tmpC set aVendor to second item of tmpC set supLevel to last item of tmpC set busStr to item -2 of tmpC set revStr to item -3 of tmpC –Product Nameのlist itemをスペースでつないで文字列化 set prodName1 to items 3 thru -4 of tmpC set prodName2 to retStrFromArrayWithDelimiter(prodName1, " ") of me set the end of dMainList to {driveNum:dNum, vendorName:aVendor, productName:prodName2, supportLevel:supLevel, revisionNo:revStr, busName:busStr, suppoortLevel:supLevel} end repeat return dMainList end getOpticalDrivesInfo –1D Listから指定内容の要素をすべて削除する on removeItemFromList(aTargList, aTargValue) set anArray to current application’s NSMutableArray’s arrayWithArray:aTargList repeat set aInd to anArray’s indexOfObject:aTargValue –macOS 10.12〜10.13.0までのNSNotFoundの値定義の間違いというAppleの恥ずかしいバグに対処 if aInd = current application’s NSNotFound or (aInd as real > 9.99999999E+8) then exit repeat anArray’s removeObjectAtIndex:aInd end repeat return anArray as list end removeItemFromList –リストを指定デリミタをはさんでテキスト化 on retStrFromArrayWithDelimiter(aList, aDelim) set anArray to current application’s NSArray’s arrayWithArray:aList set aRes to anArray’s componentsJoinedByString:aDelim return aRes as text end retStrFromArrayWithDelimiter |
使用メモリーの状況を取得
AppleScript名:使用メモリーの状況を取得 |
— Created 2017-12-17 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set mRes to retMemoryUsage() of me –> {usedMem:7928, wiredMem:1763, unusedMem:257} on retMemoryUsage() set memRes to do shell script "top -l 1 | head -10 | grep ’PhysMem’" set aRes to (parseStrFromTo(memRes, " ", "M") of me) set bList to {} repeat with i in aRes set mRes to returnNumberOnly(i) of me set the end of bList to mRes end repeat set usedNum to contents of first item of bList set wiredNum to contents of second item of bList set unusedNum to contents of third item of bList return {usedMem:usedNum as integer, wiredMem:wiredNum as integer, unusedMem:unusedNum as integer} end retMemoryUsage on parseStrFromTo(aParamStr, fromStr, toStr) set theScanner to current application’s NSScanner’s scannerWithString:aParamStr set anArray to current application’s NSMutableArray’s array() repeat until (theScanner’s isAtEnd as boolean) — terminate check, return the result (aDict) to caller set {theResult, theKey} to theScanner’s scanUpToString:fromStr intoString:(reference) — skip over separator theScanner’s scanString:fromStr intoString:(missing value) set {theResult, theValue} to theScanner’s scanUpToString:toStr intoString:(reference) if theValue is missing value then set theValue to "" –>追加 — skip over separator theScanner’s scanString:toStr intoString:(missing value) anArray’s addObject:theValue end repeat return anArray as list end parseStrFromTo on returnNumberOnly(aStr) set anNSString to current application’s NSString’s stringWithString:aStr set anNSString to anNSString’s stringByReplacingOccurrencesOfString:"[^0-9]" withString:"" options:(current application’s NSRegularExpressionSearch) range:{0, anNSString’s |length|()} return anNSString as text end returnNumberOnly |
ディスク使用状況を取得
AppleScript名:ディスク使用状況を取得 |
— Created 2017-12-17 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set dRes to diskUsage() of me –> {readSector:8557760, readSize:"152G", writeSecotr:2601227, writeSize:"100G"} on diskUsage() set dRes to (do shell script "top -l 1 | head -10 | grep ’Disks:’") set dList to words of dRes set readSectorNum to (contents of item 2 of dList) as integer set readSizeNum to contents of item 3 of dList set writeSectorNum to (contents of item 5 of dList) as integer set writeSizeNum to contents of item 6 of dList return {readSector:readSectorNum, readSize:readSizeNum, writeSecotr:writeSectorNum, writeSize:writeSizeNum} end diskUsage |
ネットワーク使用状況を取得
AppleScript名:ネットワーク使用状況を取得 |
— Created 2017-12-17 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set nRes to networkUsage() of me –> {inPacket:4904085, inSize:"5444M", outPacket:3426539, outSize:"396M"} on networkUsage() set nRes to (do shell script "top -l 1 | head -10 | grep ’Networks: packets:’") set nList to words of nRes set inPackNum to (contents of item 3 of nList) as integer set inSizeNum to (contents of item 4 of nList) set outPackNum to (contents of item 6 of nList) as integer set outSizeNum to (contents of item 7 of nList) return {inPacket:inPackNum, inSize:inSizeNum, outPacket:outPackNum, outSize:outSizeNum} end networkUsage |
get battery info v2
バッテリー関連の情報を取得するAppleScriptです。
ioregコマンドなどでハードウェア周りの情報を取得する方法は昔から知られており、有益な情報を利用できます。
本ScriptはCocoaの機能も使っておらず、割と古めな構造のものですが、安定して動作しているので使い続けています。
もともと、本Scriptのファイル名は「バッテリ情報を取得.scpt」というものでしたが、「バッテリ情報を取得 v2.scpt」にFinder上でリネームしようとしたら、「ファイル名が長すぎるか、句読点を含まないファイル名に変更してくれ」というエラーをmacOS 10.12および10.13のFinderが出力して、仕方なく英語のファイル名にリネームしました。
# 10.14.6でも10.15.1でも発生しています
macOSのどこのバージョンだかわからないのですが、おそらくファイル名の入力時に001Dのような不可視キャラクタが混入し、Finder上でリネームできなくなるようです。日本語環境でのみ発生する問題と思われます。
AppleScript名:get battery info v2 |
set bInfo to getBatteryInfo() of batteryKit –> {CurrentCapacity:5129, MaxCapacity:5265, DesignCapacity:8460, CycleCount:478} script batteryKit on getBatteryInfo() –ハードウェアの識別文字列を取得 set machineType to do shell script "sysctl -n hw.model" –MacBook Proを検出したら、あるいは結果にMacBookの文字列が入っていなかったら終了 if machineType does not contain "MacBook" then return {CurrentCapacity:0, MaxCapacity:0, DesignCapacity:0} end if –MacBookだけ処理続行 –ハードウェア情報を取得 set batCom to "ioreg -p IOService -n AppleSmartBattery -w 0" set a to do shell script batCom set aList to every paragraph of a set itemCount to 1 set hitF to false repeat with i in aList set j to contents of i if j contains "AppleSmartBattery <class AppleSmartBattery" then set resList to items (itemCount + 2) thru (itemCount + 29) of aList set hitF to true exit repeat end if set itemCount to itemCount + 1 end repeat if hitF = false then return set findAttrList to {"CurrentCapacity", "MaxCapacity", "DesignCapacity", "CycleCount"} set hitList to {} repeat with i in findAttrList set j to string id 34 & contents of i & string id 34 repeat with ii in resList set jj to contents of ii if jj contains j then set the end of hitList to jj exit repeat end if end repeat end repeat –現在のバッテリーの容量を取得 set curCap to parseAfterSpecifiedChar("=", contents of item 1 of hitList) of me set curCap to curCap as number –バッテリーの最大容量を取得 set maxCap to parseAfterSpecifiedChar("=", contents of item 2 of hitList) of me set maxCap to maxCap as number –バッテリーの最大容量を取得 set designCap to parseAfterSpecifiedChar("=", contents of item 3 of hitList) of me set designCap to designCap as number –バッテリーの充放電回数を取得 set cCount to parseAfterSpecifiedChar("=", contents of item 4 of hitList) of me set cCount to cCount as number return {CurrentCapacity:curCap, MaxCapacity:maxCap, DesignCapacity:designCap, CycleCount:cCount} end getBatteryInfo –対象文字列(aData)の中で、aCharの文字以降を取得 on parseAfterSpecifiedChar(aChar, aData) set aPos to offset of aChar in aData set resText to text (aPos + (length of aChar)) thru -1 of aData return resText end parseAfterSpecifiedChar end script |
指定アプリケーションのヘルプブック内の指定アンカーを表示する
指定名称のアプリケーションのヘルプブック内で指定アンカーを表示するAppleScriptです。
HelpBookを表示するOS標準搭載アプリケーション「HelpViewer」は一応AppleScript対応のスクリプタブルなアプリケーションなので、AppleScriptからコントロールできるのですが、経験上あまり信頼性がない(コマンドを無視して、表示しないことがある)ので、Cocoa経由でアンカー指定表示を行わせてみました。
Cocoa経由でもすぐに応答は返ってこないのですが、(HelpViewerの起動を含めて)数秒待たされて結果が表示される感じです。
HelpBookは、いわば「フローティング表示する、おそいWebブラウザ」で、かつてはWebコンテンツ内からAppleScriptの実行も指定できたため、一時期「Mac OS Xで有名なセキュリティーホール」として注目を集めました。URLイベント経由でScriptの実行を指定できてしまうとか、便利ではあったもののセキュリティーホールと言われればセキュリティホールです(注:すぐにふさがれました & この前後からローカルでのURLプロトコルの監視がきつくなりました)。
AppleScript名:指定アプリケーションのヘルプブック内の指定アンカーを表示する |
— Created 2017-04-18 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set anAppName to "Script Editor" set aTargAnchor to "scpedt1126" —-https://help.apple.com/scripteditor/mac/10.12/index.html?localePath=ja.lproj#/scpedt1126 set hRes to openHelpBook(anAppName, aTargAnchor) of me –指定アプリケーションのヘルプブックで、指定アンカーを表示する on openHelpBook(anAppName, aTargAnchor) set locBookName to getHelpBook(anAppName) of me if locBookName = false then return false current application’s NSHelpManager’s sharedHelpManager()’s openHelpAnchor:aTargAnchor inBook:locBookName end openHelpBook –指定アプリケーションのヘルプブック名称を取得する on getHelpBook(anAppName) set aWorkspace to current application’s NSWorkspace’s sharedWorkspace() set appPath to aWorkspace’s fullPathForApplication:anAppName if appPath is equal to missing value then return false set locBookName to (current application’s NSBundle’s bundleWithPath:appPath)’s objectForInfoDictionaryKey:"CFBundleHelpBookName" if locBookName is equal to missing value then return false –> "com.apple.ScriptEditor.help" return locBookName end getHelpBook |
AppleScript名:help_sample |
tell application "HelpViewer" activate try lookup anchor "scpedt1126" in book "com.apple.ScriptEditor.help" end try end tell |
指定アプリケーションのヘルプブック内で指定キーワードを検索する
指定名称のアプリケーションのヘルプブック内で指定キーワードを検索するAppleScriptです。
HelpBookを表示するOS標準搭載アプリケーション「HelpViewer」は一応AppleScript対応のスクリプタブルなアプリケーションなので、AppleScriptからコントロールできるのですが、経験上あまり信頼性がない(コマンドを無視して、表示しないことがある)ので、Cocoa経由で検索・表示を行わせてみました。
Cocoa経由でもすぐに応答は返ってこないのですが、(HelpViewerの起動を含めて)数秒待たされて結果が表示される感じです。
AppleScript名:指定アプリケーションのヘルプブック内で指定キーワードを検索する |
— Created 2017-04-18 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set anAppName to "Script Editor" set aTargString to "用語説明" –"Script Dictionary" in Japanese set hRes to searchHelpBook(anAppName, aTargString) of me –指定アプリケーションのヘルプブックで、指定アンカーを表示する on searchHelpBook(anAppName, aTargString) set locBookName to getHelpBook(anAppName) of me if locBookName = false then return false current application’s NSHelpManager’s sharedHelpManager()’s findString:aTargString inBook:locBookName end searchHelpBook –指定アプリケーションのヘルプブック名称を取得する on getHelpBook(anAppName) set aWorkspace to current application’s NSWorkspace’s sharedWorkspace() set appPath to aWorkspace’s fullPathForApplication:anAppName if appPath is equal to missing value then return false set locBookName to (current application’s NSBundle’s bundleWithPath:appPath)’s objectForInfoDictionaryKey:"CFBundleHelpBookName" if locBookName is equal to missing value then return false –> "com.apple.ScriptEditor.help" return locBookName end getHelpBook |
▼AppleScript経由でHelpViewerにコマンドを発行してキーワード検索させたところ。検索が実行されない。
AppleScript名:HelpViewerで検索する?(コマンドを実行しても検索結果が表示されない) |
tell application "HelpViewer" activate search looking for "用語説明" end tell |
AppleScriptの構文色分けカラーフォーマットをplistから読み込む
AppleScriptの構文色分けフォーマットをplistから読み込むAppleScriptです。
ただし、本Scriptで取得した色情報はスクリプトエディタ上で設定した内容と若干RGB値が異なるため、色情報をもとに構文要素を判定するような処理に本Scriptをそのまま用いることは推奨しません。
AppleScript名:AppleScriptの構文色分けカラーフォーマットをplistから読み込む |
— Created 2013-11-11 by Shane Stanley — Changed 2014-12-14 by Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" set cList to getAppleScriptSourceColors() of me –> {{redValue:37265, greenValue:10280, blueValue:37008, fontName:"Osaka", fontSize:13.0}, {redValue:15672, greenValue:3071, blueValue:15832, fontName:"Osaka", fontSize:13.0}, {redValue:3598, greenValue:15934, blueValue:64507, fontName:"Osaka", fontSize:13.0}, {redValue:30840, greenValue:13364, blueValue:52171, fontName:"Osaka", fontSize:13.0}, {redValue:64764, greenValue:10794, blueValue:7196, fontName:"Osaka", fontSize:13.0}, {redValue:0, greenValue:0, blueValue:0, fontName:"Osaka", fontSize:13.0}, {redValue:37265, greenValue:21074, blueValue:4369, fontName:"Osaka", fontSize:13.0}, {redValue:0, greenValue:0, blueValue:0, fontName:"Osaka", fontSize:13.0}, {redValue:10023, greenValue:51657, blueValue:51657, fontName:"Osaka", fontSize:13.0}, {redValue:3855, greenValue:15934, blueValue:64507, fontName:"Osaka", fontSize:13.0}, {redValue:7967, greenValue:46774, blueValue:64764, fontName:"Osaka", fontSize:13.0}, {redValue:33153, greenValue:14906, blueValue:55769, fontName:"Osaka", fontSize:13.0}, {redValue:23901, greenValue:13878, blueValue:37522, fontName:"Osaka", fontSize:13.0}, {redValue:47484, greenValue:3164, blueValue:32926, fontName:"Osaka", fontSize:13.0}, {redValue:6491, greenValue:47213, blueValue:32320, fontName:"Osaka", fontSize:13.0}, {redValue:40001, greenValue:37149, blueValue:1331, fontName:"Osaka", fontSize:13.0}, {redValue:20379, greenValue:0, blueValue:35059, fontName:"Osaka", fontSize:13.0}, {redValue:4539, greenValue:35536, blueValue:35798, fontName:"Osaka", fontSize:13.0}} –AppleScriptの構文色分けのカラー値をRGBで取得する on getAppleScriptSourceColors() — get the info as a dictionary set thePath to current application’s NSString’s stringWithString:"~/Library/Preferences/com.apple.applescript.plist" set thePath to thePath’s stringByExpandingTildeInPath() set theInfo to current application’s NSDictionary’s dictionaryWithContentsOfFile:thePath — extract relevant part and loop through set theArray to (theInfo’s valueForKey:"AppleScriptSourceAttributes") as list set colList to {} repeat with i from 1 to count of theArray set anEntry to item i of theArray log anEntry set colorData to NSColor of anEntry set theColor to (current application’s NSUnarchiver’s unarchiveObjectWithData:colorData) set {rVal, gVal, bVal} to retColListFromNSColor(theColor, 65535) of me set fontData to NSFont of anEntry set theFont to (current application’s NSUnarchiver’s unarchiveObjectWithData:fontData) set aFontName to theFont’s displayName() as text set aFontSize to theFont’s pointSize() set aColRec to {redValue:rVal, greenValue:gVal, blueValue:bVal, fontName:aFontName, fontSize:aFontSize} set the end of colList to aColRec end repeat return colList end getAppleScriptSourceColors –NSColorからRGBの値を取り出す on retColListFromNSColor(aCol, aMAX as integer) set aRed to round ((aCol’s redComponent()) * aMAX) rounding as taught in school set aGreen to round ((aCol’s greenComponent()) * aMAX) rounding as taught in school set aBlue to round ((aCol’s blueComponent()) * aMAX) rounding as taught in school if aRed > aMAX then set aRed to aMAX if aGreen > aMAX then set aGreen to aMAX if aBlue > aMAX then set aBlue to aMAX return {aRed, aGreen, aBlue} end retColListFromNSColor |
指定パスのAppleScript書類がコンパイル済みかどうかチェック
AppleScript名:指定パスのAppleScript書類がコンパイル済みかどうかチェック |
— Created 2014-12-16 by Takaaki Naganoya — 2014 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "OSAKit" property |NSURL| : a reference to current application’s |NSURL| property OSAScript : a reference to current application’s OSAScript –指定AppleScriptがコンパイルずみ(中間コードへの翻訳の意)かどうかをしらべる set a to (choose file of type {"com.apple.applescript.script-bundle", "com.apple.applescript.script", "com.apple.applescript.text"}) set asRes to chkAScompiled(a) as list of string or string –> true or false –指定のAppleScriptファイルがコンパイル(構文確認+中間言語化)ずみかどうかを取得する on chkAScompiled(anAlias as {alias, string}) set aURL to |NSURL|’s fileURLWithPath:(POSIX path of anAlias) set asO to OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value) try set compF to asO’s isCompiled() as boolean return compF on error return false end try end chkAScompiled |
nameを指定してOSA言語のインスタンスを生成する
name(名称)を指定してOSA言語のインスタンスを生成するテストを行うAppleScriptです。
このあたりの話は、スクリプトエディタ上では直接取得できますし、コマンドラインからだとosalangコマンドを実行すれば名称一覧を取得できます。Cocoa経由でどの程度の情報が取得できるのか、ちょっと試してながらく放置したままになっていました。
再度、OSAKit系の情報を探してみても……見当たらない(ーー;
以前にAppleEvent Managerのドキュメントをまるごとオフラインにしていた前科があるので、担当に「(オフラインになっていて)見えないんだけど?」と確認したところ………
「何が見えないんだ? 最初からそんなもんないぞ。これまでにドキュメントを作ったこともない」
と言われる始末。余計悪いわ(ーー;;;
というわけで、Web上にドキュメントが掲載されていないOSAKit系の情報については、Xcode上から、以下のように操作してヘッダーファイルの内容を確認することが必要なようです。
AppleScript名:nameを指定してOSA言語のインスタンスを生成する |
— Created 2018-03-05 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "OSAKit" property OSALanguage : a reference to current application’s OSALanguage property OSALanguageInstance : a reference to current application’s OSALanguageInstance set anOSALanguageInstance to OSALanguageInstance’s languageInstanceWithLanguage:(OSALanguage’s defaultLanguage()) set aLanguage to anOSALanguageInstance’s |language|()’s |name|() as string –> "AppleScript" set bLanguage to OSALanguage’s languageForName:"AppleScript" set bName to bLanguage’s |name|() as string –> "AppleScript" set cLanguage to OSALanguage’s languageForName:"JavaScript" set cName to cLanguage’s |name|() as string –> "JavaScript" set langArray to (OSALanguage’s availableLanguages()’s valueForKeyPath:"name") as list –> {"AppleScript", "JavaScript"} |
Script Editorをコントロールして各構文要素の色情報を取得する v5
Script Editorをコントロールして、AppleScriptの各構文要素の色情報を取得するAppleScriptです。
AppleScriptの構文要素の色分けを取得するのに、当初はplistファイルから読み込んでいたのですが、途中から(Mac OS X 10.5あたり?)plistファイルのフォーマットがテキスト形式からバイナリ形式に変更になり、AppleScriptから読み込んでも判定できない内容になりました(Cocoaの機能を使うと読み取れるのですが)。
そこで、「プログラム的には意味はないが、対象の構文要素が入っているテキスト」でAppleScriptを新規ドキュメントを作成してコンパイル(構文確認)を実行。新規ドキュメントからリッチテキストとして書式情報を取得し、想定した文字の位置から指定構文要素に対応する色情報を取得します。
plistの保存形式が途中で変更されたのとは別に、書式つきテキスト(attribute runs)の挙動もOSバージョンによって微妙に変わってきました。
同じデータを与えても、書式の区切りが微妙に変わって、書式(色)情報を固定の箇所から読み取っていてはそのようなOSバージョン変更に伴う挙動の微妙な変更に対応し切れませんでした。そのため、文字列をサーチして毎回動的にデータ位置を検出するように書き換えた経緯があります。
本ルーチンは、変数名のリネーム用に作成したので構文要素確認用のダミーテキストは最低限のものだけを含んでいますが、その気になればすべての構文要素の色情報を取得可能です。
これとは別に、Cocoaの機能を用いてplistから構文書式情報を取得するAppleScriptも存在するものの、計算して微妙に色情報が合わないので、9年前に作成した本ルーチンを使い続けています(当時)。
→ さすがに重要なルーチンなので、Cocoa系の機能を使って処理するように書き換えました。いまはCocoa系ルーチンを使っています
AppleScript名:Script Editorをコントロールして各構文要素の色情報を取得する v5 |
— Created 2009-06-01 by Takaaki Naganoya — 2009-2018 Piyomaru Software set scList to getRexicalColorOfScriptEditor() of me –> {{32053, 4213, 32213}, {15672, 3071, 15831}, {2841, 6963, 64125}, {8259, 42547, 64473}, {0, 0, 0}, {32202, 16452, 3889}} –色書式データ。先頭から順番に、、、 –新規テキスト, 演算子など, スクリプティング予約語, コマンド名, 値(数値、データ), 変数およびサブルーチン名 –スクリプトエディタの各構文要素の指定色を返す –v5の変更点:Leopard以降のStyle runsの挙動変化(スペースを分離する/しない)に対応し、動的にサンプル文を走査するようにした –v4の変更点:構文要素検出時のテンポラリウィンドウ作成時にScript Editorを隠す –v3の変更点:重複時のエラー検出を追加 on getRexicalColorOfScriptEditor() set aRes to setVisibleOfSpecifiedProcess("Script Editor", false) of me set rexList to {"+", "set", "application", "Comment", "1", "a"} –文中から検索するテキスト要素 set colList to {} –色情報を入れるリスト tell application "Script Editor" set aDoc to make new document tell front document set aName to name –end tell –tell document aName –未コンパイル時のテキストを取得 set contents to "aaaaa" set rexItem1 to (color of attribute runs) set rexItem1 to contents of (item 1 of rexItem1) set colList to {rexItem1} –各種構文要素を含む文字を入れる set contents to "1 + 1 set a to \"abc\" tell application \"Finder\" end tell –Comment " –追加する場合には、テキストを後ろに追加すること try compile on error close without saving return false end try set rex1 to attribute runs set rex2 to color of attribute runs repeat with i in rexList set j to contents of i set rC to 1 repeat with ii in rex1 set jj to contents of ii set jj to replaceText(jj, " ", "") of me –スペースを削除する if j = jj then set the end of colList to contents of item rC of rex2 exit repeat –抜けていた end if set rC to rC + 1 end repeat end repeat close without saving end tell end tell –Script Editorの再表示 set aRes to setVisibleOfSpecifiedProcess("Script Editor", true) of me –要素の重複検出 set aRes to detectDuplicationSimple(colList) of me if aRes = false then return false else return colList end if end getRexicalColorOfScriptEditor –リスト中の重複検出 on detectDuplicationSimple(cList) copy cList to ccList set j to length of ccList repeat with i from 2 to j set first_item to item 1 of ccList set ccList to rest of ccList if first_item is in ccList then return false end if end repeat return true end detectDuplicationSimple –指定プロセスの可視/不可視切り替え on setVisibleOfSpecifiedProcess(aProc, aBoolean) tell application "System Events" if exists process aProc then set visible of process aProc to aBoolean set resF to true else set resF to false end if end tell return resF end setVisibleOfSpecifiedProcess –任意のデータから特定の文字列を置換 on replaceText(origData, origText, repText) set curDelim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to {origText} set origData to text items of origData set AppleScript’s text item delimiters to {repText} set origData to origData as text set AppleScript’s text item delimiters to curDelim return origData end replaceText |
Terminalで指定コマンドのman pageを表示する
Terminal.appで指定コマンドのman pageを表示するAppleScriptです。
Terminal.appには
{appName:”Terminal”, appBundleID:”com.apple.Terminal”, urlScheme:{“telnet”, “ssh”, “x-man-page”}}
と、いろいろURL Schemeが定義されており、そのうちの1つ、x-man-pageのURL Shcemeを利用して表示させてみました。
AppleScript名:Terminalで指定コマンドのman pageを表示する |
set aCommandName to "ps" set aURL to "x-man-page://" & aCommandName open location aURL |
エンコーダーの情報を取得する
AppleScript名:エンコーダーの情報を取得する |
tell application "iTunes" set anEncoder to current encoder set aProp to properties of anEncoder –> {class:encoder, id:63, index:1, name:"AAC Encoder"} set encList to every encoder –> {encoder id 63 of application "iTunes", encoder id 60 of application "iTunes", encoder id 61 of application "iTunes", encoder id 62 of application "iTunes", encoder id 59 of application "iTunes"} set encnameList to name of every encoder –> {"AAC Encoder", "AIFF Encoder", "Lossless Encoder", "MP3 Encoder", "WAV Encoder"} set encPropList to properties of every encoder –> {{class:encoder, id:63, index:1, name:"AAC Encoder"}, {class:encoder, id:60, index:2, name:"AIFF Encoder"}, {class:encoder, id:61, index:3, name:"Lossless Encoder"}, {class:encoder, id:62, index:5, name:"MP3 Encoder"}, {class:encoder, id:59, index:6, name:"WAV Encoder"}} end tell |