1.什么是Code Mirror

最近做一个项目需要在网页上实现一个代码编辑器,支持语法高亮、自动缩进、智能提示等功能。发现Code Mirror刚好满足所有需求。Code Mirror是由js写的一款插件,其功能非常强大,用来实现网页端代码编辑器非常方便。如果想看效果图,可移步到这里----CodeOnline,这是我做的一个小项目,其中代码编辑器的就是用Code Mirror实现的。

2.使用Code Mirror

下面我将演示如何使用Code Mirror搭建一个简易的代码编辑器,并对其常用配置简要介绍。

首先要到Code Mirror官网下载此插件,然后在网页中引入即可。如下代码即实现了一个可以高亮显示Java代码的编辑器:

 <!--
最简单的CodeMirror编辑器
--> <!DOCTYPE
html> <html> <!--下面两个是使用Code Mirror必须引入的-->
<link rel="stylesheet" href="codemirror-5.12/lib/codemirror.css">
<script src="codemirror-5.12/lib/codemirror.js"></script> <!--Java代码高亮必须引入-->
<script src="codemirror-5.12/clike.js"></script> <head>
<title>CodeMirrorTest</title>
</head>
<body>
<textarea id="code"></textarea>
</body>
<script type="text/javascript">
//根据DOM元素的id构造出一个编辑器
var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
mode:"text/x-java" //实现Java代码高亮
});
</script>
</html>

如要显示行号,只需在构造editor时加上

lineNumbers:true

var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
mode:"text/x-java", //实现Java代码高亮
lineNumbers:true
});

当然,如此简单的编辑器还能不满足我们的需求,接下来我们要为这个编辑器加上如下功能:

  • 更改主题
  • 绑定Vim
  • 折叠代码
  • 全屏模式
  • 括号匹配
  • 智能提示

更改主题:

Code Mirror提供了很多种主题,在codemirror-5.12/theme/seti.css可以看到所有主题,我们准备使用seti这个主题,首先需将其引入:

<link rel="stylesheet" href="codemirror-5.12/theme/seti.css">

而后在构造editor时加入参数

theme:"seti"

完整代码如下:

 <!DOCTYPE html>
<html>
<link rel="stylesheet" href="codemirror-5.12/lib/codemirror.css">
<script src="codemirror-5.12/lib/codemirror.js"></script>
<script src="codemirror-5.12/clike.js"></script> <!--引入css文件,用以支持主题-->
<link rel="stylesheet" href="codemirror-5.12/theme/seti.css">
<head>
<title>CodeMirror Test</title>
</head>
<body>
<textarea id="code"></textarea>
</body>
<script type="text/javascript">
var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
mode:"text/x-java",
lineNumbers:true,
theme:"seti"
});
</script>
</html>

最后各种其他功能的实现方法与之类似,稍微注意的是需要引入的文件不同,我将实现各个功能所需的文件均写在了如下代码中:

 <!DOCTYPE html>
<html>
<link rel="stylesheet" href="codemirror-5.12/lib/codemirror.css">
<script src="codemirror-5.12/lib/codemirror.js"></script>
<script src="codemirror-5.12/clike.js"></script> <!--引入css文件,用以支持主题-->
<link rel="stylesheet" href="codemirror-5.12/theme/eclipse.css">
<link rel="stylesheet" href="codemirror-5.12/theme/seti.css">
<link rel="stylesheet" href="codemirror-5.12/theme/dracula.css"> <!--引入js,绑定Vim-->
<link rel="stylesheet" href="codemirror-5.12/addon/dialog/dialog.css">
<script src="codemirror-5.12/keymap/vim.js"></script>
<script src="codemirror-5.12/addon/search/searchcursor.js"></script>
<!--改善vim输入命令时的样式-->
<script src="codemirror-5.12/addon/dialog/dialog.js"></script> <!--支持代码折叠-->
<link rel="stylesheet" href="codemirror-5.12/addon/fold/foldgutter.css"/>
<script src="codemirror-5.12/addon/fold/foldcode.js"></script>
<script src="codemirror-5.12/addon/fold/foldgutter.js"></script>
<script src="codemirror-5.12/addon/fold/brace-fold.js"></script>
<script src="codemirror-5.12/addon/fold/comment-fold.js"></script> <!--全屏模式-->
<link rel="stylesheet" href="codemirror-5.12/addon/display/fullscreen.css">
<script src="codemirror-5.12/addon/display/fullscreen.js"></script> <!--括号匹配-->
<script src="codemirror-5.12/addon/edit/matchbrackets.js"></script> <!--自动补全-->
<link rel="stylesheet" href="codemirror-5.12/addon/hint/show-hint.css">
<script src="codemirror-5.12/addon/hint/show-hint.js"></script>
<script src="codemirror-5.12/addon/hint/anyword-hint.js"></script> <head>
<title>CodeMirror Test</title>
</head> <body>
<textarea id="code"></textarea>
</body>
<script type="text/javascript">
var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
//Java高亮显示
mode:"text/x-java", //显示行号
lineNumbers:true, //设置主题
theme:"seti", //绑定Vim
keyMap:"vim", //代码折叠
lineWrapping:true,
foldGutter: true,
gutters:["CodeMirror-linenumbers", "CodeMirror-foldgutter"], //全屏模式
fullScreen:true, //括号匹配
matchBrackets:true, 智能提示
extraKeys:{"Ctrl-Space":"autocomplete"}//ctrl-space唤起智能提示
});
</script>
</html>

