Monaco Editor系列(四)版本对比、自定义右键菜单、光标滚动

前言:亲爱的小伙伴们,又见面了!上一篇文章我们一起学习了 Monaco Editor 的几个功能,设置内容、多文件编辑、自定义主题;下面让我们继续Monaco Editor的旅程吧!

前情提要:
上一篇文章我介绍了Monaco Editor的几个功能,涉及到的方法分别是:
🧜🏼‍♀️ 获取 model editor.getModel()
🧜🏼‍♀️ 获取内容 editor.getValue()
🧜🏼‍♀️ 设置内容editor.setValue()
🧜🏼‍♀️ 监听内容变化 editor.onDidChangeContent()
🧜🏼‍♀️ 创建 model monaco.editor.createModel(内容, 语言)
🧜🏼‍♀️ 设置 model editor.setModel(newModel)
🧜🏼‍♀️ 获取 model 的状态 editor.saveViewState()
🧜🏼‍♀️ 设置 model 的状态 editor.restoreViewState(state)
🧜🏼‍♀️ 编辑器获取焦点 editor.focus()
🧜🏼‍♀️ 设置 model 的语言 editor.setModelLanguage(model, language)
🧜🏼‍♀️ 设置主题 monaco.editor.setTheme(themeName)
🧜🏼‍♀️ 定义主题 monaco.editor.defineTheme(主题名, 配置对象)

一、版本对比

playground 路由页面这几个都是版本对比的示例
在这里插入图片描述

在我的日常工作中,提交的代码需要提交 code review,然后让别的同事进行检查,不知道大家和我的工作流程一不一样呢?此时就用到 git 中的代码对比的功能,它会清晰的标出来新增代码、删除代码、修改代码。本地项目中给的也有示例哦
在这里插入图片描述
真清晰哇!咱们可以直接从右侧的代码区域看到执行的代码
从上面的代码中我们可以看到,创建版本对比编辑器需要三个步骤
① 创建旧代码的 model 和新代码的 model
② 创建 diffEditor
③ 给 diffEditor 配置两个 model

createDiffEditor() 方法的文档地址:
${本地项目根路径}/docs.html#functions/editor.createDiffEditor.html
参数一:编辑器的容器
参数二:编辑器配置对象 IStandaloneDiffEditorConstructionOptions
参数三:重写编辑器行为的服务 IEditorOverrideServices 一般来说也用不到
咱们的编辑器长啥样,关键在于配置对象 IStandaloneDiffEditorConstructionOptions。定义在 node_modules/monaco-editor-core/monaco.d.ts 文件里,然后它继承了好多层🤣
救命啊家人们,怀疑人生了。。我发现源码里注释有一个错误。。
在这里插入图片描述
这个属性,注释的最后一句,默认为true。但是经过我实践,其实默认值是 false。。
这个属性是用来检测高对比度主题的,如果 theme 设置成高对比度,autoDetectHighContrast 设置成 true 的话,就会修正高对比度,还是应用这种白底红红绿绿的形式
在这里插入图片描述
如果设置成 false ,就会使用高对比度的样式,结果就是下面这样,不太好看
在这里插入图片描述
如果不设置的话,也是这样
在这里插入图片描述
我查阅了 IStandaloneDiffEditorConstructionOptions 接口里面的属性,写了下面的案例代码,其中有一些设置并没有效果🌚。总之大家参考一下下面的注释出来的含义吧。另外,除了下面注释出来的内容,其他的在创建 普通的编辑器的时候设置的属性,也是可以作为属性传给差异对比编辑器的

require(['vs/editor/editor.main'], function () {
    var originalModel = monaco.editor.createModel(
        "This line is removed on the right.\njust some text\nabcd\nefgh\nSome more text",
        "text/plain"
    );
    var modifiedModel = monaco.editor.createModel(
        "just some text\nabcz\nzzzzefgh\nSome more text.\nThis line is removed on the left.",
        "text/plain"
    );

    var diffEditor = monaco.editor.createDiffEditor(
        document.getElementById("container"),
        {
            theme: 'hc-light',
            // 自定修正高对比度
            autoDetectHighContrast: true,
            // 编辑器为只读形式
            readOnly: false,
            // 是否允许拖动中间的中轴线改变左右编辑区域的大小
            enableSplitViewResizing: true,
            // 左侧默认占整体宽度的比例 数字 0-1 之间 默认是 0.5
            splitViewDefaultRatio: 0.7,
            // 是否并排渲染;如果是false,则会嵌套渲染
            renderSideBySide: true,
            // 如果 renderSideBySide 设置为true,宽度小于renderSideBySideInlineBreakpoint
            // 的时候显示为内嵌模式 但是我测试的并不好使。。。
            useInlineViewWhenSpaceIsLimited: true,
            renderSideBySideInlineBreakpoint: 1000,
            // 计算差异的周期 ms
            maxComputationTime: 5000,
            // 最大文件 MB
            maxFileSize: 50,
            // 忽略空格差异
            ignoreTrimWhitespace: true,
            // 新增和删除的行是否显示加号和减号
            renderIndicators: false,
            // 在每一行的左侧显示回滚的小图标,没看到哇?
            renderMarginRevertIcon: true,
            // 展示右上角的预览标尺
            renderOverviewRuler: true,
            // 原始文本是否可编辑,默认为false
            originalEditable: true,
            diffCodeLens: true,
        }
    );
    diffEditor.setModel({
        original: originalModel,
        modified: modifiedModel,
    });
});

