CodeMirror

2024-07-18 16:47:33 688
CodeMirror 是一个功能强大的浏览器内代码编辑器,支持多种编程语言和语法高亮。它可用于在网页中嵌入代码编辑功能,常见于开发者工具、在线代码编辑器和教学平台。

特色

  1. 多语言支持: 支持超过100种编程语言。
  2. 语法高亮: 提供准确的语法高亮,增强代码可读性。
  3. 可扩展性: 通过插件系统可以添加额外的功能,如代码折叠、行号显示等。
  4. 主题: 多种主题可供选择,支持自定义主题。
  5. 键盘快捷键: 支持常用的编辑快捷键,类似于 Emacs、Vim 等。
  6. 跨浏览器兼容: 在所有现代浏览器上运行良好。
  7. 丰富的API: 提供全面的 API 用于控制编辑器行为和获取编辑内容。

安装方式

  • 通过 npm 安装:

    npm install codemirror
    
  • 通过 CDN 引入:

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/codemirror.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/codemirror.min.js"></script>
    

基本使用

  1. 引入 CodeMirror CSS 和 JS 文件:

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/codemirror.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/codemirror.min.js"></script>
    
  2. 创建一个 HTML 元素用于编辑器:

    <textarea id="editor"></textarea>
    
  3. 初始化 CodeMirror 编辑器:

    const editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
      lineNumbers: true,        // 显示行号
      mode: 'javascript',       // 语言模式
      theme: 'default'          // 主题
    });
    

高级用法

  1. 插件和扩展: CodeMirror 通过插件扩展编辑器功能。例如,添加代码折叠功能:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/addon/fold/foldcode.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/addon/fold/foldgutter.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/addon/fold/brace-fold.min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/addon/fold/foldgutter.min.css">
    
    const editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
      lineNumbers: true,
      mode: 'javascript',
      theme: 'default',
      foldGutter: true,          // 启用折叠功能
      gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter']
    });
    
  2. 自定义快捷键: 可以为编辑器添加自定义快捷键:

    const editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
      lineNumbers: true,
      mode: 'javascript',
      theme: 'default',
      extraKeys: {
        'Ctrl-Space': 'autocomplete', // 启用自动补全
        'Ctrl-Q': function(cm) { cm.foldCode(cm.getCursor()); } // 折叠代码
      }
    });
    
  3. 主题: CodeMirror 提供多种主题,可以通过引入主题 CSS 文件并配置编辑器选项来更改主题:

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.5/theme/dracula.min.css">
    
    const editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
      lineNumbers: true,
      mode: 'javascript',
      theme: 'dracula'           // 使用 Dracula 主题
    });
    

API 介绍

fromTextArea options参数属性说明

属性类型默认值描述
modeStringnull语言模式,指定代码的语法高亮,如 javascriptcsshtmlmixed 等。
themeString'default'编辑器主题,可以是内置主题或自定义主题。
lineNumbersBooleanfalse是否在编辑器左侧显示行号。
readOnlyBooleanfalse是否设置为只读模式。
guttersArray[]显示在行号左侧的额外信息区域,可以用于代码折叠等功能。
foldGutterBooleanfalse是否启用代码折叠功能。
lineWrappingBooleanfalse是否启用自动换行功能。
matchBracketsBooleanfalse是否启用括号匹配功能。
autoCloseBracketsBooleanfalse是否启用自动闭合括号功能。
extraKeysObject{}自定义快捷键映射,格式为 {'快捷键': '功能'}
tabSizeNumber4设置 Tab 键的宽度,以空格数表示。
indentUnitNumber2设置自动缩进的单位,以空格数表示。
indentWithTabsBooleanfalse是否使用 Tab 字符进行缩进。
cursorBlinkRateNumber530设置光标闪烁的速度,单位为毫秒。
cursorHeightNumber1设置光标的高度,取值范围为 01
viewportMarginNumber10设置在屏幕外的多少行进行渲染,值为 Infinity 时渲染整个文档。
autofocusBooleanfalse是否自动聚焦到编辑器。
smartIndentBooleantrue是否启用智能缩进。
hintOptionsObject{}设置自动补全提示选项。
valueString''设置编辑器的初始内容。

方法说明

API参数类型描述示例
fromTextAreatextarea, optionsHTMLElement, Object创建一个从 textarea 元素生成的 CodeMirror 实例const editor = CodeMirror.fromTextArea(document.getElementById('editor'), { lineNumbers: true });
getValueString获取编辑器内容const content = editor.getValue();
setValuecontentString设置编辑器内容editor.setValue('console.log("Hello, world!");');
onevent, callbackString, Function为特定事件附加事件监听器editor.on('change', (instance, changeObj) => { console.log('Content changed'); });
addKeyMapkeymapObject添加快捷键映射editor.addKeyMap({ 'Ctrl-S': saveFunction });
focus聚焦编辑器editor.focus();
setOptionoption, valueString, Any设置编辑器选项editor.setOption('theme', 'monokai');
getOptionoptionString获取编辑器选项const theme = editor.getOption('theme');
refresh重新渲染编辑器editor.refresh();

示例详细说明

  1. fromTextArea(textarea, options)

    const editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
      lineNumbers: true,
      mode: 'javascript',
      theme: 'default'
    });
    
  2. getValue()

    const content = editor.getValue();
    console.log(content);
    
  3. setValue(content)

    editor.setValue('console.log("Hello, world!");');
    
  4. on(event, callback)

    editor.on('change', (instance, changeObj) => {
      console.log('内容改变');
    });
    
  5. addKeyMap(keymap)

    editor.addKeyMap({
      'Ctrl-S': function(cm) { console.log('保存'); }
    });
    
  6. focus()

    editor.focus();
    
  7. setOption(option, value)

    editor.setOption('theme', 'monokai');
    
  8. getOption(option)

    const theme = editor.getOption('theme');
    console.log(theme);
    
  9. refresh()

    editor.refresh();
    

官方资料