VS Code 编辑器: Monaco Editor 介绍

2023-10-30

287459a39b2aa790d9d4646db31fc830.gif

Any application that can be written in JavaScript, will eventually be written in JavaScript. 任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写

e2e23282c9e2a7c2c8c8ac51d480a4fc.png

Monaco Editor 是一个浏览器端的代码编辑器库,同时它也是 VS Code 所使用的编辑器。Monaco Editor 可以看作是一个编辑器控件,只提供了基础的编辑器与语言相关的接口,可以被用于任何基于 Web 技术构建的项目中,而 VS Code 包含了文件管理、版本控制、插件等功能,是一款桌面软件。Monaco Editor 的 GitHub 仓库中不包含任何实际功能代码,因为其源代码与 VS Code 在同一个仓库,只是在版本发布时会构建出独立的编辑器代码。

考古


大部分人也许会认为 Monaco Editor 是从 VS Code 开源出来的库,也即先有 VS Code ,在此基础上抽离并开源了 Monaco Editor,而实际上正好相反,Monaco 的历史比 VS Code 更早一些。

917aa2ccad8f1c5e8fedd92110c2b745.png

Monaco Editor 由 Erich Gamma 在苏黎世带领的团队所开发的(Erich Gamma 就是《设计模式》一书的作者之一),关于 Monaco Editor 可以追溯到 2011 年,最早的 Monaco 是被广泛用于微软内部及外部一些 Web 产品的编辑器控件,在这篇2013年的博客 「A rich new JavaScript code editor spreading to several Microsoft web sites」 中介绍了一些在使用 Monaco 的微软产品,包括 Sky Drive、Azure、TypeScript 等站点都有 Monaco 的身影。而更为人所熟知的是早期的 Visual Studio Online 。VS Online 是 2013 年就已经上线运营的产品,界面与较老版本的 VS Code 非常类似,可以说 VS Code 是将 VS Online 搬到了桌面端,而新的 Github Codespaces 又将其搬到了 Web 端。你可以在这篇博客「A look at the new Visual Studio Online "Monaco" code editor」中了解 VS Online 所提供的能力。另外还有一系列的视频教程「Visual Studio Online "Monaco"」详细介绍相关的特性,这时已经可以看出一些设计被一直沿用至今(例如界面布局、版本控制、输出面板、终端等)。

VS Online 当时的代号是 Monaco,在新的 VS Online (2019 年,基于 VS Code Web 版本)短暂的运营了一段时间以后,目前已经改名叫做 GitHub Codespaces。


6e27ed01114489a138de5ee18f2d72c8.png

image.png

下图为现在的 GitHub Codespaces

16846372a971a47c2462c40d84358864.png
image.png

基础部件


Monaco Editor 的核心功能与组件和 VS Code 基本一致,它们基本上都包含下图中这些小部件。

a4b0829d9e33593b92089e099204abdc.png

  1. 行号

  2. Overlay Widget,可以渲染任意的内容小部件,能选择放置在顶部、底部或编辑器中间。例如编辑器内的查找框即是一个 Overlay  Widget

  3. ViewLine,每一行都表示一个 ViewLine

  4. Decorations 装饰块,可以指定某个位置的代码块以何种样式呈现,例如修改其背景色、前景色等

  5. Content Widget,与 Overlay Widget 类似,但可以基于行、列指定其位置。例如自动补全的列表框就是一个 Content Widget

  6. View Zone, 与 Overlay、Content Widget 不同,它可以插入到特定的行之间将其撑开。例如在上图中88行与89行之间的查找引用窗口

除了这些标配的部件之外,Monaco 还支持通过 Decorations API 来添加更多的装饰,例如版本控制中为修改过的行号添加一个色块,又或者在调试状态下显示断点信息等。

10c646162b6b15e7feea1bf7ea67cc28.png

语言支持


Monaco 本身只是一个文本编辑器,对于不同编程语言的基础支持(即高亮)则需要通过注册语言规则的方式来实现,Monaco 默认使用了名为 Monarch 的高亮系统(而 VS Code 使用的则是 Textmate ),Monarch 规定了语言需要包含的关键字、类型、操作符,以及 Tokenizer。Tokenizer 是一组正则表达式,表示以何种规则来识别这些关键字以及括号、注释块,Monarch 将会依照正则表达式的配置来匹配每个 Token,并为之渲染对应的主题色。

