来自多个文件的摩纳哥编辑器智能感知
Monaco Editor intellisense from multiple files
我正在使用 monaco-editor,我想包含来自多个文件的建议。我不确定最好的方法是什么,但基本上,我希望当我在 file2.js 中导出一些函数时,能够从建议中的另一个 file1.js 访问它。
知道如何实现吗?
谢谢!
文件 1
var express = require('express');
var pug = require('pug');
var config = require('./config');
var fs = require('fs');
var router = express.Router();
var utils = require('/utils');
// Here I would like to use the function newTest from the other file
but it does not show in the suggestions
router.get('/', function (req, res) {
console.log("ip - ", req.connection.remoteAddress)
res.send(pug.compileFile('views/main.pug')({
config
}))
});
module.exports = router;
文件2
function newTest() {
}
module.exports.newTest = newTest;
编辑器文件
$(document).ready(function() {
// I prefetch my models, then I have a callback to create an instance of the editor
preFetchAllModels(function() {
var models = monaco.editor.getModels();
// I check that I have my models (file1 and file2) prefetched before creating the editor
console.log("models", models);
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true)
monacoEditor = monaco.editor.create(document.getElementById("editor"), {
value: "loading...",
language: "javascript",
theme: 'monokai',
lineHeight: 20,
fontSize: 16,
wordWrap: "bounded",
automaticLayout: true,
wrappingIndent: 'indent'
});
});
要实现跨多个文件的 IntelliSense 目标,您需要使用 monaco.editor
的单个实例,并且对于您想要 IntelliSense 的每个文件,在应用程序启动期间初始化一个新模型。此外,对于自动完成支持,
您必须实施完成项提供程序。阅读下文了解更多详情。
应用程序初始加载
- 使用
const myEditorInstance = monaco.editor.create({ ... , model: null })
创建单个编辑器实例。
- 通过
monaco.editor.createModel(...)
创建 n-model 个实例,其中 n
是文件数。
- 为 eager model sync 配置语言默认值:
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true)
。
- 要启用自动完成,您需要根据 CompletionItemProvider api.
实现一个方法
初始加载后处理各种事件
- 通过
monaco.editor.getModels()
获取现有模型列表。
- 打开文件时(通过用户单击按钮或通过您编写的某些代码以编程方式),使用
myEditorInstance.setModel(model)
.[=40 将编辑器实例的模型设置为您要打开的文件=]
- 关闭文件时,您应该使用
myEditorInstance.saveViewState()
. 保存该模型的视图状态(包括光标位置等)
- 如果再次打开该文件,您可以使用
myEditorInstance.restoreState()
. 恢复之前的模型状态
- 如果文件被重命名或删除,您需要妥善处理相应的模型,在文件被重命名的情况下,re-initialize模型。
看起来像下面的代码成功了:
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
allowNonTsExtensions: true
});
我的用例几乎和你一样,除了我有一个文件用作我的 "definitions" 填充主编辑器的自动完成。根据 Peter 提供的答案,我能够将以下工作示例放在一起。我相信您缺少的部分是创建模型,然后使用 editor.setModel(model)
将其分配给您的编辑器。
const editorOptions = {
minimap: { enabled: false },
scrollBeyondLastLine: false,
model: null,
language: "javascript"
}
const initEditor = () => {
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true)
const defModel = monaco.editor.createModel(
"const helloWorld = () => { return \"Hello World!\"; }",
"javascript"
)
const textModel = monaco.editor.createModel(
"helloWorld()",
"javascript"
)
const e1 = monaco.editor.create(
document.getElementById("editor1"), editorOptions
)
e1.setModel(defModel)
const e2 = monaco.editor.create(
document.getElementById("editor2"), editorOptions
)
e2.setModel(textModel)
}
require.config({
paths: {
vs: "https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.18.0/min/vs"
}
})
require(["vs/editor/editor.main"], initEditor)
.editor {
margin: 1em 0;
border: 1px solid #999;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.18.0/min/vs/loader.js"></script>
<h3>Definitions</h3>
<div class="editor" id="editor1" style="width: 100%; height: 40px"></div>
<h3>Editor</h3>
<div class="editor" id="editor2" style="width: 100%; height: 300px"></div>
我正在使用 monaco-editor,我想包含来自多个文件的建议。我不确定最好的方法是什么,但基本上,我希望当我在 file2.js 中导出一些函数时,能够从建议中的另一个 file1.js 访问它。
知道如何实现吗? 谢谢!
文件 1
var express = require('express');
var pug = require('pug');
var config = require('./config');
var fs = require('fs');
var router = express.Router();
var utils = require('/utils');
// Here I would like to use the function newTest from the other file
but it does not show in the suggestions
router.get('/', function (req, res) {
console.log("ip - ", req.connection.remoteAddress)
res.send(pug.compileFile('views/main.pug')({
config
}))
});
module.exports = router;
文件2
function newTest() {
}
module.exports.newTest = newTest;
编辑器文件
$(document).ready(function() {
// I prefetch my models, then I have a callback to create an instance of the editor
preFetchAllModels(function() {
var models = monaco.editor.getModels();
// I check that I have my models (file1 and file2) prefetched before creating the editor
console.log("models", models);
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true)
monacoEditor = monaco.editor.create(document.getElementById("editor"), {
value: "loading...",
language: "javascript",
theme: 'monokai',
lineHeight: 20,
fontSize: 16,
wordWrap: "bounded",
automaticLayout: true,
wrappingIndent: 'indent'
});
});
要实现跨多个文件的 IntelliSense 目标,您需要使用 monaco.editor
的单个实例,并且对于您想要 IntelliSense 的每个文件,在应用程序启动期间初始化一个新模型。此外,对于自动完成支持,
您必须实施完成项提供程序。阅读下文了解更多详情。
应用程序初始加载
- 使用
const myEditorInstance = monaco.editor.create({ ... , model: null })
创建单个编辑器实例。 - 通过
monaco.editor.createModel(...)
创建 n-model 个实例,其中n
是文件数。 - 为 eager model sync 配置语言默认值:
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true)
。 - 要启用自动完成,您需要根据 CompletionItemProvider api. 实现一个方法
初始加载后处理各种事件
- 通过
monaco.editor.getModels()
获取现有模型列表。 - 打开文件时(通过用户单击按钮或通过您编写的某些代码以编程方式),使用
myEditorInstance.setModel(model)
.[=40 将编辑器实例的模型设置为您要打开的文件=] - 关闭文件时,您应该使用
myEditorInstance.saveViewState()
. 保存该模型的视图状态(包括光标位置等)
- 如果再次打开该文件,您可以使用
myEditorInstance.restoreState()
. 恢复之前的模型状态
- 如果文件被重命名或删除,您需要妥善处理相应的模型,在文件被重命名的情况下,re-initialize模型。
看起来像下面的代码成功了:
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
allowNonTsExtensions: true
});
我的用例几乎和你一样,除了我有一个文件用作我的 "definitions" 填充主编辑器的自动完成。根据 Peter 提供的答案,我能够将以下工作示例放在一起。我相信您缺少的部分是创建模型,然后使用 editor.setModel(model)
将其分配给您的编辑器。
const editorOptions = {
minimap: { enabled: false },
scrollBeyondLastLine: false,
model: null,
language: "javascript"
}
const initEditor = () => {
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true)
const defModel = monaco.editor.createModel(
"const helloWorld = () => { return \"Hello World!\"; }",
"javascript"
)
const textModel = monaco.editor.createModel(
"helloWorld()",
"javascript"
)
const e1 = monaco.editor.create(
document.getElementById("editor1"), editorOptions
)
e1.setModel(defModel)
const e2 = monaco.editor.create(
document.getElementById("editor2"), editorOptions
)
e2.setModel(textModel)
}
require.config({
paths: {
vs: "https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.18.0/min/vs"
}
})
require(["vs/editor/editor.main"], initEditor)
.editor {
margin: 1em 0;
border: 1px solid #999;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.18.0/min/vs/loader.js"></script>
<h3>Definitions</h3>
<div class="editor" id="editor1" style="width: 100%; height: 40px"></div>
<h3>Editor</h3>
<div class="editor" id="editor2" style="width: 100%; height: 300px"></div>