VSCode拡張機能でモーラ数カウンターを作った - デコレーションの配置調整で苦労した話

2026年01月06日
Sunoで簡単に曲が作れることがわかったので、一度やってみたかった作詞を始めてみたのですが、モーラ数を数えるのが面倒すぎて挫折しました。

既存のツールも見つからなかったので、自分でVS Code拡張機能を作ることにしました。

特にデコレーション(Decoration)の配置調整で苦労したので、その解決方法をまとめておきます。
今回は、Claude Codeを使って開発しました。

スポンサーサイト

目次



・作ったもの
・使用した技術
・デコレーションの配置調整で苦労した話
  - 問題1:モーラ数の右寄せができない
  - 問題2:母音「i」の位置がずれる
・Claude Codeを使った開発について
・モーラ数のカウント方法
・まとめ

作ったもの


Japanese Lyrics Editor (J-Lyrics)という、日本語の歌詞作成を支援するVSCode拡張機能です。

主な機能:
・各行のモーラ数(拍数)をリアルタイム表示
・行末の母音を表示(韻を踏む際の参考に)
・Sunoのメタタグ形式もサポート

元々VSCodeで作詞をしていたので、VSCode拡張機能にしてみました。歌詞の履歴管理もしやすいですし。

GitHubで公開しています:
https://github.com/dokonidemoiruhito/japanese-lyrics-editor
jlyrics.png


使用した技術


Claude Code:開発支援ツール
TypeScript + VSCode Extension API
Kuroshiro:漢字をひらがなに変換するライブラリ

Claude Codeを使って開発しましたが、細かい仕様は会話しながら詰めていく感じで進めました。詰まった時はGeminiも併用しながら相談していました。


デコレーションの配置調整で苦労した話


VSCode拡張機能で行頭に情報を表示する「デコレーション(Decoration)」の配置調整が、思った以上に厄介でした。


問題1:モーラ数の右寄せができない


モーラ数を行頭に表示するとき、右寄せで一桁と二桁で桁を揃えたかったんです。

しかし、VSCodeのデコレーションには以下の制限がありました:
右寄せや中央寄せの設定ができない
フォントを指定できないため、ユーザー環境によってプロポーショナルフォントが使われる

右寄せを設定できなかったため、最初は半角スペースで左埋めを試しましたが、スペース埋めでは桁が揃わず、見た目がバラバラになってしまいました。

解決方法:デコレーションを2つ使う

無理やりですが、デコレーションを2つ用意して解決しました:

(1) 1つ目のデコレーション:透明な「0」で左埋め
(2) 2つ目のデコレーション:実際のモーラ数を表示

例えば:
・モーラ数が5の場合:透明な「0」+「5」を表示
・モーラ数が12の場合:透明文字なし+「12」を表示

こうすることで、見た目上は右寄せになります。

コードとしては、以下のような感じです:

// 1つ目:透明な"0"で左埋め
paddingDecorationType = vscode.window.createTextEditorDecorationType({
before: {
color: 'transparent',
}
});

// 2つ目:モーラ数を表示
moraDecorationType = vscode.window.createTextEditorDecorationType({
before: {
color: new vscode.ThemeColor('editorCodeLens.foreground'),
}
});


実際の配置では、モーラ数が1桁の時はpaddingText = '0'、2桁の時はpaddingText = ''として調整しています。


問題2:母音「i」の位置がずれる


当初は母音(a, i, u, e, o)を行頭のデコレーションに表示していました。

しかし、プロポーショナルフォントでは「i」の文字幅が狭いため、他の母音と比べて中央位置がずれて見えてしまいます。

上で書いた通り、中央揃えもできませんので、最初は「i」の時だけ左マージンを調整しようとしましたが、ユーザー環境によってフォントが異なるため、調整量も変わってしまい断念しました。

解決方法:ガター領域にSVG画像で表示

行番号の左側(ガター領域)に、SVGで母音を描画する方法に変更しました。

function createVowelSvg(vowel: string, displayStyle: string = 'katakana'): vscode.Uri {
const color = vowelColors[vowel] || '#808080';
const displayMap = vowelDisplayMaps[displayStyle] || vowelDisplayMaps['katakana'];
const displayText = displayMap[vowel] || vowel;
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<rect x="0" y="0" width="16" height="16" fill="${color}" />
<text x="8" y="13" text-anchor="middle" font-size="14" font-family="Consolas" fill="black">${displayText}</text>
</svg>`;
const encoded = Buffer.from(svg).toString('base64');
return vscode.Uri.parse(`data:image/svg+xml;base64,${encoded}`);
}


ただ、ガター領域は狭いので視認性が悪く、最初は文字色を変えたりしていましたが、最終的に背景色を付けることにしました。色はGoogleのマテリアルカラーの100番台から選んでいます(柔らかいパステルカラー)。

結果:
・文字位置のずれ問題が解消
・色分けで母音が見やすくなった
・韻を踏む際の参考にしやすい

デコレーションは思っていたより制約が多く、試行錯誤しながらの解決になりました。


Claude Codeを使った開発について



良かった点:
・細かい仕様を最初から決めず、会話しながら詰めていけた
・「こんな感じで」と伝えて、動作確認しながら進められた

向いてない作業:
・表示の微調整(色、サイズ、位置など)
・これらは自分で直接コードを修正した方が早かったです

詰まった時の対応:
・Geminiも併用して相談しながら進めました

特殊なことはしていないと思いますが、最初から完璧な仕様を提示するのではなく、会話しながら仕様を詰めて動作確認する、というのを繰り返しながらなんとなく作っていった感じです。


モーラ数のカウント方法


モーラ数のカウントは、ほぼClaude Codeに任せました。

基本的な流れ:
・Kuroshiroライブラリで漢字をひらがなに変換
・拗音(きゃ、しゅ等)は1モーラとしてカウント
・促音(っ)も1モーラとしてカウント
・Sunoのルビ記法 漢字(よみ) にも対応

唯一自分で修正したのは「っ」の扱いだったと記憶しています。細かいロジックはClaude Codeが提案してくれたものをベースにしています。


まとめ


VSCode拡張機能の開発では、デコレーションの配置調整が意外と厄介でした。フォント指定や配置設定ができないため、今回のような工夫が必要になります。

特にデコレーションには以下の制限があります:
・右寄せ、中央寄せができない
・フォントを指定できない
・ユーザー環境に依存する部分が大きい

同じようにVSCode拡張機能でデコレーション周りで苦戦している方の参考になれば幸いです。

拡張機能はGitHubで公開しているので、興味があればぜひ使ってみてください。
https://github.com/dokonidemoiruhito/japanese-lyrics-editor


スポンサーサイト

posted at 01:17 | Comment(0) | プログラミング
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: