[Macemacsjp-users 57] Re: Mac 標準のファイルオープンダイアログ

Back to archive index

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



Macemacsjp-users メーリングリストの案内
Back to archive index