二、自定义命令和菜单

在 Monaco 中,已经有很多现成的很好用的快捷键,例如 crtl+f 搜索代码。Monaco 其实还提供了接口,允许我们自定义命令。另外右键菜单里面的命令,和快捷键往往都是一对一的关系
在这里插入图片描述
右键出来的菜单项的专业术语叫做 Action
所以我们这一章就来学一学怎么自定义命令以及 Action 菜单项吧!
我们来实现一个简单的命令,alert 弹出一句话

(一)自定义命令

添加自定义命令的方法是 editor.addCommand()
为了方便大家点击链接跳转,以后我就直接贴官网的文档链接啦!
这个方法需要接受一个参数,类型为 ICommandDescriptor。接口也很简单,包含两个属性:
🥗 id 按键的值
🥗 run 事件处理函数
按键的值的定义在枚举值 KeyCode 上定义,在 node_modules/monaco-editor-core/monaco.d.ts 文件里
在这里插入图片描述
以 shift 为例子,我们在传递 id 的时候,可以直接传数字 4,但是这就要求我们每次都查阅 KeyCode 的定义,看一下按键对应的数字;更方便的是直接使用 monaco.KeyCode.Shift。但是快捷键可能发生冲突,所以在这里可以使用组合按键,monaco.KeyMod.chord 方法
monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK) 表示组合按键 ctrl + k。需要注意的是,monaco.KeyMod.chord()传进来的第一个按键,必须是 KeyMod 上定义的几个静态常量

export class KeyMod {
	static readonly CtrlCmd: number;
	static readonly Shift: number;
	static readonly Alt: number;
	static readonly WinCtrl: number;
	static chord(firstPart: number, secondPart: number): number;
}

第二个按键是枚举 KeyCode 中的按键

editor.addCommand(
  monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK),
  function () {
      alert(`风遁:螺旋手里剑`);
  }
);

按下 ctrl + k
在这里插入图片描述

(二)自定义菜单项 Action

playground 路由页面的下面两个选项是官方给出的增加命令和菜单项的示例
在这里插入图片描述

添加菜单项使用方法 editor.addAction
有两个方法可以添加 Action,第一个是 monaco.editor.addEditorAction(),给所有的编辑器实例添加 Action;另一个是 editor.addAction()editor实例调用 addAction(),只给自己添加就完了
editor.addAction() 接收一个 IActionDescriptor类型 的对象作为参数
具体的含义我都写在代码的注释里啦
我们来创建一个 Action 让小迪实现艺术 💥

editor.addAction({
    // 不能重复
    id: 'bomb',

    // 展示在菜单中的文本
    label: 'Didara Bomb',

    // 快捷键
    keybindings: [
        monaco.KeyMod.CtrlCmd | monaco.KeyCode.F10,
        // 组合按键 需要 ctrl + d + m
        monaco.KeyMod.chord(
            monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyD,
            monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyM
        )
    ],

   	// 前提条件 String
   	// 暂时只找到这一个例子,判断编辑器语言是不是 javascript
    precondition: "editorLangId == 'javascript'",

    // 绑定快捷键的规则 
    keybindingContext: "editorLangId == 'javascript'",

    // 指定操作应显示在上下文菜单的哪个组中 navigation表示默认组
    contextMenuGroupId: 'navigation',

    // 操作在菜单中的显示顺序
    contextMenuOrder: 1.5,

    // 操作执行的方法
    // @param editor ed.getPosition() 获取焦点坐标
     run: function (ed) {
         alert("艺术就是💣💣💣💣💥💥💥💥" + ed.getPosition());
     }
});

