当前位置: 首页 > news >正文

Monaco 多行提示的实现方式

AI 代码助手最近太火爆,国内有模型厂商都有代码助手,代码助手是个比较典型的 AI 应用,主要看前端,后端的模型都差不多,国内外都有专门的代码模型。现在都是集中在 VSCode 和 Idea的插件,本文通过 Monaco 实现一个多行代码提示,通过 monaco.languages.registerInlineCompletionsProvider 实现即可,Monaco 的 API 特别丰富,就是文档差点儿。代码中这个 range 没什么用,从 API 来看应该是代码插入代码的区域,但是 end-start 不要出现负值,否则会出问题。在调用的后端的时候,要用节流,请求就太多了,模型受不了。

import logo from './logo.svg';
import './App.css';
import MonacoEditor from 'react-monaco-editor';import { useRef, useState,useEffect }  from 'react';function App() {const editorRef = useRef(null);const monacoRef = useRef(null);const decorationsRef = useRef([]);const handleEditorDidMount = (editor, monaco) => {editorRef.current = editor;monacoRef.current = monaco;monaco.languages.registerInlineCompletionsProvider('javascript', {provideInlineCompletions: (model, position, context, token) => {const multiLineCompletion = {text: "example() {\n\tconsole.log('Hello, world!');\n}\nexample();",range: {startLineNumber: position.lineNumber,startColumn: 10,endLineNumber: position.lineNumber,endColumn: 10,},};return {items: [{insertText: multiLineCompletion.text,range: new monaco.Range(multiLineCompletion.range.startLineNumber,multiLineCompletion.range.startColumn,multiLineCompletion.range.endLineNumber,multiLineCompletion.range.endColumn),},],};},freeInlineCompletions(arg) {}});};useEffect(() => {// Define custom styles for the decorationsconst style = document.createElement('style');style.innerHTML = `.myAfterContentDecoration::after {content: ' // 备注';color: green;font-weight: bold;}`;document.head.appendChild(style);}, []);return (<div style={{'margin':'100px auto', 'width': '800px'}}><MonacoEditorwidth="800"height="600"language="javascript"theme="vs-dark"value={`// Write your JavaScript code here
function helloWorld() {console.log('Hello, world!');
}
helloWorld();`}options={{selectOnLineNumbers: true}}editorDidMount={handleEditorDidMount}/></div>);
}export default App;

在这里插入图片描述

http://www.lryc.cn/news/396481.html

相关文章:

  • SpringMVC的架构有什么优势?——表单和数据校验(四)
  • Linux实战记录
  • 时间、查找、打包、行过滤与指令的运行——linux指令学习(二)
  • android CameraX构建相机拍照
  • 【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示 proteus仿真+程序+设计报告+讲解视频
  • 工厂水电燃气表流量计等能耗计量仪表非侵入式拍照抄表的方案
  • LLM大模型应用中的安全对齐的简单理解
  • clickhouse-jdbc-bridge rce
  • java中Comparator函数的用法实例?
  • mysql实战入门-基础篇
  • 阶段三:项目开发---民航功能模块实现:任务24:航空实时监控
  • 手机容器化 安装docker
  • 科普文:深入理解Mybatis
  • 称重传感器有哪些种类
  • 程序员鱼皮的保姆级写简历指南第四弹,优秀简历参考
  • UML建模案例分析-时序图和类图的对应关系
  • Java版Flink使用指南——从RabbitMQ中队列中接入消息流
  • Python酷库之旅-第三方库Pandas(013)
  • Linux 高级 Shell 脚本编程:掌握 Shell 脚本精髓,提升工作效率
  • 【ARMv8/v9 GIC 系列 1.5 -- Enabling the distribution of interrupts】
  • 《mysql篇》--索引事务
  • 科研绘图系列:R语言STAMP图(STAMP Plot)
  • 运维团队如何应对动环监控与IT监控分离的挑战
  • 深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用
  • 开发指南040-业务操作日志
  • 如何构建数据驱动的企业?爬虫管理平台是关键桥梁吗?
  • 多线程Thread
  • 计算机网络之WPAN 和 WLAN
  • TikTok海外运营,云手机多种变现方法
  • kubekey在ubuntu24实现kubernetes快速安装