Add synchronized editor spelling and tab width preferences

This commit is contained in:
eezd committed 2026-10-20 19:08:43 +08:00
1 parent f9cfb138ea
commit f188f0fc32
4 files changed
+50 -6

No files matched your search

+8 -1
View File
@@ -20,6 +20,7 @@ export { insertImageFiles, pasteImages } from './paste'
// 沿用其语言数据,markdownKeymap 中的命令据此识别 Markdown(isActiveAt 按语言数据判断)
export const pluginCompartment = new Compartment()
export const languageCompartment = new Compartment()
export const preferencesCompartment = new Compartment()
export function pluginLanguage() { return new Language(
markdownLanguage.data,
(markdownLanguage.parser as MarkdownParser).configure([typoraExtensions, ...[...markdownSyntax.values()].map((entry) => entry.value)]),
@@ -30,6 +31,8 @@ export function pluginEditorExtensions(): Extension[] { return [...editorExtensi
export interface EditorStateOptions {
doc: string
spellcheck?: boolean
tabSize?: number
resolveImage?: (src: string) => string
// 文档变化回调,仅对挂载在视图上的状态触发;未激活标签页的状态由调用方直接更新
onChange?: (update: ViewUpdate) => void
@@ -65,7 +68,11 @@ export function createEditorState(opts: EditorStateOptions): EditorState {
// CodeMirror 只在 Linux/Mac 上把 Ctrl/Cmd+Shift+Z 绑定为重做,Windows 上会退化成撤销;
// 与 Typora、VS Code 保持一致,所有平台都支持
keymap.of([indentWithTab, { key: 'Mod-Shift-z', run: redo, preventDefault: true }, ...defaultKeymap, ...historyKeymap]),
EditorView.contentAttributes.of({ spellcheck: 'false', autocapitalize: 'sentences' }),
preferencesCompartment.of([
EditorState.tabSize.of(opts.tabSize ?? 4),
EditorView.contentAttributes.of({ spellcheck: String(opts.spellcheck ?? false) }),
]),
EditorView.contentAttributes.of({ autocapitalize: 'sentences' }),
]
if (opts.resolveImage) extensions.push(resolveImageUrl.of(opts.resolveImage))
if (opts.onChange) {