然后我们右键查看已经有了新增加的菜单
在这里插入图片描述
点击就让小迪绽放
在这里插入图片描述
另外,上面我们还绑定了两种快捷键,一种是 ctrl + f10,一种是 ctrl + d + m
📢📢📢 焦点需要在编辑器内按快捷键才有用哦

三、光标滚动

在 gitlab 中,点击某一行代码的行号的时候,会自动生成一个锚点,并且url中会显示锚点名称。通过这个链接分享出去,别人点击链接进来的时候,代码就会自动滚动到这个锚点处
在这里插入图片描述
这一章我们就来实现一下代码滚动的功能
如果要获取光标的位置,可以使用:
model.getPositionAt()
咱们本地项目的 playground 路由里面,有这个滚动功能的示例,并且里面也列举出了所有的关于滚动的方法
在这里插入图片描述

editor.revealLine  // 编辑器滚动到某一行,只保证出现该行
editor.revealLineInCenter // 编辑器滚动到lineNumber行,并将改行滑动到编辑器垂直中心
editor.revealLines // 滚动到多行
editor.revealLinesInCenter // 滚动到多行中心
editor.revealLinesInCenterIfOutsideViewport // 滚动到多行中心 如果位于视口之外
editor.revealPosition // 滚动到固定的行,列
editor.revealPositionInCenter // 滚动到固定的行,列 中心
editor.revealPositionInCenterIfOutsideViewport // 滚动到固定的行,列 中心 如果位于视口之外
editor.revealRange // 滚动到一定范围,开始行,列,结束行列
editor.revealRangeInCenter  // 滚动到一定范围,开始行,列,结束行列 中心点
editor.revealRangeInCenterIfOutsideViewport // 滚动到一定范围,开始行,列,结束行列 中心点 如果位于视口之外

使用的时候看哪一个比较适合酌情选择就好啦!

// 滚动到多少行多少列
// 第一个参数的类型是 IPosition
// IPosition {
	// readonly lineNumber: number;
	// readonly column: number;
// }
// 第二个参数是滚动的方式 0 表示 smooth 1 表示 Immediate
editor.revealPositionInCenter({ lineNumber: 44, column: 66 }, 0);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Facebook隐私保护:用户数据安全的关键挑战

在数字化时代,数据已成为最宝贵的资源之一。社交媒体平台如Facebook为用户提供了便捷的交流和信息分享工具,但同时也面临着如何保护用户数据安全和隐私的挑战。本文将深入探讨Facebook在数据安全方面面临的关键挑战,以及其如何应对这些挑战&a…

部署Zabbix5.0

一.部署zabbix客户端 端口号10050 zabbix 5.0 版本采用 golang 语言开发的新版本客户端 agent2 。 zabbix 服务端 zabbix_server 默认使用 10051 端口,客户端 zabbix_agent2 默认使用 10050 端口。 1.1.关闭防火墙和selinux安全模块 systemctl disable --now fir…

python中的列表、元组、字典、集合(集合篇)

数据类型定义符号访问元素是否可变是否重复是否有序列表 [ ]索引可变可重复有序元组()索引不可变可重复有序字典{key:value}键可变可重复无序集合{ }可变不可重复无序 基本概念 python语言中的集合是无序的、可变的容器类对象,所…

【Web】HTML基础

专栏文章索引:Web 有问题可私聊:QQ:3375119339 目录 一、HTML介绍 1.HTML 定义 2.标签语法 3.HTML 基本骨架 4.标签的关系 5.HTML 注释 二、标签 1.排版标签 1.1 标题标签 1.2 段落标签 1.3 换行标签 1.4 水平线标签 1.5 文本格…

Python学习(四)

文件操作 想想我们平常对文件的基本操作,大概可以分为三个步骤(简称文件操作三步走): ① 打开文件 ② 读写文件 ③ 关闭文件 注意:可以只打开和关闭文件,不进行任何读写 在Python,使用open函数,可以打开一个已经存在的文件&…

4.16作业

1.总结keil5下载代码和编译代码需要注意的事项 一、在编译代码时需要先点击魔术棒点击 修改flash Downlond 和pack 二、可以通过F12转跳到对应的函数中,查看函数的原型 三、注释出现乱码通过 Edit中的中的来修改 四、要先bulid在load 2.总结STM32Cubemx的使用方…

【UE 材质】表面湿润效果

效果 步骤 1. 创建一个材质函数,这里命名为“MF_Weather_Wetness”,打开材质函数添加如下节点 其中输入的默认值分别为: 其中,“Desaturation”节点用于控制饱和度,我们通过给“Fraction”引脚输入一个负值来增加饱和…

