0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL 上の VSCode で Paste Image 拡張機能が正常動作しないので手動回避した話

Posted at

WSL 上の Paste Image は残念な感じ

  • Windows 上のブラウザから画像をクリップボードにコピーしても、コピーされるのは Windows のクリップボード
  • Paste Image 拡張機能を使っても、WSL 上のクリップボードは空っぽなので、画像貼り付けに失敗

何とかしようとした人々

WSL にクリップボード内容を画像で保存しようとした実装

Windows のクリップボード内容を WSL にコピーする実装

省力設計で何とかした結果

  • 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)を付けて、実行権限を付与
  • 実行してみると、文字コードバグが出ているものの正常に実行される

image.png

  • スクリプト実行後にPaste Image拡張機能を使用してみると・・・正常に張り付けが完了した

image.png

ついでに 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 も至極便利
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?