Paepoi

Paepoi » macOS Tips » macOS アプリを JXA (AppleScript) で拡張

macOS アプリを JXA (AppleScript) で拡張

# 最終更新日 2020.01.25

Terminal や Atom で開くのは URL でもイケると解ったので書き換え。
sh 等のスクリプトでも実行パーミッションを付ければ使えると解ったので例を追記。

概要
拡張スクリプトを有効にするには Script Editor.app の設定から
[メニューバーにスクリプトメニューを表示] にチェックを入れます。

img/se.png

メニューに表示されたアイコンをクリックするとスクリプトメニューが出る。
[スクリプトフォルダを開く] で開いたディレクトリに *.scpt か *.js を入れます。
ちなみにパスは以下です。
# 最後の Finder 等がアプリ名
~/Library/Scripts/Applications/Finder

img/sm03.png

*.js の場合はシバンと実行パーミッションを忘れずに。
*.scpt なら実行パーミッションは不要です。

実は Python や sh でも実行パーミッションにて普通に使えます。
ただし選択アイテム等は得ることができませんので下記みたいな使い方で。

Finder での例
Windows の「送る」のように使う(Atom.app での例)
#!/usr/bin/osascript

let uri = Application('Finder').selection()[0].url();

let app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript(`open -a Atom ${uri}`);

/* URL 未対応アプリの場合
let fullpath = decodeURI(Application('Finder').selection()[0].url()).slice(7);
app.doShellScript(`open -a AppName ${fullpath}`);
*/

Retina Display ではスクリーンショットが 144dpi になる。
72dpi に変換し '72dpi-' の接頭子を付けて別名保存する (sh)
#!/usr/bin/osascript

// change72dpi.js

let app = Application.currentApplication();
app.includeStandardAdditions = true;

let selections = Application('Finder').selection();
for (let item of selections) {
    if (item.nameExtension() === 'png') {
        let fullPath = decodeURI(item.url()).slice(7);
        let pos = fullPath.lastIndexOf('/');
        let path = fullPath.substr(0, pos);
        let name = item.name();
        app.doShellScript(`cd '${path}'
        src_width=$(sips -g pixelWidth '${name}' | cut -s -d ':' -f 2 | cut -c 2-)
        width=$(($src_width / 2))
        sips -s dpiHeight 72.0 -s dpiWidth 72.0 -Z $width '${name}' --out '72dpi-${name}'`);
	}
};

端末を使わずに選択ファイルに実行パーミッションを付ける。
#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

let selections = Application('Finder').selection();
for (let item of selections) {
    let path = decodeURI(item.url()).slice(7);
    app.doShellScript(`chmod +x ${path}`);
};

__MACOSX の無い ZIP アーカイブの作成
プロンプトを出してアーカイブ名を決められるオマケ付き
#!/usr/bin/osascript

// create_zip.js (JXA Finder Script)
// Zip compress without '__MACOSX'
// and Ask ZIPFILE name prompt

let app = Application.currentApplication();
app.includeStandardAdditions = true;

// get pwd
let finder = Application('Finder');
let uri = finder.finderWindows()[0].target().url();
let pwd = decodeURI(uri).slice(7, uri.length-1);

// get dirname
let dir = pwd.slice(pwd.lastIndexOf('/')+1);

// ask Archive Name (Default: DirName)
let name = app.displayDialog('Archive Name ?', {
    defaultAnswer:`${dir}`
}).textReturned;

// create command line
if (name != "") {
    // let sh = `tar -zcvf ${name}.tar.gz`; // tar.gz
    let sh = `zip -r ${name}.zip`;
    let selections = finder.selection();
    for (let item of selections) {
        sh += ` ${item.name()}`;
    };

    app.doShellScript(`cd ${pwd}
    ${sh}`);
}

デジカメからコピーした画像等のファイル名を全部小文字に変更
#!/usr/bin/osascript

let selections = Application("Finder").selection();
for (let item of selections) {
    // Get Property
    let s = item.name();
    // Set Property
    item.name = s.toLowerCase();
};

よく開くけど面倒なディレクトリを一発で開く (Quick Action)
#!/bin/sh

open ~/Library/Services

同上 (アプリの plist)
#!/bin/sh

open ~/Library/Preferences

現在 Finder で開いているディレクトリから端末を開始
#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

let uri = Application('Finder').finderWindows()[0].target().url();
app.doShellScript(`open -a Terminal "${uri}"`);

Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.