// Create your own language definition here
// You can safely look at other samples without losing modifications.
// Modifications are not saved on browser refresh/close though -- copy often!
return {
  // Set defaultToken to invalid to see what you do not tokenize yet
  // defaultToken: 'invalid',


  keywords: [
    'abstract', 'continue', 'for', 'new', 'switch', 'assert', 'goto', 'do',
    'if', 'private', 'this', 'break', 'protected', 'throw', 'else', 'public',
    'enum', 'return', 'catch', 'try', 'interface', 'static', 'class2',
    'finally', 'const', 'super', 'while', 'true', 'false'
  ],


  typeKeywords: [
    'boolean', 'double', 'byte', 'int', 'short', 'char', 'void', 'long', 'float'
  ],


  operators: [
    '=', '>', '<', '!', '~', '?', ':', '==', '<=', '>=', '!=',
    '&&', '||', '++', '--', '+', '-', '*', '/', '&', '|', '^', '%',
    '<<', '>>', '>>>', '+=', '-=', '*=', '/=', '&=', '|=', '^=',
    '%=', '<<=', '>>=', '>>>='
  ],


  // we include these common regular expressions
  symbols:  /[=><!~?:&|+\-*\/\^%]+/,


  // C# style strings
  escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,


  // The main tokenizer for our languages
  tokenizer: {
    root: [
      // identifiers and keywords
      [/[a-z_$][\w$]*/, { cases: { '@typeKeywords': 'keyword',
                                   '@keywords': 'keyword',
                                   '@default': 'identifier' } }],
      [/[A-Z][\w\$]*/, 'type.identifier' ],  // to show class names nicely


      // whitespace
      { include: '@whitespace' },


      // delimiters and operators
      [/[{}()\[\]]/, '@brackets'],
      [/[<>](?!@symbols)/, '@brackets'],
      [/@symbols/, { cases: { '@operators': 'operator',
                              '@default'  : '' } } ],


      // @ annotations.
      // As an example, we emit a debugging log message on these tokens.
      // Note: message are supressed during the first load -- change some lines to see them.
      [/@\s*[a-zA-Z_\$][\w\$]*/, { token: 'annotation', log: 'annotation token: $0' }],


      // numbers
      [/\d*\.\d+([eE][\-+]?\d+)?/, 'number.float'],
      [/0[xX][0-9a-fA-F]+/, 'number.hex'],
      [/\d+/, 'number'],


      // delimiter: after number because of .\d floats
      [/[;,.]/, 'delimiter'],


      // strings
      [/"([^"\\]|\\.)*$/, 'string.invalid' ],  // non-teminated string
      [/"/,  { token: 'string.quote', bracket: '@open', next: '@string' } ],


      // characters
      [/'[^\\']'/, 'string'],
      [/(')(@escapes)(')/, ['string','string.escape','string']],
      [/'/, 'string.invalid']
    ],


    comment: [
      [/[^\/*]+/, 'comment' ],
      [/\/\*/,    'comment', '@push' ],    // nested comment
      ["\\*/",    'comment', '@pop'  ],
      [/[\/*]/,   'comment' ]
    ],


    string: [
      [/[^\\"]+/,  'string'],
      [/@escapes/, 'string.escape'],
      [/\\./,      'string.escape.invalid'],
      [/"/,        { token: 'string.quote', bracket: '@close', next: '@pop' } ]
    ],


    whitespace: [
      [/[ \t\r\n]+/, 'white'],
      [/\/\*/,       'comment', '@comment' ],
      [/\/\/.*$/,    'comment'],
    ],
  },
};

这个例子中注册了类似 C# 风格的语言,在编辑器中的高亮结果则是这样

f0cea5fc1571cbc932dcf9181cf8d07e.png
image.png

Monaco 默认的方案与 VS Code 不同,这主要是因为 Textmate 的方案依赖 Oniguruma 这款正则引擎,而在 WebAssembly 大热以后,VS Code 团队推出了 wasm 版本,这使得 Monaco 也可以使用与 VS Code 一致的高亮方案 (同时社区也早有人做了移植,可以参考 monaco-editor-textmate)。

对于高级的语言特性支持,Monaco 也提供了遵循 LSP 标准的 API,例如自动补全、鼠标悬停、查找引用、定义跳转等常见功能都可以通过注册语言服务器来实现,而 Monaco 本身自带了包括 TypeScirpt/JavaScript、CSS、HTML 的语言服务支持。

✿  拓展阅读

7046be86863c697337896a152442314a.png

ecc087259564b9a80efee8e8eaa47658.png

作者|柳千

编辑|橙子君

出品|阿里巴巴新零售淘系技术

b8eca3b46e97bc4e441078fad2589f3e.png

90c21572e9d8936cce4da2adf03897cb.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS Code 编辑器: Monaco Editor 介绍 的相关文章

  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 工作不好找,普通打工人如何破局

    大家好 我是苍何 我的一位阿里朋友被裁后 找工作找了一个月都没结果 很多到最后一面被pass了 不由得做一下感慨 即使是大厂背景又如何 面对经济环境和大环境市场 每个人都不容易 我身边很多都是程序员群体 最近也在在编程导航 收到了很多小伙伴
  • 13.linux进程基础

    一 进程基础 基础概念 关于进程和线程的基本概念在操作系统中早已学过 可以概括为一下几点 根本区别 进程是操作系统资源分配的基本单位 而线程是处理器任务调度和执行的基本单位 资源开销 每个进程都有独立的代码和数据空间 程序上下文 程序之间的
  • Unable to negotiate with 172.16.28.137 port 22: no matching host key type found. Their offer: ssh-rs

    Unable to negotiate with 172 16 28 137 port 22 no matching host key type found Their offer ssh rsa ssh dss ssh连接服务器报错 Un
  • 数字化转型升级是企业的一项重要决策

    无独有偶 世界经济数字化转型是一个大命题 也是一个大趋势 未来一段时期 数字经济将成为拉动经济增长的一个重要引擎 各行业各领域数字化转型步伐将大大加快 不论是行业老大 还是国家政策 数字化转型都纷纷提上了日程 看来 在2020年 进行数字化
  • 贪吃蛇的小程序

    1 创建项目 1 打开微信开发者工具如图所示的界面 点击 2 填写项目以后 点击确定即可 如图所示 2 编程 1 编写index wxml的代码如下
  • ITIL是什么意思?ITIL是什么?

    ITIL是什么 ITIL是Information Technology Infrastructure Library的缩写 即 信息技术基础架构库 ITIL是由英国政府部门CCTA Central Computing and Telecom
  • 解决 hsdb jinfo jmap sa-jdi等mac不可用问题

    mac 使用 hsdb 调试的时候报错 hsdb gt attach 3196 Attaching to process 3196 please wait ERROR attach task for pid 3196 failed os k
  • linux查看文件行数

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 使用wc命令 具体通过wc help 可以查看 如 wc l filename
  • 论文笔记:nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation

    nature 2019 配套论文笔记 nnU Net Self adapting Frameworkfor U Net Based Medical Image Segmentation UQI LIUWJ的博客 CSDN博客 1 abstr
  • flutter windows 配置

    按照官网的教程安装好Android Studio flutter3 3 7 添加flutter目录的bin到环境变量Path 特别要注意的是 要添加以下两个环境变量 否则在运行flutter run 编译android程序时 会非常慢 Ru
  • 【python基础知识】19.产品思维以及流程图的使用 - 思维篇

    文章目录 前言 产品思维 流程图 顺序结构 条件结构 循环结构 产品设计 如何提需求 如何设计解决方案 前言 这是一节思维课程 我会向大家讲述如何利用编程知识去解决实际生活的问题 我曾反复提到 我们学习编程的目的从来不是为了考试 而是要学会
  • ESP32+TFTLCD实现WiFi天气语音播报(六)

    ESP32 MY1680U实现语音播报 文章目录 ESP32 MY1680U实现语音播报 前言 一 MY1680U 12P 语音模块 1 概述 2 参数说明 二 代码实现 1 MY1690 c 2 MY1690 h 3 main c 总结
  • 鸿蒙系统开发工具DevEco Studio 2.2下载/安装教程

    鸿蒙开发包括鸿蒙应用开发 手机app 和鸿蒙设备开发 硬件开发 两大部分 其中设备开发又包括TV 音响 眼镜 手表 PC 平板 汽车 耳机以及未来的各种智能家居 手机作为一个超级终端 与各种设备实现互联 未来无论是在工作 学习 运动还是做家
  • Ubuntu卸载Anaconda步骤

    1 进行相关文件的删除 删除12个文件夹 删除anaconda3文件夹 rm rf anaconda3 删除 anaconda文件夹 rm rf anaconda 删除 condarc文件夹 rm rf condarc 删除 conda文件
  • QT项目移植Ubuntu碰到的问题及解决

    项目可以直接移植 移植过程中需要删除两个文件 意思就是除了项目相关的文件 其他的编译文件不要移植过去 我的项目似乎是这几个文件的问题 要是不删除上面多余文件的话 我的项目是直接从windows复制到装载ubuntu的虚拟机上 不删的话 在w
  • Ubuntu 20.04 搭建 Fisco-BCOS 2.8.0 区块链系统

    0 摘要 本文根据 Fisco BCOS 及 Webase 官方文档 就安装过程做了详细描述 针对官方文档中一些不清楚的地方 做了补充 方便新手搭建 1 准备工作 1 1 系统 Ubuntu 20 04 3 Desktop Server F
  • TOOLLLM: FACILITATING LARGE LANGUAGE MODELS TO MASTER 16000+ REAL-WORLD APIS

    本文是LLM系列的文章之一 针对 TOOLLLM FACILITATING LARGE LANGUAGE MODELS TO MASTER 16000 REAL WORLD APIS 的翻译 TOOLLLMs 让大模型掌握16000 的真实
  • 如何使用Mybtis-Plus创建项目???

    1 建立项目 file gt New gt Project 选择Maven项目 2 导入依赖 编写pom xml文件
  • MySQL允许外部访问

    在从外部往MySQL插入数据是 老是失败 才发现是不允许从外部访问 也找了很多方法都没解决 最后才找到这个 一 安装好MySQL 二 开始修改配置 1 登进MySQL之后 2 输入以下语句 进入mysql库 use mysql 3 更新域属
  • VS Code 编辑器: Monaco Editor 介绍

    Any application that can be written in JavaScript will eventually be written in JavaScript 任何可以用 JavaScript 来写的应用 最终都将用