UNPKG

oimp

Version:

A CLI tool for generating OI problem and packages

117 lines (111 loc) 5.13 kB
"use strict"; // Monaco Editor 所有功能在此定义 // Monaco Editor 本地加载 import { updateCurrentFileDisplay } from "./ide-utility.js"; import { cppStd } from "./cppStd.js"; import { testlib_completions } from "./testlib_ completions.js"; // import { testlibHeader } from "./testlibHeader.js"; export async function initMonacoEditor(editorDivId) { // 引入 Monaco Editor require.config({ paths: { 'vs': '/static/monaco/min/vs' } }); window.MonacoEnvironment = { getWorkerUrl: function (moduleId, label) { // 指向本地 worker 文件 return '/static/monaco/min/vs/base/worker/workerMain.js'; } }; let editorDiv = document.getElementById(editorDivId); if (!editorDiv) return; require(["vs/editor/editor.main"], function () { // 1. 读取 C++ 补全定义文件内容(即之前的 cppStdLib.d.ts) const cppStdLibContent = cppStd; // 2. 配置补全库 // monaco.languages.tcppDefaults.addExtraLib( // testlibHeader, // 'file:///testlib.h' // ); monaco.languages.typescript.javascriptDefaults.addExtraLib( cppStdLibContent, 'cppStdLib.d.ts' // 虚拟文件名,用于标识这个补全库 ); // 3. 配置 C++ 语言的补全选项 monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ target: monaco.languages.typescript.ScriptTarget.ES5, allowNonTsExtensions: true, moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs, noEmit: true, lib: [] }); // 引入 Monaco Editor 语言包 // require(['vs/basic-languages/cpp/cpp']); const codeEditor = monaco.editor.create(editorDiv, { value: '', language: 'cpp', theme: 'vs-dark', automaticLayout: true, fontSize: 14, minimap: { enabled: false }, folding:true, formatOnPaste: true, formatOnType: true, scrollBeyondLastLine: false, contextmenu: true, scrollbar: { vertical: 'auto', horizontal: 'auto', verticalScrollbarSize: 5, horizontalScrollbarSize: 5 } }); window.codeEditor = codeEditor; // // 1. 注册 C++ 关键字补全 // monaco.languages.registerCompletionItemProvider('cpp', { // provideCompletionItems: (model, position) => ({ // suggestions: [ // 'for', 'while', 'if', 'else', 'switch', 'case', 'default', // 'break', 'continue', 'return', 'struct', 'class', 'namespace', // 'public', 'private', 'protected', 'template', 'typename', // 'static', 'const', 'constexpr', 'volatile', 'inline', 'extern' // ].map(key => ({ // label: key, // kind: monaco.languages.CompletionItemKind.Keyword, // insertText: key, // range: monaco.Range.fromPositions(position), // })) // }) // }); // monaco.languages.registerCompletionItemProvider('cpp', { // provideCompletionItems: (model, position) => { // const data = testlib_completions; // const completions = data.completions; // // 映射补全项类型到Monaco支持的CompletionItemKind // const kindMap = { // 'class': monaco.languages.CompletionItemKind.Class, // 'constructor': monaco.languages.CompletionItemKind.Constructor, // 'method': monaco.languages.CompletionItemKind.Method, // 'variable': monaco.languages.CompletionItemKind.Variable, // 'function': monaco.languages.CompletionItemKind.Function, // 'macro': monaco.languages.CompletionItemKind.Constant, // Monaco中没有Macro,用Constant替代 // 'typedef': monaco.languages.CompletionItemKind.TypeParameter // }; // return { // suggestions: completions.map(item => ({ // label: item.name, // kind: kindMap[item.kind] || monaco.languages.CompletionItemKind.Text, // 默认为文本类型 // detail: item.detail, // documentation: item.documentation, // insertText: item.name + (item.parameters ? `(${item.parameters.map(p => p.name).join(', ')})` : '') // })) // }; // } // }); // 添加监听器监听内容修改,将isDirty设置为true codeEditor.onDidChangeModelContent(function () { if (!window.isDirty) { window.isDirty = true; updateCurrentFileDisplay(); } }); }); return window.codeEditor; }