【问题标题】:Eclipse orion code completionEclipse orion 代码完成
【发布时间】:2015-04-30 06:57:35
【问题描述】:

我在某处读到 orion 使用 tern 来完成 JavaScript 的代码,但在运行服务器后,创建一个 js 文件,然后创建另一个文件,另一个文件不知道第一个文件中的任何代码。

似乎补全只适用于当前打开的文件中定义的符号。

有没有办法在 orion 中配置 tern,这样它会产生一些有用的完成,而不是没有任何实际价值的工作演示?

【问题讨论】:

  • 代码辅助仅对从其他文件引入的完成有用吗?这是一个强大的功能,但我认为文件内表达式完成以及关键字和模板提案已经提供了很多真正的价值。

标签: code-completion tern eclipse-orion


【解决方案1】:

Orion 几周前(2015 年 4 月中旬)才搬到 Tern 提出内容辅助提案。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=432940

我们正在努力启用多文件支持。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=464821

【讨论】:

  • 我添加了一个答案,解释如何让它在每个项目基础上将文件添加到 tern 服务器。这是一种肮脏的技巧,但目前对我有用。继续努力,我很高兴看到这个项目,并希望看到它成长为一个优秀的 IDE。我将如何参与这个项目?也许有什么我可以帮忙的?至于代码辅助有用;抱歉,但是是的,如果它只适用于我正在编辑的当前文件,它对我来说没有多大用处。但是对于 IDE 来说,在我的项目中添加所有文件也会有点太多,因为这会导致大多数 IDE 运行缓慢.
【解决方案2】:

我已经实现了一个 hack,可以使用 .tern-config 文件为特定项目加载文件。

它不适用于包含 * 的值,因为这需要更改服务器。

这只是一个简单的 hack,很容易破解,但目前对我有用。

这是我如何更改版本 9 构建 S20150504-1254 的代码:

在 org.eclipse.orion.client.javascript_1.0.0.v20150504-1644.jar 中

文件:/web/javascript/handlers/ternOccurrencesHandler.js

function sortProposals if 语句检查文件是否是当前打开的文件 只需检查它是否是以 /file/ 开头的值

替换:

            if(_o === args.meta.location) {

与:

            if(/^\/file\//.test(_o)) {

查找函数 computeProposals 并在该函数之前添加以下代码:

function getFile(url){
    return new Promise(function(resolve,reject){
        var xhr = new XMLHttpRequest();
        xhr.open('GET',url);
        xhr.addEventListener("load", function(e){
            //@todo: have to check something I dont think this should be called on a 404 but it is
                console.log('ok, done:',xhr.responseURL);
                if(xhr.status!==200){
                    reject('file not found:',xhr.responseURL);
                    return;
                }
                resolve(xhr.responseText);
            }, false);
        xhr.addEventListener("error", function(e){
                console.log('an error:',e);
                reject(e);
            }, false);
        xhr.send();
    });
}
var loadFilesInTern = (function(){
    var loadedConfigs = [];
    var currentConfig = '';
    function loadJsFileIntoTernServer(fileName,ternserver){
        return getFile(fileName)
        .then(function resolve(val){
            ternserver.addFile(fileName,val);
        },function reject(err){
            console.log('an error:',fileName);
            return true;
        });
    }
    return function(location,ternserver){
        var p = new Promise(function(resolve){resolve(true);});
          rootPath = location.split('/').slice(0,4).join('/');
        console.log('got rootpath, trying to get tern-config from:',rootPath+'/.tern-config');
        return p
        .then(function(){
            if(!loadedConfigs[rootPath]){
                return getFile(rootPath+'/.tern-config');
            }else {
                return loadedConfigs[rootPath];
            }
        })
        .then(function(config){
            loadedConfigs[rootPath]=config;
            if(config===currentConfig){
                return;
            };
            currentConfig = config;
            var settings = JSON.parse(config);
            var promises = [];
            settings.loadEagerly.forEach(function(fileName){
                promises.push(loadJsFileIntoTernServer(rootPath + '/' + fileName,ternserver));
            });
            return Promise.all(promises);
        })
        .then(null,function reject(e){
            console.log('an error:',e);
            return true;
        });
        p.resolve('start');
    };
}());

在计算提案之前加载配置(第一次)

function computeProposals(ternserver, args, callback) {
    if(ternserver) {
        loadFilesInTern(args.meta.location,ternserver)
        .then(function(){
            console.log('ternserver is now:',ternserver);
           ternserver.request({
           //... rest of the computeProposals code
        });//close the then 
    } else {//original code from computeProposals
        callback({request: 'completions', proposals:[]});
    }

您可以在项目目录中创建一个 .tern-config 并添加 loadEagerly 文件:

{
  "libs": [
    "browser",
    "ecma5",
    "jquery"
  ],
  "loadEagerly": [
    "goog/base.js",
    "somefile.js",
    "another file.js"
  ],
  "plugins": {
    "requirejs": {
      "baseURL": "./",
      "paths": {}
    }
  }
}

此时会忽略库和插件,但会加载其他文件(请注意,这是一个简单的 hack,在某些情况下可能会中断)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2013-01-21
    • 2011-09-06
    • 1970-01-01
    • 2010-10-28
    • 2018-04-06
    相关资源
    最近更新 更多