Eclipse orion 代码完成
Eclipse orion code completion
我在某处读到 orion 使用 tern 来完成 JavaScript 的代码,但是在 运行 服务器之后,创建一个 js 文件然后创建另一个文件,另一个文件不知道第一个文件。
似乎补全只适用于当前打开文件中定义的符号。
有没有一种方法可以在 orion 中配置 tern,使其产生一些有用的完成而不是没有任何实际价值的工作演示?
Orion 几周前(2015 年 4 月中旬)才搬到 Tern 寻求内容协助提案。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=432940
我们正在努力启用多文件支持。
我已经实现了一个 hack,可以使用 .tern-config 文件为特定项目加载文件。
它不适用于包含 * 的值,因为这需要更改服务器。
这只是一个简单的 hack,很容易破解,但目前适合我。
以下是我如何更改版本 9 build 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,在某些情况下可能会中断)
我在某处读到 orion 使用 tern 来完成 JavaScript 的代码,但是在 运行 服务器之后,创建一个 js 文件然后创建另一个文件,另一个文件不知道第一个文件。
似乎补全只适用于当前打开文件中定义的符号。
有没有一种方法可以在 orion 中配置 tern,使其产生一些有用的完成而不是没有任何实际价值的工作演示?
Orion 几周前(2015 年 4 月中旬)才搬到 Tern 寻求内容协助提案。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=432940
我们正在努力启用多文件支持。
我已经实现了一个 hack,可以使用 .tern-config 文件为特定项目加载文件。
它不适用于包含 * 的值,因为这需要更改服务器。
这只是一个简单的 hack,很容易破解,但目前适合我。
以下是我如何更改版本 9 build 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,在某些情况下可能会中断)