【AR开发示例】实现AR管线巡检

写在前面的话 这是一篇旧文档,代码仓库见 https://gitee.com/tanyunxiu/AR-pipe 本文档是基于超图移动端SDK的AR模块开发的示例,仅供参考,SDK在持续迭代中,相关描述可能有变化。 示例介绍 这是一个使用AR查看墙内管线的基础示…

授权协议OAuth 2.0之除了授权码许可还有什么授权流程?

写在前面 源码 。 本文看下OAuth2.0的另外3中授权流程,资源拥有者凭据许可,客户端许可,隐式许可。分别看下具体的使用流程以及该使用场景。 1:资源拥有者凭据许可 资源拥有者凭据许可,这里资源拥有者的凭据是什么呢&…

【C++核心】面向对象的三大特性

面向对象的三大特性 一、封装性1. 封装性的意义1.1 表现事物1.2 权限控制1.3 成员属性设置为私有 2. 封装性的衍生知识2.1 struct和class区别2.2 友元2.2.1 全局函数做友元2.2.2 类做友元2.2.3 成员函数做友元 二、继承性1. 继承的语法2. 继承方式3. 继承中的对象模型3.1 说明3…

17 如何查看Hadoop中wordCount源码

1.进入官网下载源码并进行解压操作: 我们使用的是hadoop-3.1.4版本,直接进入官网进行下载:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.4/ 下载得到的文件如下图所示: 解压后的文件: 2.使用Idea打开此项…

vue3.0项目生成标签条形码(插件:jsbarcode)并打印(插件:Print.js)支持pda扫码枪扫描

文章目录 功能场景生成条形码设置打印功能踩坑 功能场景 功能场景:供应链中对一些货品根据赋码规则进行赋码,赋码之后生成根据赋码结果生成条形码,执行打印功能,贴在货品之上,打印之后可以用pda的手枪进行扫描&#x…

(亲测有效)win7安装nodejs高版本(18.8.0)

现在学习vue3,vite,使用pnpm创建项目都需要高版本的nodejs了,win7最高只能安装13版本,好多已经不支持了。当然此篇只是以安装18.8.0为例,可以替换成更高的18或者20版本,只是太高的话可能出现冲突,够用就好。希望对各位…

如何修改WordPress数据库表前缀以提高安全性

WordPress作为世界上最受欢迎的内容管理系统之一,吸引了数以百万计的用户。然而,正因为其广泛的使用,WordPress网站也成为了黑客攻击的目标之一。其中一个最常见的安全漏洞是使用默认的数据库表前缀wp_,使得黑客能够更轻松地进行大…

分布式调度器

xxl-job介绍 xxl-job 是一个轻量级分布式任务调度框架,支持动态添加、修改、删除定时任务,支持海量任务分片执行,支持任务执行日志在线查看和分页查询,同时支持任务失败告警和重试机制,支持分布式部署和高可用。xxl-j…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技(AWS)最近官方发布的GenAI应用开发最佳学习路线,不仅内容非常全面更主要的是全部免费!大家动动小手就能成为GenAI开发大🐮! 1️⃣这个GenAI开发学习路线包括什么&…

跟着Datawhale重学数据结构与算法(2)———数组知识

数组定义 数组是一种数据结构,用于存储一系列相同类型的元素。在大多数编程语言中,数组中的每个元素都有一个索引,通常从0开始。 数组的特点 固定大小:一旦定义,数组的大小通常是固定的,不能动态增减。相…

虚拟机数据恢复—KVM虚拟机磁盘文件数据恢复案例

虚拟化数据恢复环境&故障: KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux2.6.20版本之后集成在Linux的各个主要发行版本中。KVM使用Linux自身的调度器进行管理。 本案例中的服务器操作系统为Linux&#x…

官宣|Apache Paimon 毕业成为顶级项目,数据湖步入实时新篇章!

北京时间 2024 年 4 月 16日,开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apache Paimon 毕业成为 Apache 顶级项目(TLP, Top Level Project)。经过社区的共同努力和持续创新,Apache Paimon 在构建实时数据…

【剪映专业版】10时间线工具:主轨磁吸、自动吸附、联动、预览轴、全局缩放预览

视频课程:B站有知公开课【剪映电脑版教程】 主轨:有封面标志的轨道才是主轨。 主轨磁吸:开启后,在主轨上移动素材,自动向前磁吸,在其他轨道上移动无此效果;关闭后,不自动向前磁吸&…