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

1、安装依赖

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

npm i codemirror

npm i @codemirror/lang-javascript

npm i @codemirror/autocomplete

npm 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>

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于 Vue 项目CodeMirror 代码提示,你可以使用 `vue-codemirror` 插件来实现。下面是一个简单的示例: 首先,安装 `vue-codemirror` 插件: ```bash npm install vue-codemirror --save ``` 然后,在你的 Vue 组件引入和使用 `vue-codemirror`: ```vue <template> <div> <codemirror v-model="code" :options="editorOptions"></codemirror> </div> </template> <script> import 'codemirror/lib/codemirror.css'; // 引入 CodeMirror 样式 import VueCodeMirror from 'vue-codemirror'; // 引入 vue-codemirror 组件 export default { components: { codemirror: VueCodeMirror.component, }, data() { return { code: '', editorOptions: { mode: 'javascript', // 设置编辑器模式 lineNumbers: true, // 显示行号 extraKeys: { 'Ctrl-Space': 'autocomplete', // 使用 Ctrl + Space 触发代码提示 }, hintOptions: { completeSingle: false, // 当只有一个选项时是否自动完成 }, }, }; }, }; </script> ``` 在上面的示例,我们首先引入了 `codemirror` 样式,然后在组件导入和使用了 `vue-codemirror` 组件。通过在模板使用 `<codemirror>` 标签,并将 `v-model` 绑定到 `code` 数据上,以实现与输入框的双向绑定。 在 `editorOptions` ,我们设置了编辑器的模式为 `javascript`,显示行号,并配置了代码提示的触发方式为 `Ctrl-Space`。你可以根据需要进行配置。 请确保在 Vue 组件正确引入和配置 `vue-codemirror` 插件,并按照示例进行使用。这样就可以在 Vue 项目实现 CodeMirror代码提示功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值