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

使用 CodeMirror 6 实现插入文本及替换选中文本功能

本文将通过具体的代码示例,详细解释如何在 Vue3 中使用 CodeMirror 6 实现文本插入功能,包括在光标位置插入文本和选中文本插入文本的代码示例,以及这两种插入方式的区别。

1. 只能在光标位置插入文本

1.1 代码示例

const insertTemplate = (template) => {try {if (!editorView.value) return;const state = editorView.value.state;const selection = state.selection.main;const currentPos = selection.head;const anchor = currentPos + template.length;const head = selection.main.head;console.log('当前光标位置:', currentPos);editorView.value.dispatch({changes: {from: currentPos,to: currentPos,insert: template},selection: EditorSelection.range(anchor, head),scrollIntoView: true});editorView.value.focus();} catch (e) {console.error('插入失败:', e);}
};

1.2 详细解释

  1. 获取编辑器状态和选择范围

    const state = editorView.value.state;
    const selection = state.selection.main;
    const currentPos = selection.head;
    • state:获取当前编辑器的状态。

    • selection:获取当前选择范围。

    • currentPos:获取当前光标位置。

  2. 计算新光标位置

    const anchor = currentPos + template.length;
    const head = selection.main.head;
    • anchor:新光标位置的起始点。

    • head:新光标位置的结束点。

  3. 执行插入操作

editorView.value.dispatch({changes: {from: currentPos,to: currentPos,insert: template},selection: EditorSelection.range(anchor, head),scrollIntoView: true
});
  • changes:定义插入操作的范围和内容,from和to要特别注意,要不报错。

  • selection:设置新的选择范围。

  • scrollIntoView:确保插入位置滚动到可见区域。

遇见这样的错误,很大概率是from和to搞错了。

更新编辑器

editorView.value.focus();

2. 可以根据用户是否选中文本,在选中文本位置替换插入文本

2.1 代码示例

const insertTemplate = (template) => {try {if (!editorView.value) return;const state = editorView.value.state;const selection = state.selection.main;if (selection.empty) {const from = selection.main.from;const to = selection.main.to;editorView.value.dispatch({changes: {from: from,to: to,insert: template},selection: EditorSelection.range(from + template.length, selection.main.from)});} else {const posFrom = selection.main.from;const anchor = posFrom + template.length;editorView.value.dispatch({changes: {from: posFrom,to: posFrom,insert: template},selection: EditorSelection.range(anchor, selection.main.from)});}editorView.value.focus();} catch (e) {console.error('插入失败:', e);}
};

2.2 详细解释

  1. 判断是否选中文本

    if (selection.empty) {// 选中文本为空
    } else {// 选中文本不为空
    }

selection.empty:查询codemirror6的文档,可以知道该属性可以用来判断from和to是否相同,进而判断当前选择范围是否为空。

  • 处理选中文本为空的情况

    const from = selection.main.from;
    const to = selection.main.to;editorView.value.dispatch({changes: {from: from,to: to,insert: template},selection: EditorSelection.range(from + template.length, selection.main.from)
    });
    • fromto:获取当前选择范围的起始和结束位置,此时from和to不同。

    • changes:定义插入操作的范围和内容。

    • selection:设置新的选择范围。

  • 处理选中文本不为空的情况

    const posFrom = selection.main.from;
    const anchor = posFrom + template.length;editorView.value.dispatch({changes: {from: posFrom,to: posFrom,insert: template},selection: EditorSelection.range(anchor, selection.main.from)
    });
    • posFrom:获取当前选择范围的起始位置,from和to相同。

    • anchor:计算新光标位置的起始点。

    • changes:定义插入操作的范围和内容。

    • selection:设置新的选择范围。

3. 两种插入方式的区别

3.1 在光标位置插入文本

  • 适用场景:用户希望在当前光标位置插入文本,而不影响其他内容。

  • 实现方式:在当前光标位置插入文本,并更新光标位置。

3.2 在选中文本位置插入文本

  • 适用场景:用户希望在选中的文本范围内插入文本,可能替换选中的文本。

  • 实现方式:在选中的文本范围内插入文本,并更新选择范围。

4. 常见问题及解决方案

4.1 插入失败:RangeError: Invalid change range

问题描述:在插入文本时,可能会遇到 RangeError: Invalid change range 错误。

解决方案

  • 确保 fromto 的值正确,且 from 小于等于 to

  • 确保插入的文本范围在文档范围内。

4.2 光标位置不正确

问题描述:编辑器组件的值来自父组件的传值,在初始化父组件传值之后,每次插入文本都会在刚开始的第一行插入,无论怎么选中光标也不行,后来感觉光标位置可能不正确。原因就是在父组件传值之后,光标位置并没有更新,所以每次插入还是从0开始。

