WSL 上の Paste Image は残念な感じ
- Windows 上のブラウザから画像をクリップボードにコピーしても、コピーされるのは Windows のクリップボード
- Paste Image 拡張機能を使っても、WSL 上のクリップボードは空っぽなので、画像貼り付けに失敗
何とかしようとした人々
WSL にクリップボード内容を画像で保存しようとした実装
- WSL上からWindowsのクリップボードに保存されている画像をpng保存する
- 一応使えるが、画像名を入力しなければならないのは面倒
Windows のクリップボード内容を WSL にコピーする実装
- vscodeのpaste image extensionをWSL2で使う(非推奨)
- 使えなくはないが、途中のコマンドが多くてお手軽ではない
- ただし、コマンドが一発になれば悪くない
省力設計で何とかした結果
- Windows のクリップボード内容を WSL にコピーできることが判明した
- ので、これを Python スクリプトで作成すれば OK
- だが、面倒なので、最近新しくなった Gemini 大先生に作成してもらう
入力したプロンプト
Windows システムのクリップボードの内容を WSL 上のクリップボードにコピーする方法はありますか?
あるならば、これを実行するPythonスクリプトを作成してください。この際、Pythonスクリプトは、次の要件を満たすものとします。
- PythonスクリプトはWSL上で実行するものとします。
- Pythonスクリプトは引数を必要とせず、自動的にWindowsシステムのクリップボード内容を取得します。
- 一行目には `#!/usr/bin/env python3` を記載して下さい。
帰ってきた結果
-
clip.exe
を使用してクリップボード内容を取得、xclip
を使用して WSL のクリップボードに内容をセットするコードが生成された
#!/usr/bin/env python3
import subprocess
# Windows システムのクリップボードの内容を取得
def get_windows_clipboard():
p = subprocess.Popen(['clip.exe', '-noparse'], stdout=subprocess.PIPE)
output, err = p.communicate()
if err:
raise Exception('Failed to get Windows clipboard content')
return output.decode('utf-8').strip()
# WSL 上のクリップボードに内容を設定
def set_wsl_clipboard(text):
p = subprocess.Popen(['xclip', '-selection', 'clipboard', '-in'], stdin=subprocess.PIPE)
p.communicate(input=text.encode('utf-8'))
# 実行
windows_clipboard_content = get_windows_clipboard()
set_wsl_clipboard(windows_clipboard_content)
print('Windows システムのクリップボードの内容を WSL 上のクリップボードにコピーしました。')
実行結果
- 適当にパスの通った場所へスクリプトを置き、使いやすい名前(
ccp
)を付けて、実行権限を付与 - 実行してみると、文字コードバグが出ているものの正常に実行される
- スクリプト実行後に
Paste Image
拡張機能を使用してみると・・・正常に張り付けが完了した
ついでに Chat GPT で作成した場合
- 内容は似ているものの、エラー処理の無い、PowerShell を使用したコードが生成された
- 実行してみると、文字化けのアウトプットも無く、正常に動作した
#!/usr/bin/env python3
import subprocess
# Windows のクリップボード内容を取得
get_clipboard_cmd = ['powershell.exe', '-command', 'Get-Clipboard']
clipboard_content = subprocess.check_output(get_clipboard_cmd, text=True)
# WSL のクリップボードに内容をコピー
with subprocess.Popen(['xclip', '-selection', 'c'], stdin=subprocess.PIPE) as proc:
proc.communicate(input=clipboard_content.encode())
まとめ
- 小さな便利コード程度の作成であれば、その基礎的な知識も含め、もはや人間が調べつつ作成する必要はなくなりつつあることを実感しました
- Gemini も Chat GPT も至極便利