MSYS2で標準出力をクリップボードにコピーしたい。要するに「pbcopy」が使いたい。え?WSL?ギリギリまでWindows 7だよ。
で、「pacman -S pbcopy」ってやっても、「pacman -S xsel」ってやっても、なもんねぇと言われた。マジかー。
と思ってたんだけど、なんと、Windowsには標準で「C:/Windows/System32/clip.exe」というpbcopyがあったらしい。ということは、これにpbcopyのaliasを貼ればpbcopyが使えるジャマイカ!
というわけで、~/.bash_profileに以下を追加記述。ちなみに、MSYS2のbashはログイン時に.bashrcを読み込まない設定になっている。
alias pbcopy="/c/Windows/System32/clip.exe"
これで、pbcopyが使える様になった訳なので、早速試してみます。
echo "コピー出来てますか?" | pbcopy
ペースト。↓
繧ウ繝斐・蜃コ譚・縺ヲ縺セ縺吶°・・
………オーマイガ。そうか、文字コードか。MSYSの文字コードはUTF-8だもんな。Shift_JIS滅びねぇかな。
MSYSの文字コードを変更するべきか否か
MSYSの文字コードは変更することは可能です。本当に変更するかどうかは、しっかり考察した方がいいですが。
変更するには、ウィンドウのタイトルバーを右クリックして、ポップアップするメニューからOptionを選択し、以下の様に設定し、save。
これでもう一度先ほどのコマンドを実行して、ペースとしてみると↓
コピー出来てますか?
おぉ。コピー出来た。
だけど、問題もある。以下のC++ファイルをコンパイルしてみる。
#include <iostream> int main(int argc, char *argv[]){ std::cout << "これは日本語です。" << std::endl; }
g++ main.cpp
で、a.exeを実行すると………
縺薙l縺ッ譌・譛ャ隱槭〒縺吶▒
………Shift_JIS滅びねぇかな。
一応、以下のオプションを付加することで、この問題は回避出来る。
g++ main.cpp -fexec-charset=CP932
んー。
結論 iconvを通す
結局私はあれこれ考えた結果、MSYSのデフォルトに戻しました。だってSJIS嫌いだし。文字コード変更してどうなるか分からないからね。
文字化けせずにクリップボードに転送するには、iconvを通してUTF-8をCP932に変換すれば良い。
echo "あいうえお" | iconv -f UTF-8 -t CP932 | pbcopy
ペースト↓
あいうえお
また、実は今回はechoではなく、catで読み出した内容をクリップボードに貼り付けたいという要求から調べだしたこと。私は基本的にテキストファイルではUTF-8しか使わないので、catの出力もUTF-8になる。(catの文字コードはファイル依存)
なので、結局aliasを次の様にしました。
alias clip='/c/Windows/System32/clip.exe' alias pbcopy='iconv -f UTF-8 -t CP932 | /c/Windows/System32/clip.exe'
Windows標準のclipはCP932を受け取り、pbcopyはUTF-8を受け取るという感じにしておけば、だいたいの状況は使い分けられるんじゃないかな。うん。
とりあえず、これでいいかなぁ。