在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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