Codemirror6个人使用心得总结

Codemirror6 包 用法总结

本次用到的 Codemirror6 有关的包如下

语法支持包语法支持包核心插件
@codemirror/lang-yaml 6.1.1@codemirror/lang-less 6.0.2@codemirror/autocomplete 6.16.0
@codemirror/lang-xml 6.1.0@codemirror/lang-liquid 6.2.1@codemirror/commands 6.5.0
@codemirror/lang-angular 0.1.3@codemirror/lang-markdown 6.2.5@codemirror/language 6.10.1
@codemirror/lang-cpp 6.0.2@codemirror/lang-php 6.0.1@codemirror/language-data 6.5.1
@codemirror/lang-css 6.2.1@codemirror/lang-python 6.1.6@codemirror/legacy-modes 6.4.0
@codemirror/lang-go 6.0.0@codemirror/lang-rust 6.0.1@codemirror/lint 6.7.0
@codemirror/lang-html 6.4.9@codemirror/lang-sass 6.0.2@codemirror/search 6.5.6
@codemirror/lang-java 6.0.1@codemirror/lang-sql 6.6.4@codemirror/state 6.4.1
@codemirror/lang-javascript 6.2.2@codemirror/lang-vue 0.1.3@codemirror/view 6.26.3
@codemirror/lang-json 6.0.1@codemirror/lang-wast 6.0.2

上述包用到的导出内容如下

import { EditorState } from "@codemirror/state";
import { EditorView } from "@codemirror/view";
import {
  lineNumbers,
  highlightActiveLineGutter,
  highlightSpecialChars,
  drawSelection,
  dropCursor,
  rectangularSelection,
  crosshairCursor,
  highlightActiveLine,
  keymap,
} from "@codemirror/view";
import {
  foldGutter,
  indentOnInput,
  syntaxHighlighting,
  bracketMatching,
  foldKeymap,
} from "@codemirror/language";
import { languages } from "@codemirror/language-data";
import { history, defaultKeymap, historyKeymap } from "@codemirror/commands";
import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
import {
  closeBrackets,
  autocompletion,
  closeBracketsKeymap,
  completionKeymap,
} from "@codemirror/autocomplete";
import { lintKeymap } from "@codemirror/lint";

此外,还有一个codemirror包,从中可以导出基础模式的配置和迷你模式的配置
例如:import { basicSetup } from “codemirror”;

使用方法

const editorTheme = EditorView.theme(
  {
    // 输入的字体颜色
    "&": {
      color: theme.workspaceTextColor,
      backgroundColor: theme.workspaceBgColor,
    },
    // 背景色
    ".cm-content": {
      caretColor: theme.workspaceTextColor,
    },
    //光标的颜色
    "&.cm-focused .cm-cursor": {
      borderLeftColor: theme.cursorColor,
    },
    // 选中的状态
    "&.cm-focused .cm-selectionBackground, ::selection": {
      // color: theme.selectionBgColor, // Todo: 选中文字背景色无效
      backgroundColor: `${theme.selectionBgColor} !important`,
    },
    // 激活序列的背景色
    ".cm-gutterElement.cm-activeLineGutter": {
      backgroundColor: theme.currentLineColor,
    },
    // 激活背景色
    ".cm-activeLine.cm-line": {
      backgroundColor: `${theme.currentLineColor} !important`,
    },
    // 左侧侧边栏的颜色
    ".cm-gutters": {
      backgroundColor: theme.workspaceBgColor,
      color: theme.gutterLineNumColor,
      border: `1px solid ${theme.workspaceBgColorLight}`,
    },
  },
  { name: "my-theme" }
);

let doc = docStore.docs[id];
console.log(doc, doc.stateJson);
const state = EditorState.create({
  doc: doc.stateJson.doc.content,
  extensions: [
    editorTheme,
    lineNumbers(),
    highlightActiveLineGutter(),
    highlightSpecialChars(),
    history(),
    foldGutter(),
    drawSelection(),
    dropCursor(),
    EditorState.allowMultipleSelections.of(true),
    indentOnInput(),
    syntaxHighlighting(markdwonHighlightStyle, { fallback: false }),
    bracketMatching(),
    closeBrackets(),
    autocompletion(),
    rectangularSelection(),
    crosshairCursor(),
    // highlightActiveLine(),
    highlightSelectionMatches(),
    keymap.of([
      ...closeBracketsKeymap,
      ...defaultKeymap,
      ...searchKeymap,
      ...historyKeymap,
      ...foldKeymap,
      ...completionKeymap,
      ...lintKeymap,
    ]),
    markdown({ codeLanguages: languages }),
  ],
});

