背景

有时候我们在使用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行添加拿我格子衫来12121`,},},],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 editorrequire(['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行添加拿我格子衫来3232323`,},},],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是占用编辑器虚拟行,却不是文件内容。

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

  1. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  2. Monaco Editor教程(十):如何系统学习monaco editor

    背景 monaco editor教程已经发布了九篇了,根据文章的数据来看,阅读量还不错,这说明学习monaco 的开发者还是不少的,之前讲解的知识点都是比较零碎的,你根据之前的几篇文章,也能做出一个简 ...

  3. Android基础入门教程——2.3.1 TextView(文本框)详解

    Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解And ...

  4. Spring Boot 2.0 的配置详解(图文教程)

    本文来自作者 泥瓦匠 @ bysocket.com 在 GitChat 上分享 「Spring Boot 2.0 的配置详解(图文教程)」 编辑 | 哈比 Spring Boot 配置,包括自动配置和 ...

  5. ajax配合ssm框架,SSM框架前后端信息交互实现流程详解

    SSM框架前后端信息交互实现流程详解 比如该处代码,显示了问题的标题信息,并将其作为超链接,点击该链接时进入后端Controller类的方法,并向其发送问题编号question_id 3.ajax请求 ...

  6. 网摘精灵教程:网摘精灵延时功能详解

    网摘精灵教程:网摘精灵延时功能详解 网摘精灵软件里面有个功能设置项是"延时",这个延时如何设置呢? 简单地说,就是发送数据一次,最多花费多久时间.这个是以秒为单位的,设置值应该是数 ...

  7. vagrant系列教程(二):vagrant的配置文件vagrantfile详解(转)

    原文:http://blog.csdn.net/hel12he/article/details/51089774 上一篇文章完整的讲叙了如何安装一个vagrant的环境.这里主要说一说vagrant的 ...

  8. python 字符串替换_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  9. 判断字符串格式_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  10. windows上安装python3教程以及环境变量配置详解

    这篇文章主要介绍了windows上安装python3教程以及环境变量配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在浏览器搜索pyth ...

最新文章

  1. Hive SQL 监控系统 - Hive Falcon
  2. 太形象!打工人入职前后的心理变化 | 每日趣闻
  3. webpack4+react多页面架构
  4. 赞扬别人团建评论_赞扬精心设计:基于属性的测试如何帮助我成为更好的开发人员...
  5. devops 开源_没有开源就无法拥有DevOps
  6. 面试题50. 第一个只出现一次的字符
  7. linux 混杂模式 收包,Linux下使用混杂模式抓包(2)
  8. 第二阶段团队冲刺第九天
  9. 基于应用程序级的Apache认证配置(普通认证篇)
  10. 第五十篇、OC中常用的第三插件
  11. python停止程序_如何停止python程序
  12. SVL-Simulation自动驾驶仿真器
  13. 跨境电商收款账号一样会关联吗?谁能告诉?
  14. java path.resolve_Java Path.resolve方法代碼示例
  15. 西安交通大学本科毕业论文答辩和论文选题PPT模板
  16. 单片机外围电路设计之六:场效应管
  17. delphi excel
  18. 解决 win10 win7 下桌面弹出淘宝、天猫广告窗
  19. 爬取豆瓣网app软件数据
  20. -XX:CMSInitiatingOccupancyFraction=92 Java8

热门文章

  1. 从学生到职场,这位百万爬虫博主都经历了什么?
  2. 【Python 基础篇】Python代码 之 三目表达式总结
  3. Python练习题 013:求解a+aa+aaa……
  4. 显示创建Mat对象的七种方式
  5. [国家集训队]矩阵乘法 整体二分
  6. 学习计算机英语的重要性
  7. 资产配置(理论+模型),科学找圣杯
  8. 加拿大大学商用计算机专业,加拿大大学计算机专业排名详情
  9. 百度地图SDK for Android【Demo调起百度地图客户端导航功能】
  10. ThinkPHP一键检测ThinkPHP漏洞,漏洞检测工具