当前位置: 首页 > news >正文

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

相关文章:

Codemirror6个人使用心得总结

Codemirror6 包 用法总结 本次用到的 Codemirror6 有关的包如下 语法支持包语法支持包核心插件codemirror/lang-yaml 6.1.1codemirror/lang-less 6.0.2codemirror/autocomplete 6.16.0codemirror/lang-xml 6.1.0codemirror/lang-liquid 6.2.1codemirror/commands 6.5.0codemirr…...

Ruby语言的软件开发工具

Ruby语言的软件开发工具概述 引言 Ruby是一种高效、灵活的动态编程语言&#xff0c;因其简洁的语法和强大的功能而受到开发者的欢迎。在软件开发过程中&#xff0c;使用合适的开发工具可以大幅提高工作效率&#xff0c;提升代码质量。本文将详细介绍一些常用的Ruby开发工具&a…...

OpenHarmony API 设计规范

OpenHarmony API 设计规范 修订记录 版本作者时间更新内容v0.1&#xff0c;试运行版OpenHarmony API SIG2022年11月初版发布 目的 API是软件实现者提供给使用者在编程界面上的定义&#xff0c;API在很大程度上体现了软件实体的能力范围。 同时&#xff0c;API定义的好坏极…...

ESP8266 AP模式 网页配网 arduino ide

ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过. 查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式 // 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据&#…...

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…...

C++ 之多线程相关总结

C 之多线程相关总结 1.多线程相关基础知识 1.1 线程的创建和管理 1. std::thread 类&#xff1a; 用于创建和管理线程。通过将可调用对象&#xff08;如函数、函数对象、lambda 表达式&#xff09;作为参数传递给 std::thread 的构造函数&#xff0c;可以创建一个新的线程。…...

EF Core全局查询筛选器

目录 概述 用法 添加全局查询筛选器 禁用全局查询筛选器 概述 全局查询筛选器&#xff1a;EF Core 会自动将这个查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。 场景&#xff1a;软删除、多租户。 什么是软删除&#xff1f; 逻辑删除&#xff0c;并不是真正地从数…...

【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)

本文项目编号 T 141 &#xff0c;文末自助获取源码 \color{red}{T141&#xff0c;文末自助获取源码} T141&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Objective-C语言的数据库交互

Objective-C语言的数据库交互 引言 在现代应用程序开发过程中&#xff0c;数据库在数据存储和管理方面起着至关重要的作用。对于iOS应用开发者而言&#xff0c;掌握如何在Objective-C中与数据库交互显得尤为重要。本文将全面探讨Objective-C的数据库交互&#xff0c;包括SQLi…...

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践

在现代 Web 开发中&#xff0c;前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台&#xff0c;涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8&#xff1a;稳定且广泛使用的 Java 版本。 Spring…...

笔记(数据运营方向)

以下是一些在工作过程中的小笔记&#xff0c;写的比较杂乱&#xff0c;后续再进行分类~ 1、掌握sql窗口函数 窗口函数又名开窗函数&#xff0c;属于分析函数的一种。用于解决复杂报表统计需求的功能强大的函数。窗口函数用于计算基于组的某种聚合值&#xff0c;它和聚合函数的…...

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行&#xff0c;这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟&#xff0c;但很多特性还得qt6才行&#xff0c;这里用qt5.14.2主要是考虑到服…...

[cg] glDrawBuffers MRT的应用

glDrawBuffers 是 OpenGL 中的一个函数&#xff0c;用于指定渲染结果输出到哪些颜色缓冲区。它通常在多渲染目标&#xff08;MRT, Multiple Render Targets&#xff09;中使用&#xff0c;允许一个渲染操作同时将结果输出到多个颜色缓冲区&#xff0c;而不是默认情况下的单个颜…...

IO模型与NIO基础二

抽象基类之二 FilterInputStream FilterInputStream 的作用是用来“封装其它的输入流&#xff0c;并为它们提供额外的功能”。 它的常用的子类有BufferedInputStream和DataInputStream。 (1) BufferedInputStream的作用就是为“输入流提供缓冲功能&#xff0c;以及mark()和res…...

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…...

T-SQL语言的数据库交互

T-SQL语言的数据库交互 引言 随着信息技术的不断发展&#xff0c;数据库在各个行业中扮演着越来越重要的角色。数据库的有效管理和优化对于企业的数据安全、效率提升和决策支持至关重要。T-SQL&#xff08;Transact-SQL&#xff09;作为微软SQL Server的重要扩展语言&#xf…...

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)

inode 和 block 的映射 该博文中有详细解释&#xff1a;【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题&#xff1a; 问题一&#xff1a; 我们访问文件&#xff0c;都是用的文件名&#xff0c;没用过 inode 号啊&#xff1f; 之前总是说可以通过一个…...

慧集通(DataLinkX)iPaaS集成平台-业务建模之域

通过左侧导航菜单〖业务建模〗→〖域〗&#xff0c;进入该界面&#xff1b;在该界面可以查看到系统中已存在的域列表。 新建域 在慧集通平台中进入【业务建模】的【域】页面&#xff0c;点击【新建】按钮进入新建页面&#xff1b;输入编码&#xff0c;名称、模块以及对应数据类…...

【机器学习实战】kaggle 欺诈检测---使用生成对抗网络(GAN)解决欺诈数据中正负样本极度不平衡问题

【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络&#xff0c;通过对抗生成网络生成少数类样本&#xff0c;平衡欺诈数据中正类样本极…...

android wifi framework与wpa_supplicant的交互

android frmework直接与wpa_supplicant进行交互&#xff0c;使用aidl或者hidl 二、事件 framework注册事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...