Open4
CodeMirror手習い

Codemirrorの恋式ドキュメントをチラ見しても、どう始めていいのか1㍉もわからないので、それっぽい情報をかき集めるスレ
公式サイト

手始めに読んでおくと良さそうなブログ
- CodeMirror v6によるZennのMarkdownエディタの作り方
-
zenn.dev
でのMarkdown
エディタの実装を例にしてる - https://zenn.dev/team_zenn/articles/zenn-markdown-editor-by-cm6
-
- 新しくなったCodeMirror v6で遊ぼう!
-
Hellow world
的なやつ - https://blog.techscore.com/entry/2023/02/10/080000
-

SvelteでCodemirror
-
svelte
の最小構成プロジェクトの作成
npm create vite@latest
-
codemirror
の追加
npm i codemirror
-
src/App.svelte
からいらないものを削除 & コンポーネント名をEditor
に変更
<script lang="ts">
- import svelteLogo from './assets/svelte.svg'
- import viteLogo from '/vite.svg'
- import Counter from './lib/Counter.svelte'
+ import Counter from './lib/Editor.svelte'
</script>
<main>
- <div>
- <a href="https://vite.dev" target="_blank" rel="noreferrer">
- <img src={viteLogo} class="logo" alt="Vite Logo" />
- </a>
- <a href="https://svelte.dev" target="_blank" rel="noreferrer">
- <img src={svelteLogo} class="logo svelte" alt="Svelte Logo" />
- </a>
- </div>
- <h1>Vite + Svelte</h1>
-
<div class="card">
- <Counter />
+ <Editor />
</div>
- <p>
- Check out <a href="https://github.com/sveltejs/kit#readme" target="_blank" rel="noreferrer">SvelteKit</a>, the official Svelte app framework powered by Vite!
- </p>
-
- <p class="read-the-docs">
- Click on the Vite and Svelte logos to learn more
- </p>
</main>
-<style>
- .logo {
- height: 6em;
- padding: 1.5em;
- will-change: filter;
- transition: filter 300ms;
- }
- .logo:hover {
- filter: drop-shadow(0 0 2em #646cffaa);
- }
- .logo.svelte:hover {
- filter: drop-shadow(0 0 2em #ff3e00aa);
- }
- .read-the-docs {
- color: #888;
- }
-</style>
-
src/lib/Counter.svelte
をEditor.svelte
にリネームした上で、中身を書き換える
<script lang="ts">
+ import { EditorState } from '@codemirror/state'
+ import { EditorView } from '@codemirror/view'
+
- let count: number = $state(0)
- const increment = () => {
- count += 1
- }
+ let editor: HTMLDivElement;
+
+ $effect(() => {
+ const startState = EditorState.create({
+ doc: 'Hello World !',
+ extensions: [],
+ });
+ const view = new EditorView({
+ state: startState,
+ parent: editor,
+ });
+ });
</script>
-<button onclick={increment}>
- count is {count}
-</button>
+<div bind:this={editor} />
これで、npx vite
で起動しての表示確認で、ちっこいエディタが作られた。
ただし、
Avoid 'new class' — instead, declare the class at the top level scope
な警告が表示される。
どうするべ?

Extension
Extensionの分類
- Theme
- Decoration
- 文字や行のスタイル
- Tooltip
- ホバーアクションで表示されるツールチップ
- Gutter
- 行番号表示など
- HighlightStyle
- `Syntax Highlighting
- AutoComplete
- コード補完
代表的なExtension
EditorState.createのextensions
に引き渡すと有効化。
Extension
のコレクションをExtension
として渡すこともできる(LanguageSupport
もこの類)
-
linenumbers()
-
gutter(...)
- ブレークポイントだったり、電球などのアイコン表示用のスペースを確保
-
linenumbers()
を有効化している場合は、その右側に確保 - https://codemirror.net/examples/gutter/
-
EditorView.baseTheme({...})
- エディタ欄にスタイルを適用できる
-
{ height: "200px" }
のように指定 - https://codemirror.net/docs/ref/#view.EditorView^baseTheme