摩纳哥编辑器:仅显示文档的一部分

时间:2019-11-22 09:36:25

标签: javascript editor monaco-editor language-server-protocol

有没有办法只显示文档的一部分,或者在模型的摩纳哥案例中显示,同时仍然对整个文档有智能感知?

我只希望用户编辑文档的一部分,但是该用户应该能够获得正确的上下文智能。

对于我的用例而言,最好隐藏无法编辑的部分,但是也可以将其停用。

如果无法做到这一点,是否有任何嵌入式编辑器可以做到这一点,或者可以通过修改语言服务器来实现?

1 个答案:

答案 0 :(得分:0)

摩纳哥编辑器将每一行作为容器加载到类名称为“ view-lines”的部分下。加载编辑器内容后,将要隐藏的每一行的相应容器设置为“ display:none”。

实施:https://jsfiddle.net/renatodc/s6fxedo2/

let value = `function capitalizeFirstLetter(string) {
\treturn string.charAt(0).toUpperCase() + string.slice(1);
}

$(function() {
\tlet word = "script";
\tlet result = capitalizeFirstLetter(word);
\tconsole.log(result);
});
`
let linesToDisable = [1,2,3];
let editor = monaco.editor.create(document.getElementById('container'), {
    value,
    language: 'javascript',
    theme: 'vs-dark',
    scrollbar: {
      vertical: "hidden",
      handleMouseWheel: false
    },
    scrollBeyondLastLine: false
});

// onLoad event for Monaco Editor: https://github.com/Microsoft/monaco-editor/issues/115
let didScrollChangeDisposable = editor.onDidScrollChange(function() {
    didScrollChangeDisposable.dispose();
    setTimeout(function() {
      $(".monaco-editor .view-lines > div").each(function(i) {
        if(linesToDisable.includes(i+1)) {
          $(this).css("display","none");
          $(this).css("pointer-events","none");
        }
      });
    },1000);
 }); 

从摩纳哥滚动将再次渲染线条并破坏实现。为了避免这种情况,请禁用摩纳哥的滚动功能,为编辑器容器设置固定的高度,然后使用浏览器或父容器进行滚动。

如果使用箭头键“上”或“下”导航到隐藏的内容,则光标仍将起作用,并且键入将破坏实现。您也许可以使用编辑器的onKeyDown事件来防止这种情况。

如果您正在寻找一种防破坏的实现,我建议仅将您希望编辑的文档部分加载到Monaco编辑器中。然后如以下示例所示扩展完成提供程序(Intellisense):https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-completion-provider-example

monaco.languages.registerCompletionItemProvider('javascript', {
    provideCompletionItems: function(model, position) {
        return {
            suggestions: [
                {
                    label: "capitalizeFirstLetter",
                    kind: monaco.languages.CompletionItemKind.Method,
                    documentation: "Capitalize the first letter of a word",
                    insertText: "capitalizeFirstLetter("
                }
            ]
        };
    }
});

monaco.editor.create(document.getElementById("container"), {
    value: `$(function() {
\tlet word = "script";
\tlet result = capitalizeFirstLetter(word);
\tconsole.log(result);
});
  `,
    language: "javascript"
});

使用诸如Esprima之类的AST解析器从您的源文档中获取标识符,然后将其插入建议数组中。

相关问题