Skip to content

Copilot 代码编辑器

HTML 代码

html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Monaco Editor Copilot Demo</title>
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
      margin: 0;
      overflow: hidden;
    }
  </style>
  <!-- 引入 Monaco Editor Loader -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.45.0/min/vs/loader.min.js"></script>
</head>

<body>

  <div id="container"></div>

  <script>
    require.config({ paths: { 'vs': 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.45.0/min/vs' } });

    require(['vs/editor/editor.main'], function () {

      // 1. 注册 Inline Completions Provider (必须在创建编辑器实例之前或之后注册均可)
      monaco.languages.registerInlineCompletionsProvider('javascript', {

        provideInlineCompletions: async function (model, position, context, token) {
          // 获取当前光标前的文本作为 Prompt
          const textUntilPosition = model.getValueInRange({
            startLineNumber: 1,
            startColumn: 1,
            endLineNumber: position.lineNumber,
            endColumn: position.column
          });

          // === 模拟调用 AI API (这里是你要替换成真实后端请求的地方) ===
          // 实际项目中,这里应使用 fetch 调用 OpenAI/自定义 LLM 接口
          // 注意:为了性能,建议加上防抖 (Debounce) 逻辑

          console.log("触发补全,上下文:", textUntilPosition);

          // 模拟网络延迟
          await new Promise(r => setTimeout(r, 300));

          // 检查是否被取消(用户继续输入了)
          if (token.isCancellationRequested) {
            return { items: [] };
          }

          // 简单的模拟逻辑:如果输入 "func",建议一个函数
          let suggestion = "";
          if (textUntilPosition.trim().endsWith("func")) {
            suggestion = "tion add(a, b) {\n    return a + b;\n}";
          } else if (textUntilPosition.trim().endsWith("console.")) {
            suggestion = "log('Hello Copilot');";
          } else {
            // 默认不显示
            return { items: [] };
          }
          // =======================================================

          return {
            items: [{
              insertText: suggestion,
              // 建议显示的范围通常是光标位置
              range: {
                startLineNumber: position.lineNumber,
                startColumn: position.column,
                endLineNumber: position.lineNumber,
                endColumn: position.column
              }
            }]
          };
        },

        freeInlineCompletions(completions) {
          // 释放资源(如果需要)
        }
      });

      // 2. 创建编辑器实例
      const editor = monaco.editor.create(document.getElementById('container'), {
        value: '// 试着输入 "func" 或 "console." 等待一下...\n',
        language: 'javascript',
        theme: 'vs-dark',
        fontSize: 14,
        // 开启 inlineSuggest 功能
        inlineSuggest: {
          enabled: true,
          showToolbar: 'always' // 鼠标悬停时显示操作栏
        }
      });
    });
  </script>
</body>

</html>