解决方案

确保在父组件传值之后,在 EditorView.value.dispatch 方法中正确设置 selection,设置正确的光标位置

4.3 如何监听光标位置,判断是否是光标位置错误的问题

问题描述:如何监听光标位置,并在控制台输出,以此判断是否是光标位置错误的问题

解决方案

state的插件中使用一个函数输出光标起始位置。

4.4 怎么判断自己写的事务是不是有效的

问题描述:在代码调试时,我一度怀疑是自己的事务使用错了,导致无法成功。

解决方案

可以简单使用下面的函数判断一下事务是不是有效的。

5. 总结

通过以上代码示例和详细解释,我们可以在 Vue3 中成功使用 CodeMirror 6 实现文本插入功能。希望本文能够帮助大家更好地理解和使用 CodeMirror 6,有什么问题欢迎大家在评论区一起交流。

相关文章:

使用 CodeMirror 6 实现插入文本及替换选中文本功能

本文将通过具体的代码示例,详细解释如何在 Vue3 中使用 CodeMirror 6 实现文本插入功能,包括在光标位置插入文本和选中文本插入文本的代码示例,以及这两种插入方式的区别。 1. 只能在光标位置插入文本 1.1 代码示例 const insertTemplate …...

Huatuo热更新--如何使用

在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…...

Flask实现高效日志记录模块

目录 一. 简介: 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建(包含日志记录的关键字段) 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...

scroll、offset、client三大家族和getBoundingClientRect方法

