vue3项目中使用CodeMirror组件的详细教程,中文帮助文档,使用手册
简介
这是基于 Vue 3 开发的 CodeMirror 组件。该组件基于 CodeMirror 5 开发,仅支持 Vue 3。
除了支持官方提供的各种语法模式外,还额外添加了日志输出展示模式,开箱即用,但不一定适用于所有场景。
如需完整文档和更多使用案例,请查阅 codemirror-editor-vue3 的官方文档。
安装
npm install codemirror-editor-vue3 codemirror@^5 -Syarn add codemirror-editor-vue3 codemirror@">=5.64.0 <6"pnpm i codemirror-editor-vue3 codemirror@^5 -S
如果你的项目需要支持 TypeScript,则还需要安装 @types/codemirror 依赖。
npm install @types/codemirror -D
注册全局组件
不推荐全局注册组件,这会导致模板中的类型提示无法正确获取。
main.js:
import { createApp } from "vue";
import App from "./App.vue";
import { InstallCodeMirror } from "codemirror-editor-vue3";const app = createApp(App);
app.use(InstallCodeMirror);
app.mount("#app");
全局注册的组件名称是Codemirror,或者您可以自定义组件名称,例如:
app.use(InstallCodeMirror, { componentName: "customName" });
在组件中使用
<template><Codemirrorv-model:value="code":options="cmOptions"borderplaceholder="test placeholder":height="200"@change="change"/>
</template><script>
import Codemirror from "codemirror-editor-vue3";// placeholder
import "codemirror/addon/display/placeholder.js";// language
import "codemirror/mode/javascript/javascript.js";
// placeholder
import "codemirror/addon/display/placeholder.js";
// theme
import "codemirror/theme/dracula.css";import { ref } from "vue";
export default {components: { Codemirror },setup() {const code = ref(`
var i = 0;
for (; i < 9; i++) {console.log(i);// more statements
}`);return {code,cmOptions: {mode: "text/javascript", // Language modetheme: "dracula", // Theme},};},
};
</script>
语法高亮
常用语法
- javascript
- json
- css
- html
- apl
- yaml
更多的案例正在逐渐增加,您也可以参考文档来实现更多的语言模式。
自定义语法高亮
自定义语法文件custom-js-mode
import { javascript } from "codemirror/mode/javascript/javascript";export function defineCustomMode(CodeMirror) {CodeMirror.defineMode("custom-javascript", function(config, parserConfig) {const jsMode = CodeMirror.getMode(config, "text/javascript");return {startState: function() {return {jsState: jsMode.startState(),};},token: function(stream, state) {if (stream.match(/^$([^$]*)\]/)) {return "bracket-content";}if (stream.match(/^[A-Za-z_][A-Za-z0-9_]*(?=\s*$|\s*[({=;])/)) {return "english-word";}return jsMode.token(stream, state.jsState);},indent: jsMode.indent,electricInput: jsMode.electricInput,fold: jsMode.fold,closeBrackets: jsMode.closeBrackets,};});
}
在组件中使用自定义语法模式
<template><Codemirrorv-model:value="code":options="cmOptions"borderplaceholder="test placeholder":height="200"@change="change"/>
</template><script>
import Codemirror from "codemirror-editor-vue3";// placeholder
import "codemirror/addon/display/placeholder.js";// language
import "codemirror/mode/javascript/javascript.js";
// placeholder
import "codemirror/addon/display/placeholder.js";
// theme
// import "codemirror/theme/dracula.css";
import "codemirror/theme/dracula.css";// 引入自定义模式
import { defineCustomMode } from "./custom-js-mode"; // 替换为你实际路径// 注册自定义模式
defineCustomMode(window.CodeMirror);import { ref } from "vue";
export default {components: { Codemirror },setup() {const code = ref(`[一级渠道]ROW_MAX()`);return {code,cmOptions: {// mode: "log", // Language mode// theme: "default", // Theme// mode: "text/javascript", // Language mode// theme: "dracula", // Thememode: "custom-javascript", // Language modetheme: "dracula", // Theme},};},
};
</script>
<style>/* 在 style 部分添加以下样式 */
.cm-s-dracula span.cm-variable {color: rgba(141,213,121,0.8) !important;
}.cm-s-dracula span.cm-english-word {color: rgba(216,78,224,0.8) !important;
}
</style>
配置项
name | description | type | default |
---|---|---|---|
value(v-model) | Editor content | string | “” |
options | Configuration options of codemirror5 | EditorConfiguration | DEFAULT_OPTIONS |
placeholder | Editor placeholder content to introduce codemirror related files | string | “” |
border | Whether to display editor borders | boolean | false |
width | Width | string | 100% |
height | Height | string | 100% |
original-style | Using the original style, disable the second modification of the style for this component (but does not affect width, height, and border) | boolean | false |
KeepCursorInEnd | Always keep the mouse position on the last line | boolean | false |
merge | Merge mode, can also be used as diff pattern | boolean | false |
事件
定义组件事件
下面三个仅仅是这个组件封装的事件。请参考更多事件代码镜像事件
event name | description | params |
---|---|---|
change | value or instance changes | (value: string, cm: Editor) => void |
input | input | (value: string) => void |
ready | The Codemirror component is mounted | (cm: Editor) => void |
Codemirror事件
以下事件是codemiror5的官方事件。您可以使用该组件直接通过组件绑定事件,例如:
<Codemirrorv-model:value="code":options="{ mode: 'text/x-vue', theme: 'default' }"borderplaceholder="test-placeholder":height="200"@change="onChange"@blur="onBlur"@focus="onFocus"@scroll="onScroll"
/>
全部事件
CodeMirror 提供了丰富的事件系统,使得开发者可以监听编辑器中的各种行为,并在这些行为发生时执行自定义的逻辑。以下是每个事件的简要说明和使用案例:
1. changes
- 描述:当文档内容发生变化时触发。
- 参数:
instance
:当前 CodeMirror 实例。changeObj
:包含变化信息的对象。
editor.on('changes', function(instance, changeObj) {console.log("Changes detected:", changeObj);
});
2. scroll
- 描述:当滚动条位置改变时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('scroll', function(instance) {console.log("Scroll position changed");
});
3. beforeChange
- 描述:在文档变更之前触发,允许阻止变更。
- 参数:
instance
:当前 CodeMirror 实例。changeObj
:变更对象,可修改以影响变更。
editor.on('beforeChange', function(instance, changeObj) {console.log("Before change", changeObj.from, changeObj.to, changeObj.text);
});
4. cursorActivity
- 描述:光标或选区变化时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('cursorActivity', function(instance) {console.log("Cursor or selection changed");
});
5. keyHandled
- 描述:当一个键被处理后触发。
- 参数:
instance
:当前 CodeMirror 实例。name
:按键名称。event
:原生键盘事件。
editor.on('keyHandled', function(instance, name, event) {console.log("Key handled:", name);
});
6. inputRead
- 描述:每当从输入中读取到字符时触发。
- 参数:
instance
:当前 CodeMirror 实例。changeObj
:包含变更信息的对象。
editor.on('inputRead', function(instance, changeObj) {console.log("Input read:", changeObj.text.join(""));
});
7. electricInput
- 描述:当点击输入(如自动缩进)发生时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('electricInput', function(instance, line) {console.log("Electric input on line:", line);
});
8. beforeSelectionChange
- 描述:在选择变化前触发,允许修改选择范围。
- 参数:
instance
:当前 CodeMirror 实例。obj
:包含旧的新的选择信息。
editor.on('beforeSelectionChange', function(instance, obj) {console.log("Before selection change:", obj.ranges);
});
9. viewportChange
- 描述:当视口变化时触发(比如滚动导致可见行变化)。
- 参数:
instance
:当前 CodeMirror 实例。from
:新的起始行号。to
:新的结束行号。
editor.on('viewportChange', function(instance, from, to) {console.log("Viewport changed from", from, "to", to);
});
10. swapDoc
- 描述:当文档被替换时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('swapDoc', function(instance) {console.log("Document swapped");
});
11. gutterClick
- 描述:当点击行号区域时触发。
- 参数:
instance
:当前 CodeMirror 实例。line
:点击的行号。gutter
:被点击的边栏类型。clickEvent
:鼠标事件。
editor.on('gutterClick', function(instance, line, gutter, clickEvent) {console.log("Gutter clicked at line:", line);
});
12. gutterContextMenu
- 描述:当右键点击行号区域时触发。
- 参数:
instance
:当前 CodeMirror 实例。line
:右键点击的行号。gutter
:被点击的边栏类型。contextMenuEvent
:鼠标事件。
editor.on('gutterContextMenu', function(instance, line, gutter, contextMenuEvent) {console.log("Gutter context menu opened at line:", line);
});
13. focus
- 描述:当编辑器获得焦点时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('focus', function(instance) {console.log("Editor focused");
});
14. blur
- 描述:当编辑器失去焦点时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('blur', function(instance) {console.log("Editor blurred");
});
15. refresh
- 描述:当编辑器刷新(重新计算布局)时触发。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('refresh', function(instance) {console.log("Editor refreshed");
});
16. optionChange
- 描述:当选项更改时触发。
- 参数:
instance
:当前 CodeMirror 实例。option
:更改的选项名。
editor.on('optionChange', function(instance, option) {console.log("Option changed:", option);
});
17. scrollCursorIntoView
- 描述:当尝试将光标滚动到视图中时触发。
- 参数:
instance
:当前 CodeMirror 实例。event
:事件对象。
editor.on('scrollCursorIntoView', function(instance, event) {console.log("Scrolling cursor into view");
});
18. update
- 描述:当编辑器更新时触发(包括任何可能需要重新绘制的内容变化)。
- 参数:
instance
当前 CodeMirror 实例。
editor.on('update', function(instance) {console.log("Editor updated");
});
常用方法
CodeMirror 提供了丰富的 API 方法,允许开发者与编辑器进行交互、查询和修改其状态。以下是一些常用的 CodeMirror 方法及其简要说明:
基本方法
-
getValue()
- 获取当前文档的全部内容。
var content = editor.getValue();
-
setValue(content)
- 设置整个文档的内容。
editor.setValue("新的内容");
-
replaceSelection(replacement, collapse)
- 替换当前选中的文本或在光标位置插入文本。
editor.replaceSelection("插入的文本", "end"); // 在光标后插入文本
-
focus()
- 让编辑器获得焦点。
editor.focus();
-
setOption(option, value)
- 动态设置选项。
editor.setOption("readOnly", true);
-
getOption(option)
- 获取当前选项的值。
var readOnly = editor.getOption("readOnly");
光标和选择
-
getCursor(startOrEnd)
- 获取主光标的位置。可以指定获取开始(
"start"
)或结束("end"
)位置,默认为主光标位置。
var cursor = editor.getCursor(); // 获取主光标位置
- 获取主光标的位置。可以指定获取开始(
-
setCursor(line, ch, options)
- 设置光标位置到特定行和列(从0开始计数)。
editor.setCursor(2, 5); // 移动光标到第3行第6个字符
-
somethingSelected()
- 检查是否有文本被选中。
if (editor.somethingSelected()) {console.log("有文本被选中"); }
文档操作
-
lineCount()
- 返回文档总行数。
var lines = editor.lineCount();
-
getLine(n)
- 获取特定行的文本内容。
var lineContent = editor.getLine(0); // 获取第一行的内容
-
markText(from, to, className)
- 标记一段文本,并可为其应用样式。
var marker = editor.markText({line: 1, ch: 0}, {line: 1, ch: 5}, {className: "styled-background"});
滚动和视图控制
-
scrollIntoView(pos, margin)
- 将指定位置滚动到视图中,可选地添加一个额外的边距。
editor.scrollIntoView({line: 10, ch: 0}, 10); // 滚动到第11行并留出10px边距
-
refresh()
- 刷新编辑器视图,通常在DOM元素大小改变后调用。
editor.refresh();
高级功能
-
addKeyMap(map, bottom)
- 添加自定义快捷键映射。
editor.addKeyMap({"Ctrl-Space": completeFromHint()});
-
on(event, handler)
- 注册事件监听器。
editor.on('change', function(instance, changeObj) {console.log("文档发生了变化:", changeObj); });
这些只是CodeMirror提供的部分API方法,更多高级功能如搜索、替换、注释等也都有相应的API支持。具体使用时可以根据项目需求查阅官方文档以获得更详细的说明和示例代码。由于CodeMirror版本更新可能会带来API的变化,请确保参考的是适用于您所使用的CodeMirror版本的文档。
参考文档
https://github.com/rennzhang/codemirror-editor-vue3
相关文章:
vue3项目中使用CodeMirror组件的详细教程,中文帮助文档,使用手册
简介 这是基于 Vue 3 开发的 CodeMirror 组件。该组件基于 CodeMirror 5 开发,仅支持 Vue 3。 除了支持官方提供的各种语法模式外,还额外添加了日志输出展示模式,开箱即用,但不一定适用于所有场景。 如需完整文档和更多使用案例…...
C++ stl中的list的相关函数用法
文章目录 list的介绍list的使用定义方式 插入和删除迭代器的使用获取元素容器中元素个数和容量的控制其它操作函数 list的使用,首先要包含头文件 #include <list>list的介绍 1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器&…...

【网络编程】七、详解HTTP 搭建HTTP服务器
文章目录 Ⅰ. HTTP协议的由来 -- 万维网Ⅱ. 认识URL1、URL的格式协议方案名登录信息 -- 忽略服务器地址服务器端口号文件路径查询字符串片段标识符 2、URL的编码和解码 Ⅲ. HTTP的报文结构1、请求协议格式2、响应协议格式🎏 写代码的时候,怎么保证请求和…...

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下,为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持,无论是开发环境测试还是生产环境部署࿰…...
Spring Boot 中的重试机制
Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的,用于自动重试可能会失败的方法。在微服务架构和分布式系统中,服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…...
【React中useRef钩子详解】
一、useRef的核心特性 useRef是React提供的Hook,用于在函数组件中创建可变的持久化引用,具有以下核心特性: 持久化存储 返回的ref对象在组件整个生命周期内保持不变,即使组件重新渲染,current属性的值也不会丢失。无触发渲染 修改ref.current的值不会导致组件重新渲染,适…...
golang-ErrGroup用法以及源码解读笔记
介绍 ErrGroup可以并发执行多个goroutine,并可以很方便的处理错误 与sync.WaitGroup相比 错误处理 sync.WaitGroup只负责等待goroutine执行完成,而不处理返回值或者错误errgroup.Group目前虽然不能直接处理函数的返回值或错误。但是当goroutine返回错…...
17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki
在微服务中,日志是非常重要的组成部分。它不仅可以帮助我们排查问题,还可以帮助我们分析系统的性能和使用情况。 一、loki简介 loki是一个开源的日志聚合系统,它可以帮助我们高效地收集、存储和分析日志数据。loki的设计理念是“简单、快速…...

CVPR计算机视觉顶会论文解读:IPC-Dehaze 如何解决真实场景去雾难题
【CVPR 2025】迭代预测-评判编解码网络:突破真实场景去雾的极限 摘要 本文提出了一种名为IPC-Dehaze的创新去雾方法,通过迭代预测-评判框架和码本解码机制,有效解决了现有去雾算法在复杂场景下的性能瓶颈。该方法在多个基准测试中取得了SOT…...

ppy/osu构建 ipad作为osu按键xz笔记2 deepwiki websokect
ipad当x和z键玩osu #无声打osu#没磁轴怎么打osu 下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建:f5 运行:dotnet run --project osu.Desktop -c Debug deepwiki就是nb uinput是ubuntu的我现在没法调试,放着 import asyn…...
scons user 3.1.2
前言 感谢您抽出时间阅读有关 SCons 的内容。SCons 是一款下一代软件构建工具,或者称为 make 工具,即一种用于构建软件(或其他文件)并在底层输入文件发生更改时使已构建的软件保持最新状态的软件实用程序。 SCons 最显著的特点是…...
大语言模型主流架构解析:从 Transformer 到 GPT、BERT
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...

.NET程序启动就报错,如何截获初期化时的问题json
一:背景 1. 讲故事 前几天训练营里的一位朋友在复习课件的时候,程序一跑就报错,截图如下: 从给出的错误信息看大概是因为json格式无效导致的,在早期的训练营里曾经也有一例这样的报错,最后定位下来是公司…...

nacos:服务注册原理
目录 NaCos服务注册原理1、AbstractAutoServiceRegistration功能和作用onApplicationEvent()方法start()方法 2、NacosAutoServiceRegistration功能和作用NacosAutoServiceRegistration.register()方法AbstractAutoServiceRegistration.register()方法 3、NacosServiceRegistry…...

基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究
摘要:在数字文明时代,个人品牌塑造已从传统经验驱动转向数据智能驱动。本文以开源AI大模型、AI智能名片与S2B2C商城小程序源码为技术载体,提出"社会评价-数据验证-标签重构"的三维分析框架。通过实证研究发现,结合第三方…...
《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
React Native与Flutter作为两款备受瞩目的跨平台开发框架,正深刻地影响着应用的构建方式。当聚焦于用户行为分析与埋点统计时,它们各自展现出独特的策略与工具选择,这些差异和共性不仅关乎开发效率,更与社交应用能否精准把握用户需…...

polarctf-web-[简单rce]
考点: (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源:Polarctf-web-[简单rce] 解题: 代码审计 <?php/*PolarD&N CTF*/highlight_file(__FILE__);function no($txt){ # …...

深入理解 Cortex-M3 特殊寄存器
在上一篇文章中分享了 Cortex-M3 内核寄存器组的相关知识,实际上除了内核寄存器组外,CM3 处理器中还存在多个特殊寄存器,它们分别为 程序状态寄存器,中断/异常屏蔽寄存器 和 控制寄存器。 需要注意的是,特殊寄存器未经…...

[Java实战]Spring Boot 3 整合 Ehcache 3(十九)
[Java实战]Spring Boot 3 整合 Ehcache 3(十九) 引言 在微服务和高并发场景下,缓存是提升系统性能的关键技术之一。Ehcache 作为 Java 生态中成熟的内存缓存框架,其 3.x 版本在性能、功能和易用性上均有显著提升。本文将详细介绍…...

建筑物渗水漏水痕迹发霉潮湿分割数据集labelme格式1357张1类别
数据集中有增强图片详情看图片 数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1357 标注数量(json文件个数):1357 标注类别数:1 标注类别名称:["water&qu…...
Doris和Clickhouse对比
目录 一、Doris和Clickhouse对比1. 底层架构**DorisClickHouse** 2. 运行原理DorisClickHouse 3. 使用场景DorisClickHouse 4. 优缺点对比总结 二、MPP架构和Shared-Nothing 架构对比1. 什么是 MPP 架构?定义特点典型代表 2. 什么是 Shared-Nothing 架构?…...

第二十二天打卡
数据预处理 import pandas as pd from sklearn.model_selection import train_test_splitdef data_preprocessing(file_path):"""泰坦尼克号生存预测数据预处理函数参数:file_path: 原始数据文件路径返回:preprocessed_data: 预处理后的数据集""&quo…...
Android Activity之间跳转的原理
一、Activity跳转核心流程 Android Activity跳转的底层实现涉及 系统服务交互、进程间通信(IPC) 和 生命周期管理,主要流程如下: startActivity() 触发请求 应用调用 startActivity() 时,通过 Inst…...
MATLAB 矩阵与数组操作基础教程
文章目录 前言环境配置一、创建矩阵与数组(一)直接输入法(二)特殊矩阵生成函数(三)使用冒号表达式创建数组 二、矩阵与数组的基本操作(一)访问元素(二)修改元…...
【Linux】第十六章 分析和存储日志
1. RHEL 日志文件保存在哪个目录中? 一般存储在 /var/log 目录中。 2. 什么是syslog消息和非syslog消息? syslog消息是一种标准的日志记录协议和格式,用于系统和应用程序记录日志信息。它规定了日志消息的结构和内容,包括消息的…...

解锁性能密码:Linux 环境下 Oracle 大页配置全攻略
在 Oracle 数据库运行过程中,内存管理是影响其性能的关键因素之一。大页内存(Large Pages)作为一种优化内存使用的技术,能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念,并详细阐述 Oracle 在…...

Spark,在shell中运行RDD程序
在hdfs中/wcinput中创建一个文件:word2.txt在里面写几个单词 启动hdfs集群 [roothadoop100 ~]# myhadoop start [roothadoop100 ~]# cd /opt/module/spark-yarn/bin [roothadoop100 ~]# ./spark-shell 写个11测试一下 按住ctrlD退出 进入环境:spa…...

SAP学习笔记 - 开发11 - RAP(RESTful Application Programming)简介
上一章学习了BTP架构图,实操创建Directory/Subaccount,BTP的内部组成,BTP Cockpit。 SAP学习笔记 - 开发10 - BTP架构图,实操创建Directory/Subaccount,BTP的内部组成,BTP Cockpit-CSDN博客 本章继续学习S…...

数据防泄密安全:企业稳健发展的守护盾
在数字化时代,数据已成为企业最核心的资产之一。无论是客户信息、财务数据,还是商业机密,一旦泄露,都可能给企业带来不可估量的损失。近年来,数据泄露事件频发,如Facebook用户数据泄露、Equifax信用数据外泄…...

MySQL之基础索引
目录 引言 1、创建索引 2、索引的原理 2、索引的类型 3、索引的使用 1.添加索引 2.删除索引 3.删除主键索引 4.修改索引 5.查询索引 引言 当一个数据库里面的数据特别多,比如800万,光是创建插入数据就要十几分钟,我们查询一条信息也…...