月別アーカイブ: 2016年10月

JXA: Finder Get Select Item

JXA から Mac の Finder で現在選択しているファイル名を得たい。
そう、筆者が GNOME の Nautilus でやっていることを Mac で再現したい。

Nautilus をスクリプトで拡張 – L’Isola di Niente

環境変数には何も書き込まれないようだ。
sh ではお手上げだな、AppleScript か JXA しか選べない。

JXA で探しても見つからない、意外とみんな活用していないのかな?
まてよ、AppleScript で探せば歴史があるぶん見つかるんでない?

サンプルのページ

なんだ日本語で見つかるじゃん。
筆者は AppleScript の文法なんてド素人だけど雰囲気でなんとか。

tell application "Finder"
	set selectItems to selection
	set everyItems to every item of selectItems
	delete everyItems
end tell

Finder オブジェクトの selection プロパティが選択 Item の配列。
ということで合っているのかな、JXA でやってみる。
ゴミ箱に捨てても意味ないのでダイアログに ls 表示。

ls_dlg.scpt

let selections = Application("Finder").selection();
let ls = selections.length + " item\n";
selections.forEach(function(item) {
    ls += item.name() + "\n";
});

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

今回は scpt でやってみた。
コッチならシバン不要、実行パーミッションを後付けする必要は無い。
更にスクリプトメニューで拡張子が表示されない。

でも肝心な Script Editor.app が残念すぎる。
色分けが即時反映でない、shift+tab も option+↑ 等も使えない。
Gedit や Visual Studio Code に慣れているとイライラするだけ。
生 js で実行パーミッション + テキストエディタが楽でいい。

とにかく Finder で何か選択して実行してみる。

finder_selection

うん、selection オブジェクトは単なる Item 配列として扱えるみたい。
それが解れば後はどうにでもできる、やったね。

つか最近 MacBook Air ばかり使っているような。
マジで大型二輪のサブで 125cc スクーターを買ったみたいな。
一年もすりゃ楽なほうに使用程が逆転するもんだ。

Open new Terminal.app with Finder Current Directory

Mac の Finder から Terminal.app を開きたい。
最初から今開いているディレクトリをカレントディレクトリにして。
もちろん JXA を使って自作拡張スクリプトとして。

日本語で探すとみんなアプリを紹介している。
こういう人達って本当にプログラミングをやっているの???
その程度なら自分で作ろうと考えるのが当然だと思うんですけど。
まあそれはいいとして。

最初は sh でやろうと思ったけど pwd が $HOME になってしまう。
どうやら JXA で Finder から取得する必要があるようだ。

Open a new Terminal window for the current Finder folder – macro – Keyboard Maestro Discourse

やっぱり海外でしか手段が見つからないなぁ。

しかし上記をそのまま拡張ディレクトリに突っ込んでも動かない。
Finder から呼び出すので Finder の有無を調べる必要が無い。
つか何をやっているか解りづらいよ、読みやすく書き替えた。

#!/usr/bin/osascript

let terminal = Application("Terminal");
let finder = Application("Finder").finderWindows();

let uri = finder[0].target().url();
let path = decodeURI(uri).slice(7);

terminal.doScript("cd " + path);
terminal.doScript("clear");
terminal.activate();

このくらい分割すれば何をどうやっているか解ると思う。
しかしこの手段では 1 ページ分スクロールになってしまいイマイチ。
筆者はコッチを勧める。

terminal.js

#!/usr/bin/osascript

let finder = Application("Finder").finderWindows();

let uri = finder[0].target().url();
let path = decodeURI(uri).slice(7);

let app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("open -a Terminal " + path);

と。
open コマンドの最後にフルパスを付ければカレントディレクトリになる。
コイツを実行パーミッションを付加して拡張ディレクトリに移動

chmod +x terminal.js
mv terminal.js ~/Library/Scripts/Applications/Finder

これでスクリプトが利用できる。
Finder がアクティブの状態でメニューバーのスクリプトアイコンを。

do_script

うん、コレで JXA を実行するのがちょっとだけ楽になったぞい。
とりあえずこれだけ理解できればいくらでも拡張できると思う。