Monaco Editor系列(六)Range详解、Uri 自动匹配语言模型、缩略图 miniMap 配置

前情回顾: 一鼓作气,再鼓,再鼓!!哈哈哈。争取早日占领 Monaco 领地。 上一篇文章讲到的三个功能分别是 Position 类型、设置 markers、指定位置插入或替换内容 涉及到的知识点:

⛈️ 获取光标位置: editor.getPosition()
⛈️ 获取某个位置处的单词: model.getWordAtPosition(IPosition)
⛈️ 设置 model 的 markers:monaco.editor.setModelMarkers(model, 拥有者字符串, markers数组)
⛈️ 获取 model 的markers:monaco.editor.getModelMarkers(filter过滤条件)
⛈️ 删除 model 中所有的 markers:monaco.editor.removeAllMarkers()
⛈️ 监听 markers 修改的监听器:monaco.editor.onDidChangeMarkers(回调函数)
⛈️ 查找单词的位置:model.findMatch(参数列表)
⛈️ 将 url 地址解析为 monaco 能使用的链接 :monaco.Uri.parse(地址)
⛈️ 在指定位置添加或修改内容:model.applyEdits()

这一篇文章继续来探索更多的功能吧!遨游在 monaco editor 的世界里是不是很快乐啊哈哈哈哈(bushi

另外,给大家推荐一下我学习 Monaco Editor 的专栏:Monaco Editor编辑器教程,大佬写的非常好,是少有的成系列的学习 Monaco Editor 的学习资料,并且有很多总结性的东西都给总结好了。一千个程序员就有一千个 Monaco Editor,通过广泛阅读别人写的文章可以更快的进步哦!💪🏾💪🏾💪🏾💪🏾💪🏾

一、Range 详解

上一篇文章的第一章,我们一起探索了 Monaco 中一个非常重要的基类 Position,还有对应的接口 IPosition,用来描述位置信息。回顾一下我们在设置 markers 的时候用的 findMatches() 方法,返回值里面有一个属性是 Range 类
在这里插入图片描述
还有 IMarkerData 里面的属性:
在这里插入图片描述
Position 只能表示一个点,但是在需要一个范围的场景中,就需要使用到 Range 了。上面标红的几个属性就是 Range 类的属性。
node_modules/monaco-editor-core/monaco.d.ts

export class Range {readonly startLineNumber: number;readonly startColumn: number;readonly endLineNumber: number;readonly endColumn: number;constructor(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number);isEmpty(): boolean;static isEmpty(range: IRange): boolean;// 如果一个 position 在 range 的内部,返回 truecontainsPosition(position: IPosition): boolean;static containsPosition(range: IRange, position: IPosition): boolean;// 检测是否包含另一个 rangecontainsRange(range: IRange): boolean;static containsRange(range: IRange, otherRange: IRange): boolean;// 检测是否严格包含另一个 range,即边缘不重合, 空心球strictContainsRange(range: IRange): boolean;static strictContainsRange(range: IRange, otherRange: IRange): boolean;// 合并两个 range,使用前面 range 的起始点,后面 range 的终止点plusRange(range: IRange): Range;static plusRange(a: IRange, b: IRange): Range;// 获取两个 range 的交集intersectRanges(range: IRange): Range | null;static intersectRanges(a: IRange, b: IRange): Range | null;// 检测 range 是否相同equalsRange(other: IRange | null | undefined): boolean;static equalsRange(a: IRange | null | undefined, b: IRange | null | undefined): boolean;// 获取 range 的结尾位置getEndPosition(): Position;static getEndPosition(range: IRange): Position;getStartPosition(): Position;static getStartPosition(range: IRange): Position;toString(): string;// 修改 range 的结尾位置,起始位置不变setEndPosition(endLineNumber: number, endColumn: number): Range;setStartPosition(startLineNumber: number, startColumn: number): Range;// 从 range 起始位置,创建一个空的 rangecollapseToStart(): Range;static collapseToStart(range: IRange): Range;collapseToEnd(): Range;static collapseToEnd(range: IRange): Range;// 将 range 移动给定的行数delta(lineCount: number): Range;static fromPositions(start: IPosition, end?: IPosition): Range;/*** Create a `Range` from an `IRange`.*/static lift(range: undefined | null): null;static lift(range: IRange): Range;static lift(range: IRange | undefined | null): Range | null;static isIRange(obj: any): obj is IRange;// 检测两个 range 是否有相交的部分,包括边缘接触的情况static areIntersectingOrTouching(a: IRange, b: IRange): boolean;static areIntersecting(a: IRange, b: IRange): boolean;// 用于对比已经排序的 ranges// 先对比起始位置,再对比结束位置static compareRangesUsingStarts(a: IRange | null | undefined, b: IRange | null | undefined): number;// 用于对比已经排序的 ranges// 先对比结束位置,再对比起始位置static compareRangesUsingEnds(a: IRange, b: IRange): number;// 检测 range 是否跨行static spansMultipleLines(range: IRange): boolean;// 将 range转换成 IRange 类型 json 格式toJSON(): IRange;
}

IPosition 类似,存在 IRange 接口,其中只有必要的属性,通常传参数以及范围相关的函数的返回值都是 IRange 类型

export interface IRange {readonly startLineNumber: number;readonly startColumn: number;readonly endLineNumber: number;readonly endColumn: number;
}

Range 也是 Monaco 中一个非常有用的基类,和 范围 相关的需求都要想起来往 Range 类里找找方法哦

二、根据 Uri自动匹配源码模型

还记得我们之前使用过的 monaco.editor.createModel() 方法吗?这是用来创建 model 的方法。这个方法的定义是这个样子的:

export function createModel(value: string, language?: string, uri?: Uri): ITextModel;

第二个参数是语言,第三个参数是 uri

咱们先来看一下源码中关于这个方法的注释:
创建一个新的编辑器模型。你可以指定这个模型应该设置的语言,或者让语言根据 URI 推断。

关于 Uri,我们来看看 AI 的解释:
在 Monaco 中,Uri 是一个表示统一资源标识符(Uniform Resource Identifier)的类。它用于表示文件系统中的文件、目录或其他资源的唯一标识符。
Uri 类提供了一些方法和属性,用于处理和操作文件路径、文件扩展名、查询参数等。它还可以将文件路径转换为 Uri 对象,并提供了一些辅助方法,如解析相对路径、合并路径等。
在 Monaco 编辑器中,Uri 经常用于表示打开的文件、编辑的文本或资源的位置。通过使用 Uri,可以在编辑器中准确地标识和操作这些资源。
总之,Uri 在 Monaco 中起着表示和操作文件系统中资源的作用,它提供了一种方便的方式来处理文件路径和标识资源的唯一性。

在使用 createModel() 方法时,如果没有传递 language 参数,monaco 是可以根据 Uri 自动推断出语言的,我们先看看这两个参数都不传的效果:在这里插入图片描述

就是黑咕隆咚的一团
那么我们设置一个 Uri 试一试嘞
在这里插入图片描述
根据官网给的规则,设计一个合理的 Uri。另外,需要使用 monaco.Uri.parse() 转义哦
path 部分需要增加后缀,Monaco 就是根据这个后缀判断代码的语言模型的。

const uri = monaco.Uri.parse('foo://example.com:8042/over/there.js?name=ferret#nose')
debugger
const model = monaco.editor.createModel(value,'', uri)
editor.setModel(model)

在代码里面呢,我埋了一个断点,在代码执行的过程中,uri 会被解析成下面这个样子:
在这里插入图片描述
然后再往后进行,就会通过 uri 解析出 language
在这里插入图片描述

然后我们把后缀改成 ts 试一试 不仅颜色渲染出来了,还把错误全部提示出来了呢!
在这里插入图片描述

三、缩略图 miniMap 配置

miniMap 是用来快速预览代码结构的工具,通常位于编辑器的右上角。可以看到这个内容是一个 canvas

在这里插入图片描述
要配置 miniMap 的展示,是在monaco.editor.create(容器, 配置项) 的配置项中配置的

IEditorMinimapOptions miniMap 的配置接口的定义如下

export interface IEditorMinimapOptions {// 是否可用 默认为 trueenabled?: boolean;// 是否自动隐藏缩略图,默认为 false,如果设置为 true,则只有鼠标移动上去才会显示autohide?: boolean;// 控制显示的位置side?: 'right' | 'left';// 渲染的模式size?: 'proportional' | 'fill' | 'fit';// 展示滑块showSlider?: 'always' | 'mouseover';// 是否在缩略图上渲染文字,默认为 true;如果为 false,则只渲染色块,即文字会比较糊,看不清renderCharacters?: boolean;// 最大列数,控制宽度maxColumn?: number;// 字体相对大小 设置越大,字体越大,但是再大也不会到能看清的地步scale?: number;
}
  • size
    size = fill 或者size = fit 高度基本上占父级的100%,不会出现滚动条
    在这里插入图片描述
    size = proportional 竖直方向上,和源代码是平行的。
    在这里插入图片描述
    不过缩略图的很多效果其实很难总结,大家用到的时候多多尝试,找一个最顺眼的🌟 (真不是我偷懒) 下期见!

参考文章:
Monaco Editor教程(十四):monaco中的位置区间Range类型的详细解释
Monaco Editor教程(十五):createModel时使用Uri来自动匹配文件内容对应的源码模型。
Monaco Editor教程(十六):缩略图minimap的配置详解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从MLP到卷积

1.从MLP到卷积层 最近要做多通道的实验,所以重新将处理图像的基础模型回顾一下,什么是卷积?卷积本质是是一种特殊的全连接层。 1.1怎么w的权重从一个值变成了4维呢?可以这样理解,在此举一个例子: 其实本质可以看成&…

6.5 比赛设备独家揭秘 | 2024高通边缘智能创新应用大赛公开课

2024高通边缘智能创新应用大赛系列公开课热度不减,第三期即将火爆开启,广翼智联FV01边缘智能物联网开发板迎来赛程期间首次公开亮相! 在这期的直播中,广翼智联高级产品市场经理伍理化将亲自担任主讲,为大家一一揭晓这…

探索大模型技术及其前沿应用——TextIn文档解析技术

前言 中国图象图形大会(CCIG 2024)于近期在西安召开,此次大会将面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界同仁,搭建一个展示创新成果、展望未来发展,集高度、深度、广度三位…

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化:PM2.5、风速与高度分析 摘要 在现代气象学中,数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术,它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …

ChatTTS 如何安装可视化操作

可视化一键安装下载地址: 百度网盘 Download from GitHub 从 GitHub 下载代码。 git clone https://github.com/2noise/ChatTTS 下载地址 Install Dependencies 在开始之前,请确保已安装必要的软件包。如果您尚未安装它们,可以使用 pip …

Android百度人脸识别3.0配置

JDK 必须是16的版本 如果报错的错误是"opens java.io" org.gradle.jvmargs -Xmx2048M -Dkotlin.daemon.jvm.options\"-Xmx2048M" --add-exportsjava.base/sun.nio.chALL-UNNAMED --add-opensjava.base/java.langALL-UNNAMED --add-opensjava.base/java.…

智能售货机投资指南:从成本预算到市场策略的全方位解析

现代化智能设施的典范,智能售货机以其丰富的商品选项与无缝购物体验著称。然而,涉足此领域前,一番周密的投资考量不可或缺。 首要因素聚焦于售货机本身的购置费用,该费用弹性颇大,依据型号与功能差异而定。基础的小型…

Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

Linux 36.3 JetPack v6.0jetson-inference之语义分割 1. 源由2. segNet2.1 命令选项2.2 下载模型2.2.1 Cityscapes2.2.2 DeepScene2.2.3 MHP2.2.4 VOC2.2.5 SUN 2.3 操作示例2.3.1 单张照片2.3.2 多张照片2.3.3 视频 3. 代码3.1 Python3.2 C 4. 参考资料 1. 源由 分类和目标识…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候,我们需要自动打包,比如下班了,我要出一个包明天早上用。比如每天夜里12点,我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前,需要安装Java 。Java下载网站 ①下载…

揭秘大数据时代的数据库存储引擎:关系型、NoSQL与NewSQL如何选择?

文章目录 01 关系型数据库&NoSQL数据库&NewSQL数据库1. 关系型数据库2. NoSQL数据库3. NewSQL数据库 02 OLTP&OLAP&HTAP对比1. OLTP数据库2. OLAP数据库3. HTAP数据库 03 总结 在大数据和AI时代,数据库成为各类应用不可或缺的重要组成部分。而数据库…

2024年生物、农业与工程技术国际会议(BAET 2024)

2024年生物、农业与工程技术国际会议(BAET 2024) 2024 International Conference on Biology, Agriculture, and Engineering Technology 目录 【会议简介】2024年生物、农业与工程技术国际会议将于昆明盛大召开。此次会议汇聚了全球生物、农业与工程技…

网络编程(一)

网络编程(一) 网络基础网络体系结构**OSI的7层模型**:(理想化)**每层的功能** **TCP/IP的4层模型**:(在使用)常见的协议IP地址IPV4分类A类(第1位固定为0)B类&…

大文件续传,文件分享

1. 最近各种文件分享平台,很多都要注册, 对于很多需要临时分享文件下的场景,不想被这种东西烦恼,于是借鉴网上代码,进行了一些修改, 写了一个文件分享项目, 该项目只是自用,数据库都…

Science Robotics 可实现中心聚焦与多光谱成像的鸟类视觉启发钙钛矿人工视觉系统

一、前沿速览 来自韩国基础科学研究所(IBS)纳米粒子研究中心的研究人员及其合作者提出了一个利用鸟类视觉注视点和多光谱成像的人工视觉系统。近日在Science Robotics 上发表的文章引入了人工中央凹和垂直堆叠的钙钛矿光电探测器阵列,其设计…

NLP基础——序列模型(动手学深度学习)

序列模型 定义 序列模型是自然语言处理(NLP)和机器学习领域中一类重要的模型,它们特别适合处理具有时间顺序或序列结构的数据,例如文本、语音信号或时间序列数据。 举个例子:一部电影的评分在不同时间段的评分可能是…

智慧校园的发展趋势

在21世纪的数字化浪潮中,教育领域正经历着前所未有的变革。智慧校园,作为这场变革的前沿阵地,其发展趋势正引领着未来教育的新模式。我们将探讨智慧校园在融合技术、全场景应用、生态建设、数据安全以及可持续发展等方面的崭新动向&#xff0…

特征交叉系列:FFM场感知因子分解机原理与实践

从FM到FFM知识准备 在上一节中[特征交叉系列:完全理解FM因子分解机原理和代码实战]介绍了FM算法,FM因子分解机通过在逻辑回归基础上增加所有特征的二阶交互项实现特征的交叉,但是随着特征数的增多二阶交互的数量呈平方级别增长,F…

ArcGIS模型构建器实例:一键拓扑(附模型下载)

ArcGIS模型构建器特别适用于流程固定的工作流。 要素的拓扑处理就非常符合这一特点,一个要素的拓扑过程基本固定,但是每次拓扑都要来一轮操作就很烦,这正是模型构建器的用武之地。 下面以ArcGIS Pro为例介绍在模型构建器中的整个拓扑流程&a…

CPU 使用率过高问题排查

文章目录 CPU 使用率过高问题排查1. CPU使用率过高常见问题2. 压力测试2.1 stress安装参数说明测试示例 2.2 stress-ng安装参数说明测试示例 3. 问题排查3.1 使用 top 命令3.2 使用 ps 命令3.3 使用 perf top3.4 vmstat 命令常用信息内存信息磁盘信息 CPU 使用率过高问题排查 …

第一篇 逻辑门(与门、或门、非门、异或门)

一、实验目的 了解DE1-SOC开发板一些外设。 掌握常用组合逻辑门电路的基本原理。 学习Verilog HDL的基本语法。 学习使用ModelSim工具对设计的电路进行仿真,包括编写Testbench仿真代码,以及ModelSim工具的使用。 熟悉使用Quartus软件从创建Quartus工…