editorTheme自定义了编辑器的主题

doc: doc.stateJson.doc.content是创建 state 实例的初始文本

markdown({ codeLanguages: languages })中的languages是来自@codemirror/language-data包的导出,这个并不是固定的,language-data 是定义了一些语言包的动态导入,可以根据需求仿照他的源码进行自定义编写

markdwonHighlightStyle是自定义的语法高亮标记,定义实现如下

默认的定义样式可见:import { defaultHighlightStyle } from "@codemirror/language";

import { HighlightStyle } from "@codemirror/language";
import { tags } from "@lezer/highlight";

const markdwonHighlightStyle = HighlightStyle.define([
  {
    tag: tags.heading1,
    fontSize: "26px",
    fontWeight: "bold",
    color: "#9876aa",
  },
  {
    tag: tags.heading2,
    fontSize: "24px",
    fontWeight: "bold",
    color: "#9876aa",
  },
  {
    tag: tags.heading3,
    fontSize: "22px",
    fontWeight: "bold",
    color: "#9876aa",
  },
  {
    tag: tags.heading4,
    fontSize: "20px",
    fontWeight: "bold",
    color: "#9876aa",
  },
  {
    tag: tags.heading5,
    fontSize: "18px",
    fontWeight: "bold",
    color: "#9876aa",
  },
  {
    tag: tags.heading6,
    fontSize: "16px",
    fontWeight: "bold",
    color: "#9876aa",
  },
  { tag: [tags.strong], fontWeight: "bold" },
  { tag: tags.emphasis, fontStyle: "italic" },
  { tag: tags.strikethrough, textDecoration: "line-through" },
  { tag: tags.meta, color: "#c57330" },
  { tag: tags.link, color: "#287bde" },
  { tag: tags.quote, color: "#6a8759" },
  { tag: tags.number, color: "#2e5795" },
  { tag: tags.keyword, color: "#c57330" },
  {
    tag: [
      tags.atom,
      tags.bool,
      tags.url,
      tags.contentSeparator,
      tags.labelName,
    ],
    color: "#8e75a7",
  },
  { tag: [tags.literal, tags.inserted], color: "#a5c261" },
  { tag: [tags.string, tags.deleted], color: "#68844e" },
  {
    tag: [tags.regexp, tags.escape, tags.special(tags.string)],
    color: "#e40",
  },
  { tag: tags.definition(tags.variableName), color: "#8ea4b8" },
  { tag: tags.local(tags.variableName), color: "#30a" },
  { tag: [tags.typeName, tags.namespace], color: "#e7b350" },
  { tag: tags.className, color: "#317467" },
  {
    tag: [tags.special(tags.variableName), tags.macroName],
    color: "#256",
  },
  { tag: tags.definition(tags.propertyName), color: "#00c" },
  { tag: tags.comment, color: "#5f9654" },
  { tag: tags.invalid, color: "#f00" },
  { tag: tags.self, color: "#c57330" },
]);

简单翻译了给出的tags的值,如下

