プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

MSYSで標準出力をクリップボードにコピー

 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。

f:id:nodamushi:20180112190722p:plain

 これでもう一度先ほどのコマンドを実行して、ペースとしてみると↓
コピー出来てますか?

 おぉ。コピー出来た。

 

 だけど、問題もある。以下の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を受け取るという感じにしておけば、だいたいの状況は使い分けられるんじゃないかな。うん。

 とりあえず、これでいいかなぁ。