scroll、offset、client三大家族和getBoundingClientRect方法 1.offset(只能读,不能修改)2.client(只能读,不能修改)3.scroll滚动家族4.getBoundingClientRect方法 1.offset(只能读,不能修改) offsetParent:离当前元素最近的有定位的祖先元素…...

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言: 在现代Web应用和微服务架构中,用户身份验证和信息安全传输是核心问题。JSON Web Token(J…...

Python基于Flask的豆瓣Top250电影数据可视化分析与评分预测系统(附源码,技术说明)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…...

JavaScript数组-遍历数组

在JavaScript中,数组是一种非常常用的数据结构,用于存储一系列有序的数据项。无论是处理简单的列表还是复杂的数据集合,遍历数组都是我们经常需要执行的操作之一。本文将详细介绍几种常见的遍历数组的方法,并讨论它们各自的优缺点…...

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …...

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断(数据来源:Gartner 2025)。当竞品在凌晨3点自动发布「智能家居安装指南」时,你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…...

分词器(Tokenizer) | 有了分词器,为什么还需要嵌入模型

文章目录 什么是tokenizer有了分词器,为什么还需要嵌入模型分词器为什么在transformers 里Hugging Face的Tokenizer大模型不同tokenizer训练效果对比分词器库选择当前顶尖大模型所采用的 Tokenizer 方法与词典大小 参考 什么是tokenizer Tokenizers huggingface官方…...

VisionTransformer(ViT)与CNN卷积神经网络的对比

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

计算机视觉+Numpy和OpenCV入门

Day 1:Python基础Numpy和OpenCV入门 Python基础 变量与数据类型、函数与类的定义、列表与字典操作文件读写操作(读写图像和数据文件) 练习任务:写一个Python脚本,读取一个图像并保存灰度图像。 import cv2 img cv2.im…...

Vue 3 工程化打包工具:从理论到实践 (下篇)

引言 在前端开发中,打包工具是工程化的重要组成部分。Vue 3 作为当前流行的前端框架,其工程化离不开高效的打包工具。打包工具不仅能够将代码、样式、图片等资源进行优化和压缩,还能通过模块化、代码分割等功能提升应用的性能。本文将深入探…...

java经验快速学习python!

title: java经验快速学习python! date: 2025-02-19 01:52:05 tags: python学习路线 java经验快速学习python! 本篇文档会一直更新!!!变量、分支结构、循环结构、数据结构【列表、元组、集合字典】python常用内置函数元…...

爬虫破解网页禁止F12

右击页面显示如下 先点击f12再输入网址,回车后没有加载任何数据 目前的一种解决方法: 先 AltD ,再 CtrlShifti...

从零开始构建一个语言模型中vocab_size(词汇表大小)的设定规则

从零开始构建一个语言模型就要设计一个模型框架,其中要配置很多参数。在自然语言处理任务中,vocab_size(词汇表大小) 的设定是模型设计的关键参数之一,它直接影响模型的输入输出结构、计算效率和内存消耗。 本文是在我前文的基础上讲解的:从零开始构建一个小型字符级语言…...

Jenkins插件管理切换国内源地址

安装Jenkins 插件时,由于访问不了国外的插件地址,会导致基本插件都安装失败。 不用着急,等全部安装失败后,进入系统,修改插件源地址,重启后在安装所需插件。 替换国内插件更新地址 选择:系统…...

Q - learning 算法是什么

Q - learning 算法是什么 Q - learning 算法是一种经典的无模型强化学习算法,由克里斯沃特金斯(Chris Watkins)在 1989 年提出。它被广泛应用于解决各种决策问题,尤其适用于智能体在环境中通过与环境交互来学习最优策略的场景。下面从基本概念、核心公式、算法流程和特点几…...

nasm - console 32bits

文章目录 nasm - console 32bits概述笔记my_build.batnasm_main.asm用VS2019写个程序,按照win32方式编译,比较一下。备注END nasm - console 32bits 概述 看到一个nasm的例子(用nasm实现一个32bits控制台的程序架子) 学习一下 笔记 my_build.bat ec…...

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件,已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …...

软考高项-案例万金油(进度成本纠偏)

进度纠偏措施:赶工。投入更多的资源或增加工作时间,以缩短关键活动的工期。快速跟进。并行施工,以缩短关键路径的长度。高效替换低效。使用高素质的资源或经验更丰富的人员。采用新技术。改进方法或技术,以提高生产效率。缩小范围…...

3分钟解锁Windows安卓魔法:告别笨重模拟器时代

3分钟解锁Windows安卓魔法:告别笨重模拟器时代 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经幻想过,在Windows上运行安卓应用可以像…...

你的ST-LINK是‘李鬼’吗?实测Keil中关闭一个选项,破解‘非正版设备’警告(附原理浅析)

ST-LINK设备真伪检测机制解析与Keil警告消除方案 最近在嵌入式开发社区中,关于"Not a genuine ST Device! Abort connection"警告的讨论热度持续攀升。许多开发者在使用第三方ST-LINK调试器时都会遇到这个恼人的提示,虽然不影响基本功能&#…...

《打造高准确率QClaw知识库:从清洗到拆分的完整实操流程》

绝大多数人对QClaw知识库的认知都停留在最表层,以为只要把文件拖进上传框,就能得到一个无所不知的私人助理。但实际使用中却会发现,明明文档里写得清清楚楚的内容,QClaw要么答非所问,要么只能说出零散的只言片语,甚至会编造出完全不存在的信息。很多人因此归咎于工具本身…...

终极音乐格式转换解决方案:如何用QMCDecode轻松解锁QQ音乐加密文件

终极音乐格式转换解决方案:如何用QMCDecode轻松解锁QQ音乐加密文件 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录&…...

AI Agent实战专栏导读:6周掌握智能代理开发(含完整代码)

🎯 8篇深度教程 5个完整项目 | 完全免费 | 代码开源可运行 📖 专栏介绍 欢迎来到 AI Agent实战专栏! 这是国内首个系统化的AI Agent实战教程系列,从基础概念到企业级应用,带你全面掌握智能代理开发技术。 ✨ 专栏特…...

MATLAB R2023a新功能实测:用SHAP值给你的机器学习模型做个‘CT扫描’,到底哪个特征说了算?

MATLAB R2023a中的SHAP值分析:揭开机器学习模型的黑箱之谜 当你的随机森林模型坚定地拒绝了某位贷款申请人,或是回归模型预测出某款车型的油耗异常高时,你是否曾好奇——究竟是哪些特征在背后主导了这些决策?MATLAB R2023a带来的S…...

程序员编程助手科技股份有限责任公司AIRecomandationWebSys技术经理四川大学计算机学院毕业生技术官微软技术工程师12年工作经验后端技术微软工程师

-程序员编程助手科技股份有限责任公司AIRecomandationWebSys技术经理四川大学计算机学院毕业生技术官微软技术工程师12年工作经验后端技术微软工程师创新青年公寓北京大学系统所硕士研究生四川前端技术研发工程师Sunny香港高级前端技术研发工程师Angus_ALHr北京大学本科生Trans…...

从零构建极简LLM推理引擎:CUDA优化与Transformer实现详解

1. 项目概述:从零构建一个极简高效的LLM推理引擎 最近在深入学习和实践CUDA与通用GPU计算时,我萌生了一个想法:为什么不从零开始,亲手打造一个大型语言模型的推理引擎呢?这个念头一旦产生就挥之不去。对于任何想在底层…...

顺序表 -->增、删、查、改等详细操作

个人主页:流年如梦 专栏:《C语言》 《数据结构》 文章目录一.线性表二.顺序表2.1概念与结构2.2静态顺序表2.3动态顺序表2.3.1动态顺序表结构体2.3.2头文件声明 --> SeqList.h2.3.3源文件实现 --> SeqList.c2.3.3.1初始化2.3.3.2销毁2.3.3.3打印2.3…...