/**
 * 可能需要的tags值
 * 英文原版和更多详细信息请查看官方文档 https://lezer.codemirror.net/docs/ref/#highlight.Tag
 * 以下内容通过机器翻译,可能有误
comment: 注释
lineComment: 行注释
blockComment: 块注释
docComment: 文档注释
name: 任何类型的标识符
variableName: 变量名
typeName: 类型名
tagName: 标记名(typeName的子标记)
propertyName: 属性或字段名称
attributeName: 属性名称(propertyName的子标记)
className: 类名
labelName: 标签名称
namespace: 命名空间名称
macroName: 宏的名称
literal: 文字值
string: 字符串文字
docString: 文档字符串
character: 字符文字(string的子标记)
attributeValue: 属性值(string的子标记)。
number: 数字
integer: 整数
float: 浮点数
bool: 布尔
regexp: 正则表达式
escape: 转义文字,例如字符串中的反斜杠转义
color: 颜色
url: 链接
keyword: 语言中的关键字
self: self或本对象的关键字(this)
null: null值
atom: 表示某种原子值的关键字
unit: 表示单位的关键字
modifier: 修饰符关键字
operatorKeyword: 充当运算符的关键字
controlKeyword: 与控制流相关的关键字
definitionKeyword: 定义某个事物的关键字
moduleKeyword: 与定义模块或与模块接口相关的关键字
operator: 运算符
derefOperator: 取消引用某物的运算符
arithmeticOperator: 算术运算符
logicOperator: 逻辑运算符
bitwiseOperator: 位运算符
compareOperator: 比较运算符
updateOperator: 更新操作数的运算符
definitionOperator: 定义某物的运算符
typeOperator: 与类型相关的运算符
controlOperator: 控制流运算符
punctuation: 程序或标记语言的标点符号
separator: 分隔符
bracket: 括号式标点符号
angleBracket: 尖括号(通常是 < 和 > )
squareBracket: 方括号(通常是 [ 和 ] )
paren: 圆括号(通常是 ( 和 ) )。是bracket的子标签
brace: 大括号(通常是 { 和 } )。是bracket的子标签
content: 内容,例如XML或标记文档中的纯文本
heading: 表示标题的内容
heading1: 一级标题
heading2: 二级标题
heading3: 三级标题
heading4: 四级标题
heading5: 五级标题
heading6: 六级标题
contentSeparator: 散文分隔符(如水平线)
list: 表示列表的内容
quote: 表示引用的内容
emphasis:  强调(斜体)
strong: 强调(加粗)
link: 链接的内容
monospace: 被设置为代码或等宽字体的内容
strikethrough: 有删除线样式的内容
inserted: 在变更跟踪格式中插入的文本
deleted: 删除的文本
changed: 更改的文本
invalid: 无效或不符合语法的元素
meta: 元数据或元指令
documentMeta: 应用于整个文档的元数据
annotation: 注解或添加属性到给定语法元素的元数据
processingInstruction: 处理指令或预处理器指令。是meta的子标签
definition(tag: Tag) → 表示给定元素正在被定义的修饰符。预期与各种名称标签一起使用
constant(tag: Tag) → 表示某物是常量的修饰符。主要预期与变量名一起使用。
function(tag: Tag) → 用于表示变量或属性名被调用或定义为函数的修饰符。
standard(tag: Tag) → 可以应用于名称的修饰符,表示它们属于语言的标准环境。
local(tag: Tag) → 表示给定名称在某个范围内是局部的修饰符。
special(tag: Tag) → 一个通用的变体修饰符,可以用来标记某些常见标签的语言特定的替代变体。建议主题至少为字符串和变量名标签定义特殊形式,因为这些经常出现。
 */

使用过程中遇到的问题

  1. 使用basicSetup时,发现当前行选中时背景颜色无法突显。找到原因是其中highlightActiveLine扩展的当前行背景色与自定义背景色冲突,最后自己复制了basicSetup的代码删去highlightActiveLine扩展的使用成功解决。
  2. Codemirror联合vue使用的情况下,使用pinia仓库集中管理所有的EditorState实例(编辑器多标签),发现语法高亮会自动丢失,原因可能是EditorState实例对象太过于复杂,首先尝试了可以用markRaw标记EditorState实例让vue保持原始数据且不对数据进行监测。最后发现了更好的办法,state提供了toJSONfromJson方法,可以通过使用pinia管理这个json对象,在需要的时候利用json对象重建EditorState实例对象传递给EditorView实例显示。

总结

Codemirror6的文档还是很齐全的,但是可能由于篇幅的原因,很多方法只是给出了文字说明,外加函数原型。但是新手在不了解的情况下,看到函数原型里传入数据的各种内部类型标注还是很难理解的,解决方案可以从他的源码看起,编辑器提供了许多默认的功能,先找到编辑器默认的定义,之后对照文档的说明,就可以照猫画虎自定义想要的功能了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955403.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习实战入门】使用Python进行手写数字识别

什么是手写数字识别&#xff1f; 手写数字识别是计算机识别手写数字的能力。这对手工制造的设备来说是一个难题&#xff0c;因为手写数字并不完美&#xff0c;且人们书写数字的方式多种多样。手写数字识别旨在解决这一问题&#xff0c;通过使用数字的图像来识别该图像中的数字…

技术晋升读书笔记—华为研发

读完《华为研发》第三版&#xff0c;我深感震撼&#xff0c;书中的内容不仅详实地记录了华为公司的成长历程&#xff0c;还揭示了华为成功背后的管理理念和创新思路。这本书通过真实的案例和数据&#xff0c;展示了华为如何从一个小企业发展成全球通信行业的领导者。 一、关键人…

SQL server数据库导出excel操作

