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) → 一个通用的变体修饰符,可以用来标记某些常见标签的语言特定的替代变体。建议主题至少为字符串和变量名标签定义特殊形式,因为这些经常出现。*/
使用过程中遇到的问题
- 使用
basicSetup
时,发现当前行选中时背景颜色无法突显。找到原因是其中highlightActiveLine
扩展的当前行背景色与自定义背景色冲突,最后自己复制了basicSetup
的代码删去highlightActiveLine
扩展的使用成功解决。 - 在
Codemirror
联合vue
使用的情况下,使用pinia
仓库集中管理所有的EditorState
实例(编辑器多标签),发现语法高亮会自动丢失,原因可能是EditorState
实例对象太过于复杂,首先尝试了可以用markRaw
标记EditorState
实例让vue
保持原始数据且不对数据进行监测。最后发现了更好的办法,state提供了toJSON
和fromJson
方法,可以通过使用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是一种高效、灵活的动态编程语言,因其简洁的语法和强大的功能而受到开发者的欢迎。在软件开发过程中,使用合适的开发工具可以大幅提高工作效率,提升代码质量。本文将详细介绍一些常用的Ruby开发工具&a…...
OpenHarmony API 设计规范
OpenHarmony API 设计规范 修订记录 版本作者时间更新内容v0.1,试运行版OpenHarmony API SIG2022年11月初版发布 目的 API是软件实现者提供给使用者在编程界面上的定义,API在很大程度上体现了软件实体的能力范围。 同时,API定义的好坏极…...
ESP8266 AP模式 网页配网 arduino ide
ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过. 查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式 // 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据&#…...

OpenCV基础:获取子矩阵的几种方式
目录 相关阅读 方法一:使用切片操作 方法二:使用高级索引 方法三:使用条件筛选 方法四:使用 numpy 的 take 函数 相关阅读 OpenCV基础:矩阵的创建、检索与赋值-CSDN博客 OpenCV基础:图像运算-CSDN博客…...
C++ 之多线程相关总结
C 之多线程相关总结 1.多线程相关基础知识 1.1 线程的创建和管理 1. std::thread 类: 用于创建和管理线程。通过将可调用对象(如函数、函数对象、lambda 表达式)作为参数传递给 std::thread 的构造函数,可以创建一个新的线程。…...

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

【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)
本文项目编号 T 141 ,文末自助获取源码 \color{red}{T141,文末自助获取源码} T141,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Objective-C语言的数据库交互
Objective-C语言的数据库交互 引言 在现代应用程序开发过程中,数据库在数据存储和管理方面起着至关重要的作用。对于iOS应用开发者而言,掌握如何在Objective-C中与数据库交互显得尤为重要。本文将全面探讨Objective-C的数据库交互,包括SQLi…...

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践
在现代 Web 开发中,前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台,涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8:稳定且广泛使用的 Java 版本。 Spring…...
笔记(数据运营方向)
以下是一些在工作过程中的小笔记,写的比较杂乱,后续再进行分类~ 1、掌握sql窗口函数 窗口函数又名开窗函数,属于分析函数的一种。用于解决复杂报表统计需求的功能强大的函数。窗口函数用于计算基于组的某种聚合值,它和聚合函数的…...

qt vs ios开发应用环境搭建和上架商店的记录
qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行,这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟,但很多特性还得qt6才行,这里用qt5.14.2主要是考虑到服…...
[cg] glDrawBuffers MRT的应用
glDrawBuffers 是 OpenGL 中的一个函数,用于指定渲染结果输出到哪些颜色缓冲区。它通常在多渲染目标(MRT, Multiple Render Targets)中使用,允许一个渲染操作同时将结果输出到多个颜色缓冲区,而不是默认情况下的单个颜…...

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

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)
单例模式 作用:单例模式的核心是保证一个类只有一个实例,并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全,调用效率高 ,但是不能延迟加载懒汉式线程安全,调用效率不高,能延迟加载双重检…...
T-SQL语言的数据库交互
T-SQL语言的数据库交互 引言 随着信息技术的不断发展,数据库在各个行业中扮演着越来越重要的角色。数据库的有效管理和优化对于企业的数据安全、效率提升和决策支持至关重要。T-SQL(Transact-SQL)作为微软SQL Server的重要扩展语言…...

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)
inode 和 block 的映射 该博文中有详细解释:【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题: 问题一: 我们访问文件,都是用的文件名,没用过 inode 号啊? 之前总是说可以通过一个…...

慧集通(DataLinkX)iPaaS集成平台-业务建模之域
通过左侧导航菜单〖业务建模〗→〖域〗,进入该界面;在该界面可以查看到系统中已存在的域列表。 新建域 在慧集通平台中进入【业务建模】的【域】页面,点击【新建】按钮进入新建页面;输入编码,名称、模块以及对应数据类…...
【机器学习实战】kaggle 欺诈检测---使用生成对抗网络(GAN)解决欺诈数据中正负样本极度不平衡问题
【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络,通过对抗生成网络生成少数类样本,平衡欺诈数据中正类样本极…...
android wifi framework与wpa_supplicant的交互
android frmework直接与wpa_supplicant进行交互,使用aidl或者hidl 二、事件 framework注册事件的地方: packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...