Monaco Editor教程(十七):代码信息指示器CodeLens配置详解

news2024/12/24 21:12:56

背景

有时候我们在使用VS Code编辑一个文件时 会看到这样的效果
在这里插入图片描述
在上述的图片中,1720行和1721行之间,有一行不属于该文件本身内容的注释。这一效果能够方便开发者快速地理解代码,看到代码的提交人,时间,可能还会有备注。在复制内容时,这部分是不会被复制的。 这一交互的实现,是借助了monaco的代码信息指示器 CodeLens ,而其中的Git信息则是借助了VS code 插件 GitLens
本篇文章就来解析一下monaco中CodeLens的使用,帮助大家实现一个更加优秀的WEB IDE。

代码信息指示器CodeLens

CodeLens的含义是代码信息指示器,是一种能够帮助开发者理解代码,并不存在于文章内容的辅助信息。不同于直接写到文件的代码注释(和之前讲解的Marker来帮助开发者理解代码含义),CodeLens它是不存在于文件内容中的,但它直接显示在编辑器的特定行内。并且在复制文件内容是,它不会被复制。这就是它区别于其他辅助信息,备注信息的特性。它的内容是和Maker一样都是来自于文件外,人为设置或利用插件获取。

CodeLens通常是以一行信息来表现。但它并不是真正的一行。同样它是作用于语言模型的,而不是直接在editor对象上直接添加。
下面就来从它是使用方面和API来对其详细地解析。

如何使用CodeLens

要使用codeLens,首先要使用 monaco.languages.registerCodeLensProvider(languageSelector: LanguageSelector, provider: CodeLensProvider): IDisposable 方法。

该方法是在monaco.languages对象下, 需要输如两个参数,一个是语言选择器, 可以是语言字符串如javascript,也可以是语言字符串 数组如['javascript', 'java','python']
第二参数是配置的CodeLens,叫做他的类型是 CodeLensProvider
CodeLensProvider下有一个属性和二个方法。分别是
onDidChange 属性 codelens 事件改变
provideCodeLenses 函数 传入语言模型与token, 返回 CodeLensList 用于定义 codelens
resolveCodeLens 函数 codeLens 暂时不清楚啊,文档上也没写。

CodeLensList 对象中,又有一个下级对象lenseslenses 下定义是这样

这里给出一个结构图

registerColorProvider方法中 需要定义 provideCodeLenses 方法,provideCodeLenses 方法 需要用户返回 CodeLensList对象,
CodeLensList对象的内部是 lenseslenses 内部包含rangecommand。 看起来很复杂,那让我们直接看一个例子吧。

var editor = monaco.editor.create(document.getElementById('container'), {
  value: '{\n\t"dependencies": {\n\t\t\n\t}\n}\n',
  language: 'json',
})

// 声明一个用于codeLens的 comand,点击codelens 弹窗提示。
var commandId = editor.addCommand(
  0,
  function() {
    // services available in `ctx`
    alert('It is Fizz Code')
  },
  '',
)


monaco.languages.registerCodeLensProvider('json', {
  provideCodeLenses: function(model, token) {
    return {
      lenses: [
        {
          range: {
            startLineNumber: 3,
            startColumn: 111,
            endLineNumber: 8,
            endColumn: 10,
          },
          id: 'Fizz CodeLens',
          command: {
            id: commandId,
            title: `在第3行添加拿我格子衫来
            12
            121`,
          },
        },
      ],
      dispose: () => {},
    }
  },
  resolveCodeLens: function(model, codeLens, token) {
    return codeLens
  },
})

从上面可以看到,在使用时,注意在registerCodeLensProvider方法内定义provideCodeLenses 方法,返回一个lenses 数组。

在每一个lenses中, 需要定义range(必填),可以定义id, command(非必填)。
看一下具体效果

具体效果

在这里插入图片描述

经过调试发现,在定义range时,能够影响到codelens的 只有startLineNumber 属性。 其他的属性都影响不到codelens的位置。
出现codelens 的哪一行,无法聚焦,只可以点击codelens中的文字内容。codelens的内容无法多行。

完整代码

完整html代码

<!DOCTYPE html>
<html>

<head>
  <title>Hello World Monaco Editor</title>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>

