oimp
Version:
A CLI tool for generating OI problem and packages
117 lines (111 loc) • 5.13 kB
JavaScript
;
// 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;
}