FUJIMOTO Hisakuni
hisa****@imasy*****
2004年 3月 16日 (火) 09:16:13 JST
藤本です。こんにちは。 At Mon, 15 Mar 2004 23:56:14 +0900, Seiji Zenitani wrote: > AppleScript を使って、Mac 標準の > ファイルオープンダイアログを呼び出すことができました。 (snip) > パス名が英語の場合は問題なく使えます。 > 日本語が含まれているパス名がまだ扱えませんが(※) > 良い解決法はありませんでしょうか・・・? 以前調べたのですが、do-applescript は、日本語の環境では SJIS 文字列 をバイト列として返すみたいです。これは decode-coding-string を使って (decode-coding-string SJIS-BYTES 'sjis-mac) のように、elisp 用の文字列に変換できます。 さらに do-applescript は、 AppleScriptオブジェクトをリテラル表現に したものを返すみたいです。そこで僕は、AppleScript の結果処理用に、 以下のような関数を定義して使い回してます。 applescript-parse-result の方は、do-applescript の返した結果をわか る範囲で elisp のオブジェクトに変換します。 # リスト、文字列、整数, nil にいい加減な対応をしているのみなので、 # もうすこしましな状態してもらえるとうれしい (defun applescript-decode-string (retstr) "do-applescriptが返した文字列をデコードする。" (decode-coding-string retstr 'sjis-mac)) (defun applescript-parse-result (retstr &optional decoded) "do-applescriptが返した文字列を調べてelisp用のオブジェクトに変換する。" (unless decoded (setq retstr (applescript-decode-string retstr))) (cond ;; as list ((string-match "\\`\\s-*{\\(.*\\)}\\s-*\\'" retstr) (let ((mstr (match-string 1 retstr))) (mapcar (lambda (item) (applescript-parse-result item t)) (split-string mstr ",")))) ;; as string ((string-match "\\`\\s-*\\\"\\(.*\\)\\\"\\s-*\\'" retstr) (match-string 1 retstr)) ;; as integer ((string-match "\\`\\s-*\\([0-9]+\\)\\s-*\\'" retstr) (string-to-int (match-string 1 retstr))) ;; as nil ((string-equal "" retstr) nil) ;; else (t (intern retstr)))) その上で mac-open-file コマンドを: (defun mac-open-file () (interactive) (let* ((result (do-applescript "try\nPOSIX path of (choose file)\nend try")) (path (applescript-parse-result result))) (when (stringp path) (find-file path)))) のようにしたらどうでしょう。 -- 藤本尚邦 FUJIMOTO Hisakuni