開発の経緯

マイケル
みなさんこんにちは!
まいけるです!

エレキベア
こんにちクマ~~~

マイケル
今回は ブログ執筆用ツール に関しての話です。
このブログはMarkdownを使用して執筆していて、これまで画像ファイルを扱うのに以下のようなツールを開発して使用していました。

【Next.js】第三回 WordPressブログをNext.jsに移行する 〜Markdown執筆環境構築編〜
2023-12-31

【Electron × Vue3】画像をリサイズして任意の場所に保存するツールを作る
2023-12-31

▲以前作成した画像リサイズツール

エレキベア
なつかしいクマね~~~
Electronを使って開発したクマね

マイケル
しばらくこのツールを使用していて以前より快適になっていたのですが、
以下のような問題がありました・・・。
- 既存ツールの問題
- ツール、Explorer(Finder)など複数ウィンドウ立ち上げることになり、画面がごちゃつく
- 画像リサイズ後、Markdownに文字のコピーペーストを手動で行う必要があり面倒

マイケル
ちょっとした問題に思えますが、画像ファイルは大量に扱うのでトータルで考えると中々に効率が悪い です。

エレキベア
塵も積もれば・・・のやつクマね

マイケル
そんなことから「VSCodeに直接D&Dして貼り付け出来るのが一番よさそう」というのを薄々感づいていたのですが、VSCodeの拡張機能を自作すれば実現できそう というのが分かったので挑戦してみることにしました。

マイケル
そんなこんなで今回作ってみたのがこちらです!

▲今回作成した拡張機能

マイケル
Markdown上に画像ファイルを直接D&Dしてサイズを入力 すると、リサイズした画像の保存と文字のペーストまで一括で行う機能 になっています。

エレキベア
だいぶシンプルで使いやすくなったクマね

マイケル
今回はVSCodeの拡張機能を作るのも初めてだったのでそもそもの開発方法も含めて、どのように実装して実現したか を解説していこうと思います!
GitHubリポジトリにも上げているので、こちらもあわせてご参照ください。
GitHub - vscode-image-resizer / plasmo310
▲作成したVSCode拡張機能

エレキベア
楽しみクマ~~~
VSCode拡張機能の開発方法

マイケル
まずそもそものVSCode拡張機能の作り方についてですが、
以下の公式ドキュメントに手順がまとまっています。
参考:
Your First Extension | Visual Studio Code Extension
API

エレキベア
手順もだいぶシンプルクマね

マイケル
基本的には公式ドキュメントを見るのがいいと思いますが、簡単な手順だけ記載しておきます。
拡張機能テンプレートの作成

マイケル
拡張機能のテンプレートは、yo、generator-codeパッケージを入れてコマンド実行することで作ることが出来ます。
以下のいずれかの方法でテンプレート作成コマンドを実行します。
▲グローバルインストールして実行する場合
▲ローカル環境を汚したくない場合

マイケル
実行すると諸々聞かれますが、今回は以下のようにTypeScriptプロジェクトとして作成しました。
▲テンプレート作成の設定

エレキベア
テンプレート作成してくれるのはありがたいクマ
デフォルト実装の確認

マイケル
最初に作成されるテンプレートについては、HelloWorldと出力するだけのコマンドを登録するだけのもの になっています。
メイン処理は src/extension.ts で、実行するコマンドとの紐づけは package.json の中に記載されています。
▲HelloWorldコマンドの登録処理
▲package.jsonにコマンドの紐づけが記載されている

エレキベア
activateイベントでコマンド登録するだけの、非常にシンプルな実装クマね
デバッグ方法

マイケル
開発中の拡張機能をどのように確認するかですが、F5キーでデバッグ実行 することで別のVSCodeが開き、挙動を確認することができます。
src/extension.tsを開いた状態でF5キーを押下する- デバッグ用のVSCodeが別で開き、処理の確認が行える

▲F5キー押下でデバッグ実行できる

エレキベア
いちいちパッケージングしなくても確認できるのクマね
パッケージング

