当前位置:首页 » 《我的小黑屋》 » 正文

vue3中使用codemirror6增加代码提示功能

4 人参与  2024年03月29日 13:00  分类 : 《我的小黑屋》  评论

点击全文阅读


1、安装依赖

// 安装codemirror、语言包、主题、自动补全

npm i codemirrornpm i @codemirror/lang-javascriptnpm i @codemirror/autocompletenpm i @codemirror/theme-one-dark

本人安装的版本是

"dependencies": {    "@codemirror/autocomplete": "^6.0.0",    "@codemirror/lang-javascript": "^6.0.2",    "@codemirror/theme-one-dark": "^6.0.0",    "codemirror": "^6.0.1",    ...},

2、创建编辑器

<template>  <el-select    placeholder="请选择分组"    v-model="group"    clearable    @change="insertGroup"  >    <el-option      v-for="dict in groupList      :key="dict.id"      :label="dict.dgName + '(' + dict.dgCode + ')'"      :value="dict.dgCode"    ></el-option>  </el-select>  <el-button @click="codeBeauty" style="margin-bottom: 0.5rem">代码格式化</el-button>  <div id="coder"></div>  <el-button type="primary" @click="submitForm" v-if="!testFlag">确 定</el-button></template>
<style scoped>#coder{  margin-top: 10px;  width: 100%;}</style>
<script setup name="Command">import { javascript } from "@codemirror/lang-javascript";import { oneDark } from "@codemirror/theme-one-dark";import { basicSetup, EditorView } from "codemirror";import { autocompletion } from "@codemirror/autocomplete"; const { proxy } = getCurrentInstance();const allKeyList = ref([]);const groupList = ref([]);const group = ref("");const data = reactive({  form: {},});const { form } = toRefs(data);let editor = null;// 获取自定义提示内容function getCommandList() {    groupList.value = [        { id: '1', label: '分组1', value: 'group1' },        { id: '2', label: '分组2', value: 'group2' },    ];     allKeyList.value = [      { label: "@match", type: "keyword", apply: "match", detail: "match" },      { label: "@hello", type: "variable", apply: "hello", detail: "hellodetail" },      { label: "@magic", type: "text", apply: "⠁⭒*.✩.*⭒⠁", detail: "macro" },    ];}// 代码美化function codeBeauty() {  editor.dispatch({    changes: {         from: 0,         to: editor.state.doc.length,         insert:js_beautify(getCommanContent() || "")     },  });}// 获取当前编辑器中的内容字符串function getCommanContent() {  let str = ""  editor.state.doc.children.forEach((el,index) => {    str += el.text.join("\n") + "\n"  })  return str.slice(0,-1);}// 初始化编辑器function initCodeContent(){  setTimeout(() => {    if(!editor) {      editor = new EditorView({        doc: "Press Ctrl-Space in here...\n",        extensions: [          basicSetup,          javascript(),          oneDark,          autocompletion({ override: [myCompletions] }),          // EditorView.updateListener.of((v) => {          //   console.log(v.state.doc.toString())           // }),        ],        parent: document.getElementById("coder"),        options: {          lineNumbers: true,          line: true,          //ctrl-space唤起智能提示          extraKeys: {            Ctrl: "autocomplete",          },          //括号匹配          matchBrackets: true,        },      });    }    editor.dispatch({      changes: {         from: 0,         to: editor.state.doc.length,         insert: form.value.commandContent || "Press Ctrl-Space in here...\n"       },    });  }, 500);}// 自定义的代码不全,options为自定义内容,以@开头进行匹配function myCompletions(context) {  let word = context.matchBefore(/@\w*/);  if (!word && !context.explicit) return null;  return {    from: word.from ? word.from : context.pos,    options: allKeyList.value,  };}// 选择分组添加到编辑其中function insertGroup() {  insertCommandContant(group.value);  group.value = "";}// 外部输入内容,添加到编辑器当前光标(或选中内容)所在的位置function insertCommandContant(insertContent) {  editor.dispatch({    changes: {         from: editor.state.selection.ranges[0].from,         to: editor.state.selection.ranges[0].to,         insert: insertContent     },  });}/** 提交按钮 */function submitForm() {  proxy.$modal.loading("正在保存,请稍候...");  form.value.commandContent = getCommanContent();  addForm(form.value).then((response) => {    proxy.$modal.msgSuccess("新增成功");    proxy.$modal.closeLoading();  }).catch((err) => {proxy.$modal.closeLoading();});}getCommandList();initCodeContent();</script>


点击全文阅读


本文链接:http://zhangshiyu.com/post/87624.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1