使用CodeMirror实现一些自定义的规则

因为项目中需要一个能够实现自定义规则的文本编辑器,对比了几个库,最终还是选用了CodeMirror

CodeMirror的优点

  1. 文档完善,简单易懂
  2. Demo丰富
  3. 可扩展性强

今天我们就来实现一些自定义的语言规则,这些规则只是让大家对CodeMirror的使用方法有一个初步的了解,并不一定实用:

  1. 自定义关键字高亮
  2. 输入左括号自动出现右括号
  3. 左右括号颜色高亮
  4. 自定义代码补全下拉提示框

开工,第一步,我们可以去github上把CodeMirror的代码拉下来,或者用npm安装也可以,然后使用到了里面的几个关键文件

1234567891011
// 核心文件<link rel="stylesheet" href="../lib/codemirror.css"><script src="../lib/codemirror.js"></script>// 自动补全提示框<script src="../addon/hint/show-hint.js"></script><link rel="stylesheet" href="../addon/hint/show-hint.css">// 左右括号颜色高亮<script src="../addon/edit/matchbrackets.js"></script>

// textarea内是预设的文本<textarea id="editor">123 hello world $aaa$</textarea>

两个核心文件是必不可少的,其他的各种addons则是选配

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
// 定义我们需要高亮的关键字const myHighlightList = [    'hello', '你好', '$aaa$']CodeMirror.defineMode('myMode', (config) => { return { /** 这个token方法就是用来标亮关键字的, CodeMirror会自上而下,从左往右得遍历每一个字符,依次调用token方法。 stream参数可以用来控制遍历的粒度,比如我调用方法 stream.eatWhile(/\s/), 那么当前cursor后面所有的空格会被匹配到stream中,stream.current()的值就是所有匹配到的空格。 **/ token: (stream) => { if (stream.eatSpace()) { return null }

 stream.eatWhile(/[\$\w\u4e00-\u9fa5]/)

 const cur = stream.current() const exist = myHighlightList.some((item) => { return item === cur })

 /** def 表示蓝色,CodeMirror为我们定义了许多颜色,其他还有: keyword {color: #708;}  atom {color: #219;} number {color: #164;} 等等,具体可以看codemirror.css文件中的定义 **/ if (exist) { return 'def' }

 stream.next() } }})

// 定义想要自动补全的wordsconst myHintList = [ 'hint1', 'hint2', 'ha2', 'ha3']CodeMirror.registerHelper("hint", "myMode", function (cm) { var cur = cm.getCursor(), token = cm.getTokenAt(cur); var start = token.start, end = cur.ch var str = token.string

 // 每次按下 Alt+/ 后会执行这个方法,这里将当前输入的字符和myHintList内的文本做前缀匹配过滤,实现一边输入一边查找的功能 const list = myHintList.filter((item) => { return item.indexOf(str) === 0 })

 if (list.length) return { list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end) };});

const editor = CodeMirror.fromTextArea(document.getElementById("editor"), { lineNumbers: true, // 是否显示行号 extraKeys: { "Alt-/": "autocomplete" }, // 定义自动补全的快捷键 matchBrackets: true, // 是否添加匹配括号高亮 mode: 'myMode' // 自定义的mode名称});

// 这里实现的功能就是按下左括号,自动添加右括号// 中括号,大括号同理editor.addKeyMap({ name: 'autoInsertParentheses', "'('": (cm) => { const cur = cm.getCursor()

 cm.replaceRange('()', cur, cur, '+insert') cm.doc.setCursor({ line: cur.line, ch: cur.ch + 1 }) }})

转载于:https://www.cnblogs.com/guochongbin/p/10642969.html

CodeMirror入门相关推荐

  1. 极简HTML渲染引擎,CodeMirror 代码渲染神器的极简入门实例

    效果: image.png HTML: 保存 运行 JS 代码示例: // 渲染代码: var editor = CodeMirror.fromTextArea(document.getElement ...

  2. CodeMIrror.js在线代码编辑器简单使用

    代码高亮是程序员的刚需,不管是在笔记类,论坛类,博客类web网站中,都对代码高亮提出要求,不高亮的代码阅读体验很差,codeMirror是一个前端代码高亮库,使用方便.CodeMirror 是一款在线 ...

  3. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  4. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  5. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

  6. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

  7. 【springboot】入门

    简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...

  8. SpringBoot (一) :入门篇 Hello World

    什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  9. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  10. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

最新文章

  1. correlation 蒙特卡洛_蒙特卡洛模拟法及其Matlab案例
  2. DAVID-GO-记录
  3. iOS之自定义封装tabBar
  4. Java学习小程序(5)猜数字游戏
  5. web前端性能分析--实践篇
  6. 炸掉卡西欧991CNX
  7. 2018年最新整理ios APP审核被拒的常见原因
  8. 已收藏!java面试知识点整理
  9. Adobe 修复严重的 Photoshop 缺陷
  10. MFC开发环境搭建(顺便来个Helloworld)
  11. html简单网页代码
  12. 某国内知名百货公司同城裸光纤/海外专线
  13. 将RTSP网络摄像机进行网页和微信直播的方案
  14. uniapp 微信支付功能
  15. [句型] 二十四、特殊疑问句 [ where ] [ what ] [ why ]
  16. 论文阅读 | Region Proposal by Guided Anchoring
  17. 旋转正方体加径向渐变
  18. 往哪里看低买高卖和利润之间
  19. Day74~75_Flink(一)Flink基础核心知识
  20. abab的四字成语_关于abab的四字成语大全

热门文章

  1. drupal7 payment module:把支付form元素注入到form中
  2. 网络黑客节庆狂欢 趋势科技见招拆招
  3. html5系列:notification api升级——从webkitNotifications到Notification
  4. 图论/暴力 Codeforces Beta Round #94 (Div. 2 Only) B. Students and Shoelaces
  5. 关于阵列卡的配置参数Cache Policy(缓存策略)
  6. CMOS 与BIOS
  7. win10 默认程序 edge
  8. 面试官问:Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?
  9. 微服务 API 网关建设,实践经验分享!
  10. MySQL 百万级数据,怎么做分页查询?