マイケル
最後に開発が完了した拡張機能を配布して使用出来るようにするには、VSIX形式のファイルとしてパッケージング する必要があります。
こちらはpackage.jsonに必要な情報を記載した後、vsceパッケージを使用してコマンド実行することで実行出来ます。
-
package.jsonの記入▲publisher、repository等の情報を入力する -
vsceを使用してパッケージコマンドを実行する
-
作成されたVSIXファイルを拡張機能としてインストールする

マイケル
作成したVSIXファイルは、VSCode上から拡張機能としてインストールすることで使用できるようになります。

▲パッケージコマンドを実行するとVSIXファイルが作成される

▲拡張機能としてVSIXファイルをインストールして使用する

マイケル
ローカルで開発・使用するにあたる、基本的な開発方法としては以上になります。

エレキベア
フロントエンド開発している人にはそこまで敷居が高くないクマね
画像リサイズ・保存機能の実装

マイケル
それでは実際に今回の画像リサイズ・保存機能についての実装内容について解説します。
実装する機能の概要

マイケル
まず実装する機能については、冒頭で触れた通り以下のようになります。
- 実装する機能
- VSCodeで開いたMarkdown上に画像ファイルを直接ドラッグ&ドロップして使用できる
- 入力した横幅を元にリサイズを行い、指定フォルダ配下に保存する
- リサイズ情報から整形したテキストをMarkdown上にペーストする

エレキベア
画像ファイルをVSCodeにD&Dしてリサイズ・保存する機能クマね
画像操作ヘルパークラスの用意

マイケル
まずは拡張機能に関係ない部分で、画像ファイルの操作を行う処理を用意しました。
sharpライブラリを使用して、
・画像情報の取得
・比率固定でサイズ計算
・リサイズ・保存処理
をそれぞれヘルパー関数として用意しています。
▲sharpライブラリを使用した画像処理

エレキベア
これらの処理を各イベントで呼び出すようにするクマね
VSCode内イベントとの紐づけ

マイケル
VSCode内でドラッグ&ドロップした際のイベントとの紐づけ処理 は以下のようになります。

エレキベア
ここがメイン処理にあたるのクマね

マイケル
コードは少し長いので折りたたみにしてあります。
この後それぞれの処理について軽く記載します。
ドラッグ&ドロップの検知

マイケル
ドラッグ&ドロップ時の処理はDocumentDropEditProviderをカスタムして設定することで制御できます。
Markdownファイルのみを対象に、単一ファイルを対象に処理を行 うようにしています。
▲ドラッグ&ドロップ検知

マイケル
最後に作成しているinsertTextは、Markdownに挿入されるテキストになります。
こちらを成形することで好きな文言でペーストすることができます。

エレキベア
まさしく求めていた機能クマ
ツール設定の取得

マイケル
保存先フォルダと挿入テキストについては、VSCode設定で指定出来るようにしています。
▲settings.json内で指定できるようにしている

マイケル
設定項目は package.json 内で定義できるのと、取得はvscode.workspace.getConfigurationで取得したconfig経由 で行います。

エレキベア
settings.jsonで指定できると環境ごとに設定を変えれて便利クマね
画像情報取得・幅の入力メッセージ表示

マイケル
用意したヘルパー関数で画像情報を取得して、その情報を元にリサイズ後の幅をユーザに入力させます。
こちらは vscode.window.showInputBox を呼び出すことで入力欄を表示させることができます。

▲VSCode上で入力欄が表示される

エレキベア
ここもVSCodeの機能を使って入力できるクマね
画像リサイズ・保存処理

マイケル
最後に画像リサイズ・保存処理ですが、こちらもヘルパー関数を呼び出しているだけですね。

エレキベア
ロジックが分離されていると分かりやすいクマね

マイケル
主要となる実装の解説は以上になります!
おわりに

マイケル
というわけで今回はVSCode拡張機能の開発についてでした!
どうだったかな?

エレキベア
なんとなく難しいイメージがあったクマが、
開発環境は割と整っていて手軽に開発できたクマね

マイケル
こういった拡張が手軽に行えるのもVSCodeの強みだね!
みなさんもぜひ開発効率を上げるための機能を実装してみましょう!

マイケル
それでは今日はこの辺で!
アデューー!!

エレキベア
クマ~~~~~
【VSCode】ドラッグ&ドロップで画像ファイルをリサイズ・保存する拡張機能を作る ~完~









