Mac OS XのTerminal(Emacs+dired)で、Mac特有のエイリアスファイルの「オリジナル」を取得する

ちょっと話がややこしいのですが、まず、Mac OSには随分昔から「エイリアス」というファイルが存在します。Windowsでいうところの「ショートカット」だと思います。

Unix/Linuxで用いられるシンボリックリンクやハードリンクと違って、terminalなんかでエイリアスファイルに、Finderと同じ挙動を期待しても、うまく機能しません。

Macのエイリアスはリンクでなく、ファイルの実体で、「オリジナル」という値で、リンク先を保持し、Finderはそれを解釈しています。

もちろんEmacsのdiredでも同様です。このファイルをfind-fileしちゃうと、バイナリっぽい意味不明な文字列がバッファに表示されます。

* * *

じゃあ、どうやってエイリアスの「オリジナル」を取得できるか。取得の仕方はFinderが知っているので、Applescriptで取得できます。Applescriptで取得できるということは、osascriptで取得できるということかしら、とやってみました。

Terminal/iTerm2で、以下のような感じです。

osascript -e 'tell application "Finder" to return POSIX path of (original item of item (POSIX file "/path/to/alias") as alias)'

そちらのほうが慣れているので、POSIXで取得していますが、Macでよく見るのコロン区切りでもいいと思います。

これができたら、Emacsでも取得できます。基本的な書きようはこんな感じだと思います。

(when (eq system-type 'darwin)
                         (string-trim
                          (shell-command-to-string
                           (concat "osascript -e 'tell application \"Finder\" to return POSIX path of (original item of item (POSIX file \""
                                   path
                                   "\") as alias)'"))))

concat中のpathに、どうにかしてファイルの絶対パスを渡せば、戻り値がAliasのoriginalになります。

一点注意事項は、"%7E/Desktop/path/to/alias"みたい*1なのは、ダメという点でしょうか。diredなんかで使う場合は、

(expand-file-name (dired-file-name-at-point))

した値が必要です。


  • *1 %7Eはチルダで読み替えてください

ジャンル: EmacsMac