<body>
  <h2>Hello World Monaco Editor</h2>
  <button onclick="setValue()">设置Python内容</button>
  <div id="container" style="width: 800px; height: 600px; border: 1px solid grey"></div>

  <script src="./monaco-editor/package/min/vs/loader.js"></script>
  <script src="./const.js"></script>
  <script>
    require.config({ paths: { vs: './monaco-editor/package/min/vs' } });
    let editor

    require(['vs/editor/editor.main'], function () {
      editor = monaco.editor.create(document.getElementById('container'), {
        value: oldVersion,
        language: 'javascript'
      });


      var commandId = editor.addCommand(
        0,
        function () {

          alert('It is Fizz Code')
        },
        '',
      )

      monaco.languages.registerCodeLensProvider(['javascript', 'python'], {
        provideCodeLenses: function (model, token) {
          return {
            lenses: [
              {
                range: {
                  startLineNumber: 3,
                  startColumn: 111,
                  endLineNumber: 8,
                  endColumn: 13,
                },
                id: 'Fizz CodeLens',
                command: {
                  id: commandId,
                  title: `在第3行添加拿我格子衫来
                  323
                  2323`,
                },
              },
            ],
            dispose: () => { },
          }
        },
        resolveCodeLens: function (model, codeLens, token) {
          return codeLens
        },
      })

    });

    function setValue() {

      // 第二种重新设置值
      var currentModel = editor.getModel();
      const model = monaco.editor.createModel(`
// 重新设置值
x = y = z = 1
print(x) #1
`, 'python');

      editor.setModel(model);

      model.onDidChangeContent(e => {
        console.log(e)
      });

      if (currentModel) {
        currentModel.dispose();
      }

    }
  </script>
</body>

</html>

总结

今天我们又学到了一种在编辑器中 添加辅助备注信息的方式。不用于之前介绍的Mark,codelens是占用编辑器虚拟行,却不是文件内容。

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

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

相关文章

C语言:一维数组的创建、初始化

一、一维数组的创建 数组的定义&#xff1a;在C语言中有各种数据类型&#xff0c;而每一种数据类型都有相对应的数据元素&#xff0c;这些元素可以组成一个团体&#xff0c;一个集合&#xff0c;从而有了数组概念。 数组也有三要素&#xff1a;数组元素类型&#xff0c; …

双链笔记Logseq的安装指南

便民服务还是挺方便的&#xff0c;不用出小区就可以做了 本文完成于 10 月初&#xff0c;撰写时 Logseq 的版本为 v0.8.8&#xff0c;发布时的最新版本是 v0.8.11 什么是 Logseq &#xff1f; Logseq 是一个本地优先的非线性大纲笔记本&#xff0c;用于组织和共享您的个人知识库…

Win11电脑如何设置自动开机(Windows 11 2022H2)

Win11电脑如何设置自动开机 ​ 文章目录1、最先右键选择“此电脑”&#xff0c;点一下“管理”。2、随后寻找系统工具里的“任务方案程序”。3、再点一下右边的“创建基本任务”。4、名字中输入“自动开机”。5、随后选择自动开机的次数。6、然后设置我们应该自动开机的实际时间…

并发编程之Executor线程池原理与源码解读

线程 线程是调度CPU资源的最小单位&#xff0c;线程模型分为KLT模型与ULT模型&#xff0c;JVM使用的KLT模 型&#xff0c;Java线程与OS线程保持1:1的映射关系&#xff0c;也就是说有一个java线程也会在操作系统里有一个对应的线程。Java线程有多种生命状态 NEW,新建 RUNNABLE,运…

分布式架构演进过程

分布式的前提&#xff0c;我们得有多台服务器&#xff0c;那么我们需要知道世界上第一台计算机的由来&#xff0c;而第一台计算机的参考模型就是冯诺依曼模型&#xff0c;为此奠定了所有的分布式都在围绕着这个模型里面的某一块或者相互之间模块进行打交道。 搞分布式又有什么意…

【计算机毕业设计】7.健身俱乐部会籍管理系统+vue

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的…

关于clickhouse单节点部署

因为公司网络问题&#xff0c;下载clickhouse无法使用命令下载&#xff0c;所以用压缩包进行下载安装。 首先在其官网下载下载安装包 https://packages.clickhouse.com/tgz/stable/ 一共要下载四个包 clickhouse-client clickhouse-common-static clickhouse-common-static-d…

miRNA 在基因调控中的作用

