Marp for VS Code
拡張機能開発の舞台裏

Yuki Hattori

2024-04-20 — VS Code Conference Japan 2024

Yuki Hattori (服部 雄輝)

フロントエンドエンジニア
Marp メンテナー

目次

Marp とは?

Marp とは?

Markdown で
プレゼンスライドを書く
エコシステム

Marp とは?
<!-- theme: uncover -->

# タイトル

作者名

---

## 見出し

- xxxxxxxxxxxx
- xxxxxx

---

## 画像

xxxxxxx、xxxxxxx

![bg right](https://marp.app/assets/hero-background.svg)

Marp for VS Code
Marp を VS Code で使うための拡張

なぜ VS Code なのか?

なぜ VS Code なのか?

👉 エディターとしての
高い機能性・拡張性

Marp
なぜ VS Code なのか?

2015: 初代 Marp

なぜ VS Code なのか?

2015: 初代 Marp

オールインワンアプリの限界

  • ユーザーの要望が多種多様
  • 「エディターとしての機能性」も求められるように
  • 「Markdownでスライドを書く」という命題にフォーカスできなくなりそう

👉 要素を分解し、モジュラーなエコシステムとしての方向性を模索

なぜ VS Code なのか?

2018: 新生 Marp (Marp Next)

複数のパーツから構成されるエコシステム

  • フレームワーク (Marpit framework)
  • コア (Marp Core)
  • ツール (コマンドラインツール / GUI ツール)
なぜ VS Code なのか?

Marp CLI (コマンドラインツール)

なぜ VS Code なのか?

GUI ツールに求められるもの

  • 初代 Marp と同等の体験
    • スライドプレビュー&エクスポート
  • エディターの機能性・拡張性
    • ユーザー好みのエディター環境にできる
  • 開発・保守の容易さ
    • GUI はコアのフロントエンドに徹したい
VS Code

拡張機能の機能・設計

拡張機能の機能・設計

Marp for VS Code の機能

  • Marp プレビュー
  • エクスポート機能
  • Markdown 言語機能の拡張
拡張機能の機能・設計

Marp プレビュー

VS Code プレビュー (Marp プレビュー OFF)
拡張機能の機能・設計 > Marp プレビュー
---
marp: false
theme: gaia
_class: lead
---

# Marp プレビュー

Markdown プレビュー表示方法を切り替え

---

![bg 90%](https://marp.app/assets/og-image.png)
VS Code プレビュー (Marp プレビュー ON)
拡張機能の機能・設計 > Marp プレビュー
---
marp: true
theme: gaia
_class: lead
---

# Marp プレビュー

Markdown プレビュー表示方法を切り替え

---

![bg 90%](https://marp.app/assets/og-image.png)
拡張機能の機能・設計 > Marp プレビュー

Markdown Extension

拡張機能の機能・設計 > Marp プレビュー
"contributes": {
  "markdown.markdownItPlugins": true
}
import type { ExtensionContext } from 'vscode'

export function activate(context: ExtensionContext) {
  return {
    extendMarkdownIt(md: any) {
      return md.use(require('markdown-it-plugin'))
    },
  }
}
拡張機能の機能・設計 > Marp プレビュー

設計

marp: true を検出したら、処理を Marp の markdown-it エンジンに移譲

extendMarkdownIt(md: any) {
  const { parse: originalParse } = md

  md.parse = (markdown: string, env: any) => {
    if (detectMarpFromMarkdown(markdown)) { // marp: true を検出したら…
      md.marp = new Marp()
      return md.marp.markdown.parse(markdown, env) // Marp の markdown-it エンジンに移譲 
    } else {
      md.marp = false
      return originalParse.call(md, markdown, env) // そうでないなら、元々のパース処理を実行
    }
  }
}
拡張機能の機能・設計

エクスポート機能

拡張機能の機能・設計 > エクスポート機能

設計

拡張機能に埋め込まれた Marp CLI を使用

import { marpCli } from '@marp-team/marp-cli'

async exportCommand(doc: TextDocument, outputUri: Uri) {
  const input = await createWorkFile(doc)
  const output = uri.fsPath // 保存先のパス

  await marpCli([input, '-o', output]) // `marp input.md -o [保存先のパス]` を呼出 
}
拡張機能の機能・設計

Markdown 言語機能の拡張

  • ディレクティブの補完
  • コードハイライト&ホバーヘルプ
  • リンター
  • Markdown アウトライン拡張
拡張機能の機能・設計 > Markdown 言語機能の拡張

ディレクティブの補完

  • スライドの設定を行う Marp 記法
  • Ctrl+Space で補完

拡張機能の機能・設計 > Markdown 言語機能の拡張

コードハイライト&ホバーヘルプ

  • 認識されたディレクティブを強調表示
  • ホバーで簡単なヘルプと、ドキュメントへのリンクを表示

拡張機能の機能・設計 > Markdown 言語機能の拡張

リンター

  • 非推奨のディレクティブや、エラーを検知してハイライト
  • 一部は 💡 から自動修正可能

拡張機能の機能・設計 > Markdown 言語機能の拡張

Markdown アウトライン拡張

  • アウトラインサイドバーでスライドページを認識
  • スライドページ単位のコード折りたたみ

拡張機能の機能・設計 > Markdown 言語機能の拡張

設計

  • Programmatic Language Features
    • Markdown 向けの Language Server は当時まだ無かった
    • 👉 VS Code API で愚直に拡張
// 例: 補完機能の提供
vscode.languages.registerCompletionItemProvider('markdown', {
  async provideCompletionItems(doc, pos) {
    const themeCompletionItem = new vscode.CompletionItem('theme')
    themeCompletionItem.documentation = 'Set the theme name of slide deck'

    return [themeCompletionItem] // 実際には、ドキュメントやカーソル位置で、補完候補をフィルタリングする必要がある
  },
})

開発のポイント

開発のポイント

👉 小さな拡張
VS Code の進化に寄り沿う

開発のポイント

2018: + Visual Studio Live Share

👉 Marp Markdown を共同で編集

開発のポイント

2019: + Remote Development

👉 コンテナーや WSL 上での編集・エクスポートに対応

開発のポイント

2021: + Workspace Trust

👉 強化されたセキュリティモデルをフォロー

開発のポイント

2021: + github.dev / vscode.dev

👉 Web Extension に対応、ブラウザ上で Marp の編集/プレビューが可能に

開発のポイント

2022: + Markdown Language Server / Service

👉 強化が進む Markdown 言語機能の恩恵を受けられる

開発のポイント

2022: + GitHub Copilot

👉 スライドの執筆を AI で支援

Marp for VS Code + ??? = 🚀🚀🚀

Marp for VS Code + ??? = 🚀🚀🚀

小さな拡張で VS Code のエコシステムを活かし、価値を最大化

 Marp for VS Code

https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode