こんにちはこんにちは! エンジニア川端です。
今年は桜の開花が早かったですね。「花は桜木、男は岩鬼。」と書こうとしたら、すでに去年のブログで書いてました。
ファイルを選択してキーボードのスペースを叩けば簡単プレビュー。
Mac OS X 標準機能の Quick Look、ステキですね。
# Windows の方は FenrirFS で同機能をご堪能ください!
標準のままでもかなり役立つ Quick Look ですが、不満なのがテキストファイルの扱い。
標準のテキストエディタで作ったファイルはちゃんとプレビューできるんですが、
最強ステキソフト Emacs などで作ったテキストファイルは
という風に巨大なアイコンが。
いくつかある解決策から、今日は「xattr 編」をお届けします。
最も簡単なのは……
Mac OS X 標準ソフト「テキストエディット」の環境設定で、「ファイルを開くとき」の設定を「自動」から「UTF-8」にしておくと、最強ステキソフト Emacs などで作ったUTF-8 のファイルが Quick Look でプレビューできるようになります。まぁ、これで大体困らない。
困らないんですが、はるか昔に作成した EUC-JP のテキストファイルとかはこの方法でプレビューできないんですよね。そもそも、EUC-JP のテキストファイル、テキストエディットだと開けないことありますしね。
xattr とは?
そこで「xattr」。
詳細は、Apple のドキュメント等で調べて頂くとして、以下、簡単な説明を。
Mac OS X のファイルには「拡張属性 (EA)」と呼ばれる付加情報があります。ラベルの色とかコメント等は、ファイル本体には付与されず、拡張属性として保存されています。
Mac のファイルを Windows に持っていった時に ._hogehoge というファイルがあったりするのは、この拡張属性が別ファイルとして書き出されたものです。
拡張属性があるかどうか、ターミナルで「ls -l」してみましょう。
$ ls -l total 8 -rw-r--r--@ 1 kawabata staff 66 4 4 11:46 blog.txt -rw-r--r-- 1 kawabata staff 66 4 4 11:46 blog2.txt
blog.txt は、@ がついているので拡張属性がついています。どんな拡張属性がついているかは、コマンド「xattr」で確認できます。
$ xattr -l blog.txt com.apple.TextEncoding: UTF-8;134217984
この「com.apple.TextEncoding」がセットされていれば、それを元に Quick Look でプレビューしたり、ファイルをダブルクリックした時にテキストエディットでちゃんとオープンできたりする、っぽいですね。
「テキストエディット」など、Mac OS X 標準のソフトウェアで作成したファイルは、これらの情報がよしなに設定されているのですが、最強ステキソフト Emacs などで作ったファイルは、この情報が設定されていないので、プレビューできない、と。
自動でやろう
で、設定するには
$ xattr -w com.apple.TextEncoding 'UTF-8;134217984' blog.txt
とすればいいんですが、こんなこといちいちやってられないので、elisp。
Emacs でファイル保存時によしなに拡張属性を設定します。
init.el 等にそのまま追加して頂いたら動くと思います。
EA つけるかどうかをメジャーモードで判断するとかして、 .txt だけを対象にした方がよいかもしれないですね。
(when (eq system-type 'darwin) (defun my-set-com.apple.TextEncoding() (setq bfcs (prin1-to-string buffer-file-coding-system)) (cond ((string-match "utf-8" bfcs) (setq cate "UTF-8;134217984")) ((string-match "sjis" bfcs) (setq cate "SHIFT_JIS;2561")) ((string-match "shift-jis" bfcs) (setq cate "SHIFT_JIS;2561")) ((string-match "euc-jp" bfcs) (setq cate "EUC-JP;2361")) ((string-match "japanese-iso-8bit" bfcs) (setq cate "EUC-JP;2361")) ((string-match "euc-japan" bfcs) (setq cate "EUC-JP;2361")) ((string-match "iso-2022-jp" bfcs) (setq cate "ISO-2022-JP;2080")) (t (setq cate "MACINTOSH;0"))) (call-process "xattr" nil 0 nil "-w" "com.apple.TextEncoding" cate buffer-file-name)) (add-hook 'after-save-hook 'my-set-com.apple.TextEncoding))
嫌われ者の xattr ですが……
前述したようなゴミファイルを残したりするので、拡張属性を削除する
$ xattr -d
ばかりが紹介されがちですが、うまく使えば役立ちますよ、ということで。