MicroRNA (miRNA) 是什么&#xff1f;“micro”“mi”是微小的意思&#xff0c;顾名思义&#xff0c;miRNA 就是小的非编码 RNA&#xff0c;长度约 23 个核苷酸 (nt)&#xff0c;它在转录后的基因调控中发挥关键作用&#xff0c;包括疾病的发生、细胞分化与组织发育&#xff0c…

山东大学线性代数-1-矩阵-2

目录 1.9 初等矩阵 1.9.1 初等矩阵的定义 1.9.2 初等矩阵的性质 1.9.3 初等矩阵与初等变换的关系 1.9.4 满秩矩阵的四种等价表述 1.10 逆矩阵的定义及可逆条件 1.10.1 逆矩阵的定义 1.10.2 矩阵可逆的条件 1.10.3 二阶可逆矩阵的逆矩阵求法 1.11 逆矩阵的求法&#x…

Apollo 应用与源码分析:Apollo工程概述与AUTOSAR架构

目录 Apollo 工程概述 目录结构 软件架构 硬件架构 AUTOSAR架构 Apollo 概述 目录结构 |-cyber 消息中间件&#xff0c;替换ros作为消息层 |-docker 容器相关 |-docs 文档相关 |-modules 自动驾驶模块&#xff0c;主要的定位&#xff0c;预测&#xff0c;感知&#xf…

【Java进阶篇】第四章 异常处理

文章目录1、异常2、类Throwable3、运行时异常和编译时异常4、异常的处理5、异常导致某些代码不能被执行6、try...catch总结7、异常对象的常用方法8、try...catch和finally9、final、finally和finalize的整理区分10、如何自定义异常11、异常在实际开发中的作用12、异常与方法覆盖…

带联网功能的RFID宿舍门禁(六)-两年后的再次总结

文章首发及后续更新&#xff1a;https://mwhls.top/4066.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 带联网功能的RFID宿舍门禁 两年后又来了次总结&#xff0c…

聚观早报|中国制造成世界杯交通主力;特斯拉拟召回32万辆车

今日要闻&#xff1a;中国制造成世界杯交通主力&#xff1b;特斯拉拟召回32万辆车&#xff1b;iPhone14pro发货或延期至2023年&#xff1b;Tik Tok逆势宣布招聘&#xff1b;世界杯部署2.2万电子眼中国制造成世界杯交通主力 据消息&#xff0c;来自中国的新能源客车成了服务本届…

美国、欧洲、中国关于工业互联网的比较分析

工业革命的发展历史 1.0•机械化•大规模 2.0•电气化•自动化 3.0•信息化•产品标准 4.0•网络化•定制 3.0相当于肯德基麦当劳门店全部机械化&#xff0c;全程过程控制&#xff0c;任何一批不合格的产品&#xff0c;都可以追溯到上游任何一个环节 4.0全部设备通过中央控…

【C++笔试强训】第二十九天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

【linux】coredump问题排查

序言 记录coredump问题的一些定位技巧 1. coredump简介 coredump称为核心转储&#xff0c;就是在进程异常时的一个快照&#xff0c;保存了异常时的内存、寄存器、堆栈等数据当进程接收到某些 信号 而导致异常退出时&#xff0c;就会生成 coredump 文件core文件是ELF文件格式…

docker-compose 安装 Prometheus + Grafana 配置监控页面

安装 Prometheus Grafana docker 编排 prometheus:image: prom/prometheus:v2.40.1container_name: prometheusports:- "9090:9090"volumes:- /docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.ymlnetwork_mode: "host"grafana:image: gra…

【Linux】基础:进程控制

【Linux】基础&#xff1a;进程控制 摘要&#xff1a;本文主要介绍关于Linux进程控制内容&#xff0c;分为创建、退出、等待与替换四个板块&#xff0c;希望读者可以掌握每个板块的主要概念以及使用原因和调用方法。 文章目录【Linux】基础&#xff1a;进程控制一、进程创建1.1…

Nginx重定向

Rewrite简介 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安装PCRE库。Ngin…

(续)SSM整合之springmvc笔记(SpringMVC处理ajax请求)(P154-158)

目录 SpringMVC处理ajax请求 一 准备工作 1 新建spring_mvc_ajax com.atguigu 2 .导入依赖 3 添加web模块 4 .配置web.xml 5 . springmvc.xml 6 .创建控制层 7 . index.html 8 静态 9 部暑到tomcat上 10 启动tomcat 二 . 测试SpringMVC处理ajax 1 . ind…