codemirror 插件使用总结

最近工作中需要用到网页端代码编辑器。在此使用code-mirror插件作为提供者,以下总结一些遇到的问题及解决方案:
参考手册:
vue-codemirror 地址: https://github.com/codemirror/CodeMirror.
codemirror 中文API文档:https://olindk.gitbooks.io/codemirror/content/commands.html

描述
cm以下cm皆为code-mirror简称
以下…皆为代码省略

1.无法自动加载配置文件,必须要点击一下code-mirror区域方可加载

  • 点击前
    在这里插入图片描述

  • 点击后:
    在这里插入图片描述

  • 解决方案:
    抓包后发现数据已经获取,猜测是cm没有执行自动刷新组件导致,在option内添加autoRefresh: true

    import 'codemirror/addon/display/autoRefresh.js'
    
    cmOptions: {
    	theme: 'xml',
    	mode: '',
    	readOnly: false,
    	autoRefresh: true,
    	autofocus: true,
    	viewportMargin: 1000, //指定当前滚动到视图中内容上⽅和下⽅要渲染的⾏数
    	lineNumbers: true, // 是否显示行号
        lineWrapping: true // 是否应滚动或换行以显示长行
    }
    

2.code-mirror和tab组件一起使用时,导致行号区域重叠

  • 异常时:
    在这里插入图片描述

  • 解决方案:
    点击切换tab时,需要刷新cm组件,否则有一定几率会造成行号区域重叠

    handleClick(tab, event){
    	 if (tab.name === 'selfDefineBtn') {
    	 	this.open(tab.index)
    	 } else {
    	 	this.$nextTick(() => {
    	 		// refresh code-mirror
    	     	let that = this.$refs.[this.activeName + 'mirror'][0].editor
    	     	that.refresh();
    	   	})
    	 }
    }
    
  • 解决后:
    在这里插入图片描述

3.code-mirror 组件中自定义方法
由于业务规则问题,保存配置文件时,会检测配置内容是否符合规则,若存在无法识别的语法则会提示错误信息并返回错误行号。

需要根据错误行号在textarea区域高亮显示错误行

cm组件内部已经考虑到了这点,提供了CodeMirror.defineExtension接口实现自定义的方法。

参考active-line高亮插件的原理,传入行号(from, to),实现高亮效果,贴上代码:

  • active-line 部分源代码:
    var WRAP_CLASS = "CodeMirror-activeline";
    var BACK_CLASS = "CodeMirror-activeline-background";
    var GUTT_CLASS = "CodeMirror-activeline-gutter";
    
    CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
      	...
      function clearActiveLines(cm) {
        for (var i = 0; i < cm.state.activeLines.length; i++) {
          cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
          cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
          cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
        }
      }
      function updateActiveLines(cm, ranges) {
        var active = [];
        ...
        cm.operation(function() {
          clearActiveLines(cm);
          for (var i = 0; i < active.length; i++) {
            cm.addLineClass(active[i], "wrap", WRAP_CLASS);
            cm.addLineClass(active[i], "background", BACK_CLASS);
            cm.addLineClass(active[i], "gutter", GUTT_CLASS);
          }
          cm.state.activeLines = active;
        });
      }
    });
    
  • 自定义新增方法:
    var WRAP_ERROR_CLASS = "CodeMirror-error-activeline";
    var BACK_ERROR_CLASS = "CodeMirror-error-activeline-background";
    var GUTT_ERROR_CLASS = "CodeMirror-error-activeline-gutter";
    
    CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
      	...
      //添加监听器,焦点在错误行时取消错误高亮样式
      cm.on("beforeSelectionChange", clearErrorLines);
      
      function clearAllActiveLines(cm) {
        clearActiveLines(cm);
        clearErrorLines(cm);
      }
      function clearErrorLines(cm) {
        for (var i = 0; i < cm.state.activeLines.length; i++) {
          cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_ERROR_CLASS );
          cm.removeLineClass(cm.state.activeLines[i], "background", BACK_ERROR_CLASS );
          cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_ERROR_CLASS );
        }
      }
    
      function updateActiveLines(cm, ranges) {...}
      
      /**
      * from: start line
      * to:   end line
      */
      const setErrorLines = function(cm, from, to) {
    	  let active = []
    	  if (!from || !to) return
    	  clearAllActiveLines(cm);
    	  for (let i = from; i <= to; i++) {
    	    let line = cm.getLineHandleVisualStart(i);
    	    this.addLineClass(line, "wrap", WRAP_ERROR_CLASS );
    	    this.addLineClass(line, "background", BACK_ERROR_CLASS );
    	    this.addLineClass(line, "gutter", GUTT_ERROR_CLASS );
    	  }
    	  cm.state.activeLines = active;
      };
      // 自定义方法
      CodeMirror.defineExtension("setErrorLines", setErrorLines);
    });
    
  • 效果展示:
    在这里插入图片描述

4.自动补全括号,且光标在括号左右侧时,自动突出匹配的括号

import 'codemirror/addon/edit/matchbrackets'
import 'codemirror/addon/edit/closebrackets'
cmOptions: {
	theme: 'xml',
	mode: '',
	readOnly: false,
	autoRefresh: true,
	autofocus: true,
	viewportMargin: 1000, //指定当前滚动到视图中内容上⽅和下⽅要渲染的⾏数
	lineNumbers: true, // 是否显示行号
    lineWrapping: true, // 是否应滚动或换行以显示长行
	autoCloseBrackets: true, // 自动闭合符号
	matchBrackets: true, // 在光标点击紧挨{、]括号左、右侧时,自动突出显示匹配的括号 }、]
}

后续出现问题还会继续补充

仅作为使用总结记录,望诸君共勉

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CodeMirror 是一个用于在网页中创建代码编辑器的 JavaScript 库。它提供了丰富的功能,例如语法高亮、代码折叠、自动完成等。要使用 CodeMirror 插件,您需要按照以下步骤进行操作: 1. 下载 CodeMirror:您可以从 CodeMirror 的官方网站(https://codemirror.net/)下载最新版本的库文件。您可以选择下载完整版的 CodeMirror 或者只下载您需要的模块。 2. 引入 CodeMirror:在您的网页中引入 CodeMirror 的库文件。您可以将 CSS 和 JavaScript 文件分别放在 `<head>` 和 `<body>` 标签中,如下所示: ```html <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="path/to/codemirror.css"> </head> <body> <script src="path/to/codemirror.js"></script> </body> </html> ``` 请确保将 `path/to/` 替换为您实际存放 CodeMirror 文件的路径。 3. 创建编辑器实例:在网页中创建一个 `<textarea>` 元素作为 CodeMirror 编辑器的容器,并使用 JavaScript 初始化一个 CodeMirror 实例。例如: ```html <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="path/to/codemirror.css"> </head> <body> <textarea id="myEditor" rows="10" cols="30"></textarea> <script src="path/to/codemirror.js"></script> <script> var myEditor = CodeMirror.fromTextArea(document.getElementById("myEditor"), { lineNumbers: true, // 显示行号 mode: "javascript" // 设置编辑器语言模式 }); </script> </body> </html> ``` 这样,您就创建了一个具有行号和 JavaScript 语言模式的 CodeMirror 编辑器。 当然,以上只是 CodeMirror 的基本用法,您可以进一步探索官方文档以了解更多高级功能和配置选项。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值