vue-codemirror编辑器的封装

2,092 阅读1分钟

vue-codemirror版本4.0.6 npm i vue-codemirror npm i sql-formatter

<template>
  <div style="height: 100%">
    <codemirror
      ref="cm"
      v-model="code"
      :options="cmOptions"
      @input="inputChange"
      @onCursorActivity="onCursorActivity"
    ></codemirror>
  </div>
</template>

<script>
// 全局引入vue-codemirror
import { codemirror } from 'vue-codemirror'
// 引入css文件
import 'codemirror/lib/codemirror.css'
// 引入主题 可以从 codemirror/theme/ 下引入多个
import 'codemirror/theme/idea.css'
// 引入语言模式 可以从 codemirror/mode/ 下引入多个
import 'codemirror/mode/sql/sql.js'

// 搜索功能
// find:Ctrl-F (PC), Cmd-F (Mac)
// findNext:Ctrl-G (PC), Cmd-G (Mac)
// findPrev:Shift-Ctrl-G (PC), Shift-Cmd-G (Mac)
// replace:Shift-Ctrl-F (PC), Cmd-Alt-F (Mac)
// replaceAll:Shift-Ctrl-R (PC), Shift-Cmd-Alt-F (Mac)
import 'codemirror/addon/dialog/dialog.css'
import 'codemirror/addon/dialog/dialog'
import 'codemirror/addon/search/searchcursor'
import 'codemirror/addon/search/search'
import 'codemirror/addon/search/jump-to-line'
import 'codemirror/addon/search/matchesonscrollbar'
import 'codemirror/addon/search/match-highlighter'

// 代码提示功能 具体语言可以从 codemirror/addon/hint/ 下引入多个
import 'codemirror/addon/hint/show-hint.css'
import 'codemirror/addon/hint/show-hint'
import 'codemirror/addon/hint/sql-hint'

// 高亮行功能
import 'codemirror/addon/selection/active-line'
import 'codemirror/addon/selection/selection-pointer'

// 调整scrollbar样式功能
import 'codemirror/addon/scroll/simplescrollbars.css'
import 'codemirror/addon/scroll/simplescrollbars'

// 自动括号匹配功能
import 'codemirror/addon/edit/matchbrackets'

// 全屏功能 由于项目复杂,自带的全屏功能一般不好使
import 'codemirror/addon/display/fullscreen.css'
import 'codemirror/addon/display/fullscreen'

// 显示自动刷新
import 'codemirror/addon/display/autorefresh'

// 多语言支持?
import 'codemirror/addon/mode/overlay'
import 'codemirror/addon/mode/multiplex'

// 代码段折叠功能
import 'codemirror/addon/fold/foldcode'
import 'codemirror/addon/fold/foldgutter'
import 'codemirror/addon/fold/foldgutter.css'

import 'codemirror/addon/fold/brace-fold'
import 'codemirror/addon/fold/comment-fold'
import 'codemirror/addon/fold/xml-fold.js'
import 'codemirror/addon/fold/indent-fold.js'
import 'codemirror/addon/fold/markdown-fold.js'
import 'codemirror/addon/fold/comment-fold.js'

// merge功能
import 'codemirror/addon/merge/merge.css'
import 'codemirror/addon/merge/merge'
// google DiffMatchPatch
import DiffMatchPatch from 'diff-match-patch'
import sqlFormatter from 'sql-formatter'; //sql格式化
// DiffMatchPatch config with global
window.diff_match_patch = DiffMatchPatch
window.DIFF_DELETE = -1
window.DIFF_INSERT = 1
window.DIFF_EQUAL = 0

export default {
  name: 'Show',
  components: { codemirror },
  data() {
    return {
      code: 'select a from table1 where b = 1',
      cmOptions: {
        // 语言及语法模式
        mode: 'text/x-sql',
        // 主题
        theme: 'idea',
        // 显示函数
        line: true,
        lineNumbers: true,
        // 软换行
        lineWrapping: true,
        // tab宽度
        tabSize: 4,
        // 代码提示功能
        hintOptions: {
          // 避免由于提示列表只有一个提示信息时,自动填充
          completeSingle: false,
          // 不同的语言支持从配置中读取自定义配置 sql语言允许配置表和字段信息,用于代码提示
          tables: {
            table1: ['c1', 'c2'],
            // table2: [ 'a', 'a']
          },
        },
        // 高亮行功能
        styleActiveLine: true,
        // 调整scrollbar样式功能
        scrollbarStyle: 'overlay',
        // 自动括号匹配功能
        matchBrackets: true,
      },
    }
  },
  methods: {
    sqlFormat(){
      this.code = sqlFormatter.format(this.code)
    },
    onCursorActivity(instance) {
      // console.log(instance)
    },
    inputChange(content) {
      this.$nextTick(() => {
        // console.log('code:' + this.code)
        // console.log('content:' + content)
      })
    },
  },
  mounted() {
    // 代码提示功能 当用户有输入时,显示提示信息
    this.$refs.cm.codemirror.on('inputRead', (cm) => {
      cm.showHint()
    })
    this.$refs.cm.codemirror.on('blur', (cm) => {
      // console.log('失去焦点')
    })

    // this.$refs.cm.codemirror.on(
    //   'cursorActivity',
    //   function (instance) {
    //     console.log(this.$refs.cm.codemirror.getSelection())
    //     //   console.log(this.CodeMirrorEditor.getSelection())
    //   }.bind(this)
    // )
  },
}
</script>
<style lang="scss">
.vue-codemirror {
  height: 100%;
}
.CodeMirror {
  height: 100%;
}
//sql编辑器内容靠左
.CodeMirror-wrap pre.CodeMirror-line,
.CodeMirror-wrap pre.CodeMirror-line-like {
  text-align: left;
}
</style>