2008-09-20
Terminal.appで日本語をpbcopyできない件、fakeclipで解決したよ
Mac OS Xの Terminal.appで Vimを動作させているときに
クリップボード(正確には pasteboardですが)を介して他アプリケーションとテキストデータを受け渡しするには
pbcopy, pbpasteを使えばよいことになっているのですが
あれ、全角入力した日本語がコピーできない様子。
なんでだろう。
更に調査が必要そうだ。
と、日本語(非ASCIIな文字)がコピーできず、ながらく放置状態になっていました。
そこへ、Vim神から「っfakeclip」という神託をいただき、またたく間に解決することができました。
解決方法
1. fakeclip.vimプラグインを入れます。
http://www.vim.org/scripts/script.php?script_id=2098
2. 環境変数 __CF_USER_TEXT_ENCODINGを設定
自分は zshを使ってるので ~/.zshrcに以下のように追加しました。
export __CF_USER_TEXT_ENCODING="0x1F5:0x08000100:14"
作業メモ
Terminal.appの文字エンコーディング設定は UTF-8です。
UTF-8環境での注意点が、神のブログに記録されていました。
いい加減Mac OS Xの端末内でコピペできないのが不便なったので直しました。UTF-8等を使う場合は:help fakeclip-bugsの(e)を参照。
というわけで、:help fakeclip-bugs して読んだところ
__CF_USER_TEXT_ENCODING環境変数について、注意書きが見つかります。
「この環境変数は :(コロン)で区切られた値で、2番目の値を 0x08000100にしないといけないんだぴょん、詳しくは Appleのドキュメントを読んでね」
ということだったので、↓を読みました。
http://developer.apple.com/documentation/CoreFoundation/Reference/CFStringRef/
そしたら、ありましたありました、UTF-8の値が。
Built-in String Encodings enum CFStringBuiltInEncodings { kCFStringEncodingMacRoman = 0, kCFStringEncodingWindowsLatin1 = 0x0500, kCFStringEncodingISOLatin1 = 0x0201, kCFStringEncodingNextStepLatin = 0x0B01, kCFStringEncodingASCII = 0x0600, kCFStringEncodingUnicode = 0x0100, kCFStringEncodingUTF8 = 0x08000100, kCFStringEncodingNonLossyASCII = 0x0BFF, kCFStringEncodingUTF16 = 0x0100, kCFStringEncodingUTF16BE = 0x10000100, kCFStringEncodingUTF16LE = 0x14000100, kCFStringEncodingUTF32 = 0x0c000100, kCFStringEncodingUTF32BE = 0x18000100, kCFStringEncodingUTF32LE = 0x1c000100 };
って定義されてありました。
しかし、環境変数 __CF_USER_TEXT_ENCODINGの詳細を把握できていないので、設定値を検討すべく
Vimから :echo $__CF_USER_TEXT_ENCODING を実行したところ
自分の環境では 0x1F5:1:14 が得られました。
他の機能に影響が出ないよう 2番目の値 1 を 0x08000100 に変更し
それ以外は元の値のままにしておこう、と決めて .zshrcで exportしました。
これで、無事、他アプリケーションとのテキストデータ受け渡しができるようになり
fakeclip.vimのおかげで pbcopyや pbpasteの存在を隠蔽した、軽快な操作ができるようになりました。
かなり LifeChangingでした。
ヤッタァ!
あとは、__CF_USER_TEXT_ENCODINGの 1番目、3番目の値が何を意味するのか気になるところではあります。
それから 2番目の値も、変更前は 1 だったのですが、CFStringBuiltInEncodingsに含まれていませんね。
気になります。
深追わないとつかめなさそうですね。
追記
__CF_USER_TEXT_ENCODING は String Comparison Flags, Built-in String Encodings, External String Encodings
の並びな気がしてきた。
さらに追記
__CF_USER_TEXT_ENCODING の追記はまったく根拠ないです><
ちゃんと調べて書かないと、です。
printf "%X" `id -g` #=> 1F5
てな具合で。
http://d.hatena.ne.jp/witchmakers/20080806/1218009965
たしかに UIDになっていること、確認できました。
14というのもシステム言語のことだったのですね。スッキリです。
あと、コメントいただいてから edvakfさんの UTF-8で pbcopyを可能にするエントリーを拝見しました。
なるほどと参考になりましたので、リンクをはらせていただきます。
http://d.hatena.ne.jp/edvakf/20080929/1222657230