1、选择需要查询的数据库&#xff1a;鼠标右键—>任务—>导出数据 2、 选择数据源和服务器&#xff0c;使用sql server身份验证 &#xff08;数据源就是指需要从哪里导出到excel表格&#xff0c;这里就选择你需要导出的数据库&#xff09; 3、下一步选择要导出的excel表…

javaEE初阶————多线程初阶(2)

今天给大家带来第二期啦&#xff0c;保证给大家讲懂嗷&#xff1b; 1&#xff0c;线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的&#xff0c;或者即将工作&#xff0c;正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …

用LLM做测试驱动开发:有趣又高效的尝试

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

你需要什么样的资源隔离?丨TiDB 资源隔离最佳实践

导读 资源隔离是数据库性能优化的重要环节&#xff0c; TiDB 在当前版本已经实现了从数据级隔离到流控隔离的全面升级 &#xff0c;无论是多系统共享集群、复杂负载隔离&#xff0c;还是小型系统整合和 SQL 精细化控制&#xff0c;TiDB 都提供了灵活且高效的解决方案。 本文以…

1 行命令引发的 Go 应用崩溃

一、前言 不久前&#xff0c;阿里云 ARMS 团队、编译器团队、MSE 团队携手合作&#xff0c;共同发布并开源了 Go 语言的编译时自动插桩技术。该技术以其零侵入的特性&#xff0c;为 Go 应用提供了与 Java 监控能力相媲美的解决方案。开发者只需将 go build 替换为新编译命令 o…

Python毕业设计选题:基于django+vue的宠物服务管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 宠物商品管理 医疗服务管理 美容服务管理 系统…

Java连接TDengine和MySQL双数据源

git文件地址&#xff1a;项目首页 - SpringBoot连接TDengine和MySQL双数据源:SpringBoot连接TDengine和MySQL双数据源 - GitCode 1、yml配置 spring:datasource:druid:mysql:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: roo…

三十一、事件过滤处理分析

三十一、事件过滤处理分析eventFilter 实现以下功能 bool QObject::eventFilter(QObject *watched, QEvent *event)&#xff1a; 如果已将此对象安装为所监视对象的事件过滤器&#xff0c;则过滤事件。 在你重新实现这个函数时&#xff0c;如果你想过滤掉事件&#xff0c;即停…

C++ QT中Q_Q和Q_D是什么?怎么使用?本质是什么?C++仿写

1.QT中Q_Q和Q_D是什么&#xff1f; Q_Q可以得到外部可以访问的类指针Q_D可以得到内部封装&#xff0c;外部不可达的类指针 2. 怎么使用&#xff1f; 上代码 APrivate.h #pragma once #include <QtCore>class A;class APrivate {Q_DECLARE_PUBLIC(A) public:APrivate(…

三种文本相似计算方法:规则、向量与大模型裁判

文本相似计算 项目背景 目前有众多工作需要评估字符串之间的相似(相关)程度&#xff1a;  比如&#xff0c;RAG 智能问答系统文本召回阶段需要计算用户文本与文本库内文本的相似分数&#xff0c;返回前TopK个候选文本。  在评估大模型生成的文本阶段&#xff0c;也需要评估…

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐&#xff0c;但如何将其转换为易于分享和打印的 PDF 格式&#xff0c;是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法&#xff0c;并探讨…

浅谈云计算21 | Docker容器技术

Docker容器技术 一、 容器技术特性1.1 轻量级特性1.2 隔离性特性 二、容器镜像2.1 容器镜像概述2.1.1 定义与构成2.1.2 分层结构 2.2 联合文件系统2.3 容器镜像的构建与管理2.3.1 容器镜像的构建2.3.2 **构建镜像流程**2.3.3 **应用场景**2.3.4 镜像仓库的应用 2.4 容器镜像的优…

LabVIEW实现油浸式变压器自主监测与实时报告

油浸式变压器广泛应用于电力系统中&#xff0c;尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行&#xff0c;及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查&#xff0c;但这不能及时发现潜在的故障隐患&#xff0c;且效率较低。随…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等&#xff0c;同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元…

SpringBoot:RestTemplate与IllegalArgumentException

问题描述 在SpringBoot应用中&#xff0c;有时会遇到使用RestTemplate调用第三方服务的场景。例如&#xff1a;在进行地名数据采集时&#xff0c;为了拿到地名对应的经纬度位置&#xff0c;通常会有地理编码的步骤&#xff0c;此时就可能涉及到调用第三方接口服务实现此需求。 …

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…