monaco-editor新增自定义代码补全规则

 在monaco自带的javascript代码补全基础上添加自定义代码补全规则

import * as monaco from 'monaco-editor'
import vCompletion from './libs/custom-completion'
import sqlBuilder from './libs/sqlBuilder'


// 方法一
monaco.languages.registerCompletionItemProvider('javascript', {
	provideCompletionItems: () => {
		return { suggestions: vCompletion };
	}
});

// 方法二
monaco.languages.typescript.javascriptDefaults.addExtraLib(sqlBuilder, 'sqlBuilder.js');

方法一

// custom-completion.js
/* eslint-disable no-template-curly-in-string
  API 文档地址
  https://microsoft.github.io/monaco-editor/api/enums/monaco.languages.completionitemkind.html#snippet
 */
export default [  
 /**   * 内置函数   */  
 {    
    label: '_ABS(val:number)',
    kind: monaco.languages.CompletionItemKind.Function,
    insertText: '_ABS(${1:val})',
    insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
    detail: '返回指定参数的绝对值'
  },  {    
    label: '_COS(val:number)',
    kind: monaco.languages.CompletionItemKind.Function,
    insertText: '_COS(${1:val})',
    insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
    detail: '求指定角度的余弦值'
  }
]

更多参数可以查看官方文档 https://microsoft.github.io/monaco-editor/api/enums/monaco.languages.completionitemkind.html#snippet

这种方式的缺点是,必须是空行才能生效,如果光标前面有其他字符则无法自动打开代码提示。

方法二,通过扩展库的方式添加自己的规则,查看了下源码,自带的javascript代码提示也是用这种方式加进去的

export default `
var H = {
	/**
	 * 等于\n
	 * 相当于SQL中的 =
	 */
	EQ: Compare,
	/**
	 * 不等于\n
	 * 相当于SQL中的 !=
	 */
	NOT_EQ: Compare,
	/**
	 * 大于等于\n
	 * 相当于SQL中的 >=
	 */
	GE: Compare,
	/**
	 * 大于\n
	 * 相当于SQL中的 >=
	 */
	GT: Compare,
	/**
	 * 小于等于\n
	 * 相当于SQL中的 <=
	 */
	LE: Compare,
	/**
	 * 小于\n
	 * 相当于SQL中的 <
	 */
	LT: Compare,
	/**
	 * 在...中\n
	 * 相当于SQL中的 IN
	 */
	IN: Compare,
	/**
	 * 不在...中\n
	 * 相当于SQL中的 NOT IN
	 */
	NOT_IN: Compare,
	/**
	 * 类似,模糊匹配\n
	 * 相当于SQL中的 LIKE
	 */
	LIKE: Compare,
	/**
	 * 不类似,模糊匹配\n
	 * 相当于SQL中的 NOT LIKE
	 */
	NOT_LIKE: Compare,
	/**
	 * 为空值\n
	 * 相当于SQL中的 IS NULL
	 */
	IS_NULL: Compare,
	/**
	 * 不为空值\n
	 * 相当于SQL中的 IS NOT NULL
	 */
	IS_NOT_NULL: Compare,
	/**
	 * 升序
	 */
	ASC: Order,
	/**
	 * 降序
	 */
	DESC: Order,
	/**
	 * 左连接
	 */
	LEFT_JOIN: joinSql,
	/**
	 * 右连接
	 */
	RIGHT_JOIN: joinSql,
	/**
	 * 内连接
	 */
	INNER_JOIN: joinSql,
	/**
	 * 嵌套条件\n
	 * 例如SQL中 ... where (a>10 or a <5) and (b>10 or b<5)可以表示为\n
	 * ...where(H.COUND("a", H.GT, 10).or("a", H.LT, 5)).and(H.COUND("b", H.GT, 10).or("b", H.LT, 5))
	 * @param  {any} left 筛选条件左边
	 * @param  {Compare} compare 对比符,默认 H.EQ
	 * @param  {any} right 筛选条件右边,如果对比符为 H.IS_NULL 或 H.IS_NOT_NULL可不填
	 * @return {Cond}
	 */
	COND(left, compare, right) {
		class Cond {
			/**
			 * @param  {any} left 筛选条件左边
			 * @param  {Compare} compare 对比符,默认 H.EQ
			 * @param  {any} right 筛选条件右边,如果对比符为 H.IS_NULL 或 H.IS_NOT_NULL可不填
	 		 * @return {Cond}
			 */
			and(left, compare, right) {},
			/**
			 * @param  {any} left 筛选条件左边
			 * @param  {Compare} compare 对比符,默认 H.EQ
			 * @param  {any} right 筛选条件右边,如果对比符为 H.IS_NULL 或 H.IS_NOT_NULL可不填
	 		 * @return {Cond}
			 */
			or(left, compare, right) {}
		}
	},
	/**
	 * 返回日期\n
	 * 相当于SQL中的 DATE() 函数
	 * @param {any} val 字段名或表示时间的字符串
	 */
	DATE(val) {},
	/**
	 * 返回年份\n
	 * 相当于SQL中的 YEAR() 函数
	 * @param {any} val 字段名或表示时间的字符串
	 */
	YEAR(val) {},
	/**
	 * 返回当前时间\n
	 * 相当于SQL中的 NOW() 函数
	 */
	NOW() {},
	/**
	 * 计数\n
	 * 相当于SQL中的 COUNT() 函数
	 * @param {string} col 字段名,即控件编码
	 */
	COUNT(col) {},
	/**
	 * @param {string} expression 运算表达式,例如 (a.val1 + a.val2) / b.val1
	 */
	EXPR(expression) {}
}
`

这里只贴了部分代码,效果

这种方法即时不是空行也能自动提示,体验比较接近本地的IDE

React-Monaco-Editor是一个基于React的代码编辑器组件,它使用了Monaco Editor作为底层编辑器。代码补全是React-Monaco-Editor的一个重要功能,可以帮助开发者在编写代码时提供自动补全的建议。 要实现React-Monaco-Editor代码补全功能,你需要进行以下几个步骤: 1. 安装React-Monaco-Editor:首先,在你的React项目中安装React-Monaco-Editor依赖包。你可以使用npm或者yarn进行安装,具体命令如下: ``` npm install react-monaco-editor ``` 或者 ``` yarn add react-monaco-editor ``` 2. 导入React-Monaco-Editor组件:在你的代码文件中,导入React-Monaco-Editor组件,并将其作为一个React组件来使用。具体代码如下: ```jsx import React from 'react'; import MonacoEditor from 'react-monaco-editor'; class CodeEditor extends React.Component { render() { return ( <MonacoEditor language="javascript" // 设置编辑器语言 theme="vs-dark" // 设置编辑器主题 options={{ // 设置编辑器选项 automaticLayout: true, // 自动调整布局 suggestOnTriggerCharacters: true, // 在输入特定字符时触发建议 wordBasedSuggestions: true, // 基于单词的建议 suggestSelection: 'first', // 选择第一个建议 ...其他选项 }} // 其他属性 /> ); } } ``` 3. 配置代码补全:在上述代码中的`options`属性中,你可以配置编辑器的各种选项,包括代码补全相关的选项。具体来说,你可以设置`suggestOnTriggerCharacters`为`true`,以在输入特定字符时触发建议。你还可以设置`wordBasedSuggestions`为`true`,以基于单词进行建议。此外,你还可以设置其他相关的选项来自定义代码补全的行为。 以上就是使用React-Monaco-Editor实现代码补全的基本步骤。你可以根据自己的需求进行进一步的配置和定制化。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值