我正在使用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 .json
和ecma5.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
以下屏幕发生了什么。
现在我试图追踪它,我在"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
中定义。
据我所知,我完全不知道如何继续。
答案 0 :(得分:1)
样式由CodeMirror Tern插件处理,该插件仅识别原始JS类型。定义JSON定义文件时,您不能仅使用随机字符串作为类型 - 您必须使用引用JS环境中的实际变量的名称或原始类型(string
,{{1}等等)。
答案 1 :(得分:0)
由于您的问题太具体而且无法由CodeMirror提供,因此始终有一条出路。 我从您提供的代码中了解到,您可以识别"用户","实体"语言模式中的其他自定义数据类型例如:(" javascript.js")并将其类型存储在本地/全局变量列表中。
然后通过更改Hint小部件来定制提示函数以提供类似的界面。
如果你真的想要实现这个功能,你应该像我建议的那样更好地实现自己的模块,这样你就可以完全控制。