VSCode x WSL 環境で Zenn 執筆時に画像を楽にコピペできる拡張を紹介
はじめに
Zenn の記事は GitHub で管理し、執筆には VSCode を利用することができます。
しかし、Ctrl + V で画像を貼り付けても、そのままでは Zenn 記事に画像が正しく反映されません。
Zenn の仕様に合わせて画像を挿入するには、paste image 拡張が有力な手段として知られています。
ですが、この拡張は WSL 環境では正常に動作しません。
そこで、本記事では WSL でも使える Udon  拡張を紹介します。
VSCode の画像貼り付けと Zenn の仕様の違い
VSCode で .md ファイルに画像をコピペした場合の挙動は、以下の通りです。
// 記事(.md ファイル)に挿入される画像リンク

// 画像は .md ファイルと同じ階層に保存される
zenn_contents/
└── articles/
    ├── image.png
    └── c983fc42a138cf.md
一方、Zenn では zenn_contents(Github repository)/images/ フォルダの中に画像を配置するルールとなっています。
// この様に画像を保存する必要がある

zenn_contents/
├── articles/
│   └── c983fc42a138cf.md
└── images/
     └── image.png
上記仕様に対応する方法として、paste image 拡張機能が有名ですが、WSL 環境では動作しないため、WSL ユーザーには適していません。
この問題を解決してくれるのが、Udon 拡張です。
Udon 拡張について
Ctrl + Alt + V を押す事で、以下の様に画像が挿入することが可能になります。

zenn_contents/
├── articles/
│   └── c983fc42a138cf.md
└── images/
     └──c983fc42a138cf/
          └── c983fc42a138cf-2025-5-16_1.webp
Udon 拡張については制作者さんの記事をご参照ください。
本項では、私の設定例を紹介します。
筆者の環境
- Windows 11
 - WSL2(Ubuntu 22.04.3 LTS)
 - VSCode x Dev Containers
 
zenn_contents/      // workspaceFolder
├── articles/    // 記事用の .md ファイルを配置
└── images/      // .md ファイルで使用する画像を配置
VSCode x WSL での Zenn 執筆環境の詳細はこちらの記事で紹介しています。
設定例
# .md ファイルでコピペした際に画像を保存するフォルダを指定
"udon.baseDirectories": [
     ["articles/*.md", "${workspaceFolder}/images/$fileBasenameNoExtension"]
],
# .md ファイルに挿入されるリンクの記述ルールを指定
"udon.rule": [
     ["articles/*.md", ""],
     ["*.md", ""],
     ["*", "${relImage:${workspaceFolder}}"]
]
(余談)他に画像を楽にコピペする方法はあるか?
いくつか方法を試した結果、ベターだったのは udon 拡張でした。
ここでは、実際に検討した他の方法についても紹介します。
| 方法 | メリット | デメリット | 
|---|---|---|
| VSCode 標準機能 | 拡張不要・公式サポート | Zenn 仕様とパス不整合、手作業多め | 
| paste image 拡張 | 一般的・手軽 | WSL 環境で動作しない | 
| paste image スクリプト改変 | WSL でも動作可能 | 拡張更新時に再設定必須 | 
| Udon 拡張 | WSL 対応・設定簡単 | 実績は少なめ | 
案1:VSCode の標準機能を活用する
当初、WSL 環境での Zenn 執筆に VSCode の標準機能を使おうと考えました。
{
    "customizations": {
        "vscode": {
            "settings": {
                "markdown.copyFiles.destination": {
                    "/articles/**/*": "images/articles/${documentBaseName}/"
                }
            }
        }
    }
}
しかし、この設定だと .md ファイルに画像を貼り付けた際、 のようにリンクが作成されます。
そのため、Zenn 仕様の   に手動で書き換える手間が発生してしまいます。
案2:paste image 拡張を導入する
WSL 環境では paste image 拡張が正常に動作しなかったため、断念しました。
案3:paste image 拡張の内部スクリプトを改変する
拡張の内部スクリプト(linux.sh)を編集し、WSL から PowerShell 経由で Windows のクリップボード画像を取得する方法です。
この方法は拡張の更新時に再設定が必要となるため、根本的な解決策とは言えず、不採用としました。
おわりに
先日、こちらの記事を読ませていただきました。
Git commit 時に画像パスを書き換えるという方法は、目から鱗でとても面白かったです。
その一方で、Udon 拡張についてはまだあまり知られていない印象を受けました。
私自身とても重宝している拡張なので、この機会にぜひ多くの方に知っていただきたく、本記事を書きました。
Udon 拡張を作ってくださった方、大変助かっております。感謝。
Discussion