Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加到ace编辑器智能自动完成:列出用户定义的函数和变量(javascript语言)_Javascript_Autocomplete_Ace Editor - Fatal编程技术网

添加到ace编辑器智能自动完成:列出用户定义的函数和变量(javascript语言)

添加到ace编辑器智能自动完成:列出用户定义的函数和变量(javascript语言),javascript,autocomplete,ace-editor,Javascript,Autocomplete,Ace Editor,我想将用户定义的函数和变量列表添加到ace编辑器的自动完成中。 为此,我想检查用户插入到文档中的所有代码,找到定义的函数(及其参数)、定义的变量及其作用域,等等 主要问题 这些数据是不是已经在ace源代码(或语言插件)的某个地方计算过了,我可以用某种方式获取` 我想要什么 例如,如果用户插入如下代码: var var0 = 'abcd'; function foo(var1, var2){ var var3 = 'efg'; } 我想在自动完成框中添加一个名为“foo”的函数,它有两个参

我想将用户定义的函数和变量列表添加到ace编辑器的自动完成中。 为此,我想检查用户插入到文档中的所有代码,找到定义的函数(及其参数)、定义的变量及其作用域,等等

主要问题

这些数据是不是已经在ace源代码(或语言插件)的某个地方计算过了,我可以用某种方式获取`

我想要什么

例如,如果用户插入如下代码:

var var0 = 'abcd';

function foo(var1, var2){
  var var3 = 'efg';
}
我想在自动完成框中添加一个名为“foo”的函数,它有两个参数-var1和var2。我还想将var0添加到变量列表中,并在用户在其定义的范围内(在函数中)写入时添加var3

我已经知道的

  • 我知道如何启用自动完成和实时自动完成
  • 我知道怎么做
  • 我知道,内置的基本自动完成添加文件中的所有字不分青红皂白
  • 我知道,我不想用它。目前,它仍然很粗糙,文档较少,我不知道如何启用它
  • 我知道,Ace已经有了我正在寻找的一些数据。例如,当一个变量已经在同一范围内定义时,它会发出警告。所以它有一个变量列表和它们的范围。我猜它是在使用jshint,但是有没有办法从那里获取它呢
  • 我阅读并找到了很多有用的方法,如果必要的话,我可以用来提取数据。问题是我是否真的需要自己做这件事

更新:我在回答中暗示了这一点,但为了澄清,Tern将完全按照您在我想要什么中提出的要求行事。下面的代码片段解决了另外一个问题,即提供一些您甚至不希望用户在编辑器中看到的上下文。查看您在中使用的代码的屏幕截图

这是有意见的,但在我看来,在ace中添加自动完成的最佳选择是

Tern接受typedef配置选项(此处描述:),但更有趣的是,它将接受您的自定义js对象作为子对象,即:

var myContext = {
   name: 'myContext',
   obj: obj
}
其中,
obj
是您的js对象。然后在Tern配置中,您将其用作:

定义:[“下划线”,myContext]

它将使用自定义对象和下划线模块进行自动完成

Tern相关的ace.js配置:(有关配置选项的注释,请参阅)


你读到了吗:我还建议你查看问题,并拉取请求(打开/关闭)。例如:是的,我阅读了wiki页面,并在github问题/PR中搜索。谢谢。非常感谢。看起来很有希望。
  var myContext = { ... }

  var editor = ace.edit("editor");
    editor.getSession().setUseWorker(true);

    ace.config.loadModule('ace/ext/tern', function () {
        editor.setOptions({
            enableTern: {
                defs: ['browser', 'ecma5', myContext],
                plugins: {
                    doc_comment: {
                        fullDocs: true
                    }
                },                    
                useWorker: true,                    
                startedCb: function () {
                    console.log('editor.ternServer:', editor.ternServer);
                },
            },
            enableSnippets: true,
            enableBasicAutocompletion: true,
        });
    });