Hatena::Groupvim

kei-os2007 no life, no Vim このページをアンテナに追加 RSSフィード

2008-09-20

Terminal.appで日本語をpbcopyできない件、fakeclipで解決したよ

14:39 | Terminal.appで日本語をpbcopyできない件、fakeclipで解決したよ - kei-os2007 no life, no Vim を含むブックマーク はてなブックマーク - Terminal.appで日本語をpbcopyできない件、fakeclipで解決したよ - kei-os2007 no life, no Vim Terminal.appで日本語をpbcopyできない件、fakeclipで解決したよ - kei-os2007 no life, no Vim のブックマークコメント


Mac OS Xの Terminal.appで Vimを動作させているときに

クリップボード(正確には pasteboardですが)を介して他アプリケーションとテキストデータを受け渡しするには

pbcopy, pbpasteを使えばよいことになっているのですが


あれ、全角入力した日本語がコピーできない様子。

なんでだろう。

更に調査が必要そうだ。


http://d.hatena.ne.jp/kei-os2007/20080714


と、日本語(非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)を参照。

http://vim.g.hatena.ne.jp/ka-nacht/20080717


というわけで、: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 の追記はまったく根拠ないです><

ちゃんと調べて書かないと、です。

edvakfedvakf2008/11/24 08:35第一引数はUID (GID)です。id -g を十六進数にしたものです。
printf "%X" `id -g` #=> 1F5
てな具合で。

edvakfedvakf2008/11/24 09:00ちなみに第三引数の14はシステム言語が日本語という意味だそうです。
http://d.hatena.ne.jp/witchmakers/20080806/1218009965

kei-os2007kei-os20072008/11/24 10:52edvakfさん、コメントありがとうございます。
たしかに UIDになっていること、確認できました。
14というのもシステム言語のことだったのですね。スッキリです。

あと、コメントいただいてから edvakfさんの UTF-8で pbcopyを可能にするエントリーを拝見しました。
なるほどと参考になりましたので、リンクをはらせていただきます。
http://d.hatena.ne.jp/edvakf/20080929/1222657230

MelissaMelissa2011/11/25 14:34Tip top stuff. I'll eexpct more now.

quqfbfwyofquqfbfwyof2011/11/27 01:36Y29oM5 <a href="http://fupihrohpsqq.com/">fupihrohpsqq</a>

rzkjoterzkjote2011/12/01 19:06zDXxxt <a href="http://fjoixjfilozo.com/">fjoixjfilozo</a>