其他说明:

  1. 在构造editor时相关的属性大多数都可以动态的指定。如设置显示行号可以不在构造editor时指出,只需构造出editor之后,调用

    editor.setOption("lineNumbers",true)

    即可,更改主题也类似的用

    editor.setOption("theme","seti")

    即可,非常方便。

  2. 可以用
    editor.getOption("属性名")

    来获取editor某属性的值,在本例中

    editor.getOption("theme")

    将返回"seti"

  3. 无法用js的DOM操作获取编辑器中的值,但可以用
    editor.getValeu()

    获得其中的值,

    editor.setValue("value")

    来设置其中的值

  4. 可以自定义编辑器的大小,只需设置如下样式即可:
    <style type="text/css">
    .CodeMirror{border:1px solid black;font- size:15px;width:100px;height:100px}
    </style>
  5. 在extra中可绑定函数到按键上,例如:
    var editor=CodeMirror.fromTextArea(document.getElementById("code"),{
    mode:"text/x-java",
    extraKeys:{
    "Ctrl-Space":"autocomplete",
    "Ctrl-F7":function () {
    alert("绑定了Ctrl-F7");
    },
    "Shift-Alt-Enter": function (cm) {
    cm.setOption("fullScreen", !cm.getOption("fullScreen"));
    }
    }
    });

需要注意的是,如果将esc键绑定了某函数,那么Vim可能无法正常工作。

3.结语

Code Mirror非常强大,上面的例子说明了其基本的使用方法,足够应付大多数使用场景,当然还有很多功能未能一一说明,我的大部分文章首发在知乎专栏:关于计算机的一些事,欢迎大家关注。如要深入学习,请阅读其官方文档。最后放一篇文章,该文章罗列了更多的配置项,传送门:codeMirror配置。为了方便阅读,摘抄如下:

options 可以使用的参数

CodeMirror函数和它的fromTextArea方法都可以使用一个配置对象作为第二个参数。

value: string | CodeMirror.Doc

编辑器的初始值(文本),可以是字符串或者CodeMirror文档对象(不同于HTML文档对象)。

mode: string | object

通用的或者在CodeMirror中使用的与mode相关联的mime,当不设置这个值的时候,会默认使用第一个载入的mode定义文件。一般地,会使用关联的mime类型来设置这个值;除此之外,也可以使用一个带有name属性的对象来作为值(如:{name:
“javascript”, json: true})。可以通过访问CodeMir

ror.modes和CodeMirror.mimeModes获取定义的mode和MIME。

lineSeparator:
string|null

明确指定编辑器使用的行分割符(换行符)。默认(值为null)情况下,文档会被
CRLF(以及单独的CR, LF)分割,单独的LF会在所有的输出中用作换行符(如:getValue)。当指定了换行字符串,行就只会被指定的串分割。

theme: string

配置编辑器的主题样式。要使用主题,必须保证名称为 .cm-s-[name]
(name是设置的theme的值)的样式是加载上了的。当然,你也可以一次加载多个主题样式,使用方法和html和使用类一样,如: theme: foo
bar,那么此时需要cm-s-foo cm-s-bar这两个样式都已经被加载上了。

indentUnit:
integer

缩进单位,值为空格数,默认为2 。

smartIndent:
boolean

自动缩进,设置是否根据上下文自动缩进(和上一行相同的缩进量)。默认为true。

tabSize: integer

tab字符的宽度,默认为4 。

indentWithTabs:
boolean

在缩进时,是否需要把 n*tab宽度个空格替换成n个tab字符,默认为false 。

electricChars:
boolean

在输入可能改变当前的缩进时,是否重新缩进,默认为true (仅在mode支持缩进时有效)。

specialChars:
RegExp

