带有Tern的CodeMirror - 使用Javascript Intellisense自定义“类型”

时间:2014-03-30 10:55:00

标签: javascript codemirror tern

我正在使用tern为与CodeMirror一起运行的窗口提供一些增强的智能感知,并且它工作正常,但我遇到了一个问题,我想添加一些自定义“{{ 1}}“,可以这么说,以便在下拉列表中可以有旁边的图标。我把代码缩小了一点......

types定义文件中,类似似乎是使用.json指令声明的,就像这样;

!type

这些与 "Infinity": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Infinity", "!doc": "A numeric value representing infinity." }, "undefined": { "!type": "?", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/undefined", "!doc": "The value undefined." } 略有对应,就像这样。

CSS

好吧,这一切都很好,很好。我可以设计那些,没问题。但是我想添加一些我自己的,并且我很难做到这一点。例如,如果我只是......

.CodeMirror-Tern-completion-object:before {
    content: "O";
    background: #77c;
}
.CodeMirror-Tern-completion-fn:before {
    content: "F";
    background: #7c7;
}
.CodeMirror-Tern-completion-array:before {
    content: "A";
    background: #c66;
}
.CodeMirror-Tern-completion-number:before {
    content: "1";
    background: #999;
}

这只会导致整件事不起作用;和 "Character": { "!type": "entity", "!url": "some-url", "!doc": "This is a character entity." }, "User": { "!type": "user", "!url": "some-url-again", "!doc": "This is a user entity." } 一样,只是说tern而且什么都不做。我已经尝试了几个小时,并且已经真正挖掘了源代码,但是无法真正找到一种方法来构建我自己的类型。我想简单地给这个特定代码编辑器的用户(这不是'完全'javascript,它将是javascript,但有一些愚蠢的文字,因为它们不是编码器)一些简单的标志,使它更容易在他们身上。

欢迎任何建议!谢谢你的时间。

更新

根据用户的要求,我发布了更多代码以尝试获得更多帮助。这就是我要的;我有一个nope nope nope文件,用于定义对象的布局。该对象将镜像实际的C#对象/数据库对象。 (那部分并不重要,只知道我有一个特定的模型)

我还使用默认的tern .jsonecma5.json def文件。他们在这里找到;

https://github.com/marijnh/tern/blob/master/defs/ecma5.json https://github.com/marijnh/tern/blob/master/defs/jquery.json

因此,当用户点击jquery.json并看到CTRL+SPACE时,我希望它旁边有一个[CHARACTER]类型。所以我认为第一步是将字符指定为类型。

CHARACTER

character.json

以下屏幕发生了什么。

ctrl+space with character as defined type

现在我试图追踪它,我在"character": { "!type": "Character", "!doc": "Represents the character model.", "Coefficients":{ "!doc": "The coefficients that govern many of the calculative formulas" } } 中发现了一个名为typeToIcon的函数(不是实际的tern文件,插入到代码镜像中的插件文件)

addons/tern.js

所以我虽然function typeToIcon(type) { var suffix; if (type == "?") suffix = "unknown"; else if ( type == "number" || type == "string" || type == "bool" ) suffix = type; else if (/^fn\(/.test(type)) suffix = "fn"; else if (/^\[/.test(type)) suffix = "array"; else suffix = "object"; return cls + "completion " + cls + "completion-" + suffix; } ,所以我想我可以在这里添加我的类型。

我在函数中添加AHA! This is it!!以查看输出结果。这从未被解雇过,即使我点击console.log(type);,我也从未看过控制台输出,因此它告诉我没有达到此代码。我不得不退后一步。

我在CTRL+SPACE中搜索了一个名为TypeParser的函数,这是实际燕鸥下载的一部分。

def.js

在这里放置一个控制台日志给了我一些结果,它们看起来像许多可用的类型,并且在 var TypeParser = exports.TypeParser = function (spec, start, base, forceNew) { this.pos = start || 0; this.spec = spec; this.base = base; this.forceNew = forceNew; }; jquery.json中定义。

据我所知,我完全不知道如何继续。

2 个答案:

答案 0 :(得分:1)

样式由CodeMirror Tern插件处理,该插件仅识别原始JS类型。定义JSON定义文件时,您不能仅使用随机字符串作为类型 - 您必须使用引用JS环境中的实际变量的名称或原始类型(string,{{1}等等)。

答案 1 :(得分:0)

由于您的问题太具体而且无法由CodeMirror提供,因此始终有一条出路。 我从您提供的代码中了解到,您可以识别"用户","实体"语言模式中的其他自定义数据类型例如:(" javascript.js")并将其类型存储在本地/全局变量列表中。

然后通过更改Hint小部件来定制提示函数以提供类似的界面。

如果你真的想要实现这个功能,你应该像我建议的那样更好地实现自己的模块,这样你就可以完全控制。