vue中实现Monaco Editor自定义提示功能

 更新时间:2019年07月05日 14:27:19   作者:猪九咩  
最近小编接到一个项目,需要在浏览器的ide中支持自定义提示功能,接下来通过本文给大家介绍在vue中实现Monaco Editor自定义提示功能,需要的朋友可以参考下

这次接到一个需求,要在浏览器的 IDE 中支持自定义提示功能,如下所示:

可以看到,它可以根据用户输入的内容来一项一项排除,只显示完全匹配的那一项。

项目的框架是 Vue ,编辑器用的是 Monaco Editor

什么是 Monaco Editor

vscode 是我们经常在用的编辑器,它的前身是微软的一个叫 Monaco Workbench 的项目,而 Monaco Editor 就是从这个项目中成长出来的一个 web 编辑器,他们很大一部分的代码都是共用的,所以 Monaco EditorVSCode 在编辑代码,交互及 UI 上几乎是一摸一样的。不同的是,两者的平台不一样, Monaco Editor 基于浏览器,而 VSCode 基于 electron ,所以功能上 VSCode 更加健全,性能比较强大。

用法

安装

npm install monaco-editor --save

使用

<div id="monaco" class="monaco-editor"></div>
import * as monaco from 'monaco-editor';
this.fileEditor = this.monaco.editor.create(document.getElementById('monaco'), {
 value: null,
 language: 'sql' // 这里以sql为例
})

this.fileEditor.dispose(); // 使用完后销毁

这里引入 monaco 要注意,在 react 中以下面方式引入:

import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';

实现自定义提示功能

查看了资料后,发现在 monaco 中有提供一个提示功能的方法 registerCompletionItemProvider ,具体实现如下:

this.monaco.languages.registerCompletionItemProvider('sql', { // 这里以sql语言为例
 provideCompletionItems () {
  return [{
   label: '${_DB', // 显示的提示内容
   kind: this.monaco.languages.CompletionItemKind['Function'], // 用来显示提示内容后的不同的图标
   insertText: '{_DB', // 选择后粘贴到编辑器中的文字
   detail: '' // 提示内容后的说明
  }];
 },
 triggerCharacters: ['$'] // 触发提示的字符,可以写多个
});

以上的用法,我试了一下之后发现,虽然 triggerCharacters 的值是数组,可以有多个,但是里面的字符串只能识别一个字符。一开始的需求是输入 ${_ 之后提示 ${_DB ,但是由于不能识别多个字符,只能做到出现 $ 就提示。

还有一个问题就是 registerCompletionItemProvider 的第一个参数只能是字符串,如果有多种语言只能叠加重复写,恰巧我的需求是有多种语言,所以只能如下解决,也就是每种语言都写了一遍:

['json', 'yaml', 'php', 'go', 'sql', 'java', 'markdown', 'plaintext'].map(item => {
 this.monaco.languages.registerCompletionItemProvider(item, {
  provideCompletionItems () {
   return [{
    label: '${_DB',
    kind: this.monaco.languages.CompletionItemKind['Function'],
    insertText: '{_DB',
    detail: ''
   }];
  },
  triggerCharacters: ['$']
 });
});

需求是 ${_DB:key:value ,也就是说在输入 ${_DB 后,再输入一个 : 提示出 key ,在 key 之后输入 : 提示 value

这里又碰到一个问题,需要知道当前输入的内容来判断是 $ 还是 : ,而且后面两个触发提示的符号同是 : ,无法区分,只能通过识别 : 的位置来判断是提示 key 还是 value ,所以还要知道当前输入的 : 之前的内容。

那么只有在 provideCompletionItems 这一步判断,但是查遍了资料没有发现这样的参数, provideCompletionItems 只有 modelpositiontoken 这几个参数,后来发现 model 中的 getLineContent 方法可以获取指定行的所有内容,而 position 可以获取当前输入行的行数和列数,于是就有了以下解决方法:

this.monaco.languages.registerCompletionItemProvider(item, {
 provideCompletionItems (model, position) {
  // 获取当前行数
  const line = position.lineNumber
  
  // 获取当前列数
  const column = position.column
  
  // 获取当前输入行的所有内容
  const content = model.getLineContent(line)
  
  // 通过下标来获取当前光标后一个内容,即为刚输入的内容
  const sym = content[column - 2]
  
  if (sym === '$') {
   return [{
    label: '${_DB',
    kind: this.monaco.languages.CompletionItemKind['Function'],
    insertText: '{_DB',
    detail: ''
   }];
  }
  
  return [{
   label: ':abb',
   kind: this.monaco.languages.CompletionItemKind['Function'],
   insertText: 'abb',
   detail: ''
  },
  {
   label: ':bc',
   kind: this.monaco.languages.CompletionItemKind['Function'],
   insertText: 'bc',
   detail: ''
  }];
 },
 triggerCharacters: ['$', ':']
});

能获取光标后的第一个内容,后面的内容就都能获取啦,如果识别到前面的内容是 ${_DB 就提示 key ,否则提示 value

最后总结下来就是一定要多看文档,勤于测试就能解决问题啦~

总结

以上所述是小编给大家介绍的vue中实现Monaco Editor自定义提示功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • Vue.js原理分析之nextTick实现详解

    Vue.js原理分析之nextTick实现详解

    这篇文章主要给大家介绍了关于Vue.js原理分析之nextTick实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 微前端qiankun主应用与子应用之间的跳转示例

    微前端qiankun主应用与子应用之间的跳转示例

    这篇文章主要为大家介绍了微前端qiankun主应用与子应用之间的跳转示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vue中component组件的props使用详解

    vue中component组件的props使用详解

    本篇文章主要介绍了vue中component组件的props使用详解,这里整理了详细的用法,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • 关于vue中使用three.js报错的解决方法

    关于vue中使用three.js报错的解决方法

    最近因为three.js的项目要用Vue.js,下面这篇文章主要给大家介绍了关于vue中使用three.js报错的解决方法,文中通过图文以及示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Vue proxyTable配置多个接口地址,解决跨域的问题

    Vue proxyTable配置多个接口地址,解决跨域的问题

    这篇文章主要介绍了Vue proxyTable配置多个接口地址,解决跨域的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vue实现表单未编辑或未保存离开弹窗提示功能

    vue实现表单未编辑或未保存离开弹窗提示功能

    这篇文章主要介绍了vue实现表单未编辑或未保存离开弹窗提示功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Vue.js学习记录之在元素与template中使用v-if指令实例

    Vue.js学习记录之在元素与template中使用v-if指令实例

    这篇文章主要给大家介绍了关于Vue.js学习记录之在元素与template中使用v-if指令的相关资料,文中给出了详细的示例代码供大家参考学习,相信对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Vue中使用JsonView来展示Json树的实例代码

    Vue中使用JsonView来展示Json树的实例代码

    这篇文章主要介绍了Vue之使用JsonView来展示Json树的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Vue 2.0中生命周期与钩子函数的一些理解

    Vue 2.0中生命周期与钩子函数的一些理解

    这篇文章主要给大家介绍了关于Vue 2.0中生命周期与钩子函数的相关资料,对大家学习或者使用vue2.0具有一定的参考学习价值,需要的朋友们下面随小编一起来看看吧。
    2017-05-05
  • Vue axios获取token临时令牌封装案例

    Vue axios获取token临时令牌封装案例

    这篇文章主要介绍了Vue axios获取token临时令牌封装案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论