需要被占位符(placeholder)替换的特殊字符的正则表达式。最常用的是非打印字符。默认为:/[\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/。

specialCharPlaceholder:
function(char) → Element

这是一个接收由specialChars选项指定的字符作为参数的函数,此函数会产生一个用来显示指定字符的DOM节点。默认情况下,显示一个红点(•),这个红点有一个带有前面特殊字符编码的提示框。

rtlMoveVisually:
boolean

Determines whether horizontal cursor movement
through right-to-left (Arabic, Hebrew) text is visual (pressing the left arrow
moves the cursor left) or logical (pressing the left arrow moves to the next
lower index in the string, which is visually right in right-to-left text). The
default is false on Windows, and true on other platforms.(这段完全不晓得搞啥子鬼)

keyMap: string

配置快捷键。默认值为default,即
codemorrir.js 内部定义。其它在key map目录下。

extraKeys:
object

给编辑器绑定与前面keyMap配置不同的快捷键。

lineWrapping:
boolean

在长行时文字是换行(wrap)还是滚动(scroll),默认为滚动(scroll)。

lineNumbers:
boolean

是否在编辑器左侧显示行号。

firstLineNumber:
integer

行号从哪个数开始计数,默认为1 。

lineNumberFormatter:
function(line: integer) → string

使用一个函数设置行号。

gutters:
array<string>

用来添加额外的gutter(在行号gutter前或代替行号gutter)。值应该是CSS名称数组,每一项定义了用于绘制gutter背景的宽度(还有可选的背景)。为了能明确设置行号gutter的位置(默认在所有其它gutter的右边),也可以包含CodeMirror-linenumbers类。类名是用于传给setGutterMarker的键名(keys)。

fixedGutter:
boolean

设置gutter跟随编辑器内容水平滚动(false)还是固定在左侧(true或默认)。

scrollbarStyle:
string

设置滚动条。默认为”native”,显示原生的滚动条。核心库还提供了”null”样式,此样式会完全隐藏滚动条。Addons可以设置更多的滚动条模式。

coverGutterNextToScrollbar:
boolean

当fixedGutter启用,并且存在水平滚动条时,在滚动条最左侧默认会显示gutter,当此项设置为true时,gutter会被带有CodeMirror-gutter-filler类的元素遮挡。

inputStyle:
string

选择CodeMirror处理输入和焦点的方式。核心库定义了textarea和contenteditable输入模式。在移动浏览器上,默认是contenteditable,在桌面浏览器上,默认是textarea。在contenteditable模式下对IME和屏幕阅读器支持更好。

readOnly:
boolean|string

编辑器是否只读。如果设置为预设的值 “nocursor”,那么除了设置只读外,编辑区域还不能获得焦点。

showCursorWhenSelecting:
boolean

在选择时是否显示光标,默认为false。

lineWiseCopyCut:
boolean

启用时,如果在复制或剪切时没有选择文本,那么就会自动操作光标所在的整行。

undoDepth:
integer

最大撤消次数,默认为200(包括选中内容改变事件) 。

historyEventDelay:
integer

在输入或删除时引发历史事件前的毫秒数。

tabindex:
integer

编辑器的tabindex。

autofocus:
boolean

是否在初始化时自动获取焦点。默认情况是关闭的。但是,在使用textarea并且没有明确指定值的时候会被自动设置为true。

低级选项

下面的选项仅用于一些特殊情况。

dragDrop:
boolean

是否允许拖放,默认为true。

allowDropFileTypes:
array<string>

默认为null。当设置此项时,只接收包含在此数组内的文件类型拖入编辑器。文件类型为MIME名称。

cursorBlinkRate:
number

光标闪动的间隔,单位为毫秒。默认为530。当设置为0时,会禁用光标闪动。负数会隐藏光标。

cursorScrollMargin:
number

当光标靠近可视区域边界时,光标距离上方和下方的距离。默认为0 。

cursorHeight:
number

光标高度。默认为1,也就是撑满行高。对一些字体,设置0.85看起来会更好。

resetSelectionOnContextMenu:
boolean

设置在选择文本外点击打开上下文菜单时,是否将光标移动到点击处。默认为true。

workTime,
workDelay: number

通过一个假的后台线程高亮 workTime 时长,然后使用 timeout 休息
workDelay 时长。默认为200和300 。(完全不懂这个功能是在说啥)

pollInterval:
number

指明CodeMirror向对应的textarea滚动(写数据)的速度(获得焦点时)。大多数的输入都是通过事件捕获,但是有的输入法(如IME)在某些浏览器上并不会生成事件,所以使用数据滚动。默认为100毫秒。

flattenSpans:
boolean

默认情况下,CodeMirror会将使用相同class的两个span合并成一个。通过设置此项为false禁用此功能。

addModeClass:
boolean

当启用时(默认禁用),会给每个标记添加额外的表示生成标记的mode的以cm-m开头的CSS样式类。例如,XML
mode产生的标记,会添加cm-m-xml类。

maxHighlightLength:
number

当需要高亮很长的行时,为了保持响应性能,当到达某些位置时,编辑器会直接将其他行设置为纯文本(plain
text)。默认为10000,可以设置为Infinity来关闭此功能。

viewportMargin:
integer

指定当前滚动到视图中内容上方和下方要渲染的行数。这会影响到滚动时要更新的行数。通常情况下应该使用默认值10。可以设置值为Infinity始终渲染整个文档。注意:这样设置在处理大文档时会影响性能。

在线代码编辑器CodeMirror简介的更多相关文章

  1. 在线代码编辑器 Codemirror 的轻量级 React 组件

    代码编辑器 CodeMirror 的轻量级 React 组件 demo @uiw-react.github.io/react-codemirror/ 特性:

  2. Js的在线代码编辑器:CodeMirror

    github地址:https://github.com/codemirror/CodeMirror/tree/master/demo 里面包含需要的js.css文件以及大量的示例 官网:https:/ ...

  3. JS在线代码编辑器多种方案monaco-editor,vue-monaco-editor

    前言 JavaScript在线代码编辑器. 需要代码提示,关键字高亮,能够格式化代码.(不需要在线运行) 简简单单的需求. 方案一: Monaco-editor 简介:微软的开源项目,开源中国上面的在 ...

  4. (视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线代码编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定

    本文是<快速创建网站>系列的第6篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  5. 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯

    20个最强的基于浏览器的在线代码编辑器 - OPEN资讯 20个最强的基于浏览器的在线代码编辑器

  6. CodeMirror在线代码编辑器使用

    CodeMirror官网地址为:https://codemirror.net/ CodeMirror作为一款代码编辑器,其应用场景主要是在线网站写代码.如现在的leetcode.洛谷.code-vs等 ...

  7. ACE Editor在线代码编辑器简介及使用引导

    转自博客:https://www.cnblogs.com/cz-xjw/p/6476179.html ACE 是一个开源的.独立的.基于浏览器的代码编辑器,可以嵌入到任何web页面或JavaScrip ...

  8. CodeMirror 在线代码编辑器

    像百度编辑器插件部分.菜鸟教程示例等高德地图都在使用,这里也记录一下: CodeMirror是一个用于编辑器文本框textarea代码高亮javascript插件...... vue 中使用 参见:h ...

  9. CodeMirror:基于JavaScript的代码编辑器

    官方网站定义: http://codemirror.net/ CodeMirror is a versatile text editor implemented in JavaScript for t ...

随机推荐

  1. 后端码农谈前端(CSS篇)第四课:选择器补充(伪类与伪元素)

    一.伪类: 属性 描述 :active 向被激活的元素添加样式. :focus 向拥有键盘输入焦点的元素添加样式. :hover 当鼠标悬浮在元素上方时,向元素添加样式. :link 向未被访问的链接 ...

  2. timus_1007_bfs

    图像编码 题目描述: 有这样一副图,它有黑白像素,黑像素的坐标在1-10之间.有很多种方法来编码这个图.例如下面的图: 一种表示方法是只描述黑像素,并按x坐标的增序描述,如果x相同,则按y的增序描述, ...

  3. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别

    概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...

  4. Android Fragment完全解析

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...

  5. eclipse推荐的插件

    1.Log4j的颜色插件 http://m.blog.csdn.net/blog/JavaWinner/41548259

  6. 在SQL Server 2014里,如何用资源调控器压制你的存储?

    在今天的文章里,我想谈下SQL Server 2014里非常酷的提升:现在你终于可以根据需要的IOPS来压制查询!资源调控器(Resource Governor)自SQL Server 2008起引入 ...

  7. JavaScript之旅(三)

    JavaScript之旅(三) 三.函数 在JavaScript中,定义函数的方式如下: function abs(x) { ... return ...; } 如果没有return,返回结果为und ...

  8. Swift泛型协议的N种用法

    They said "you should learn a new language every year," so I  learned Swift. Now  I  learn ...

  9. 实现UniqueAttribute唯一性约束

    using System; using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace Zwj.T ...

  10. Python性能提升小技巧

    第一部分 1-使用内建函数: 你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速 2-使用 join() 连接字符串. 你可以使用 + 来连接字符串. 但由于string ...