3

tern用来为运行 的窗口提供一些增强的智能感知CodeMirror,它工作正常,但我有一个问题,我想添加一些自定义“ 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只是说nope nope nope什么,什么都不做。我已经尝试了几个小时,并且已经真正挖掘了源代码,但无法真正找到一种方法来组成我自己的类型。我想简单地给这个特定代码编辑器的用户(它不会是“完全”的 javascript,它将是 javascript,但有一些愚蠢的文字,因为它们不是编码器)一些简单的标志,使其更容易在他们。

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

更新

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

我也在使用默认的 ternecma5.jsonjquery.jsondef 文件。在这里可以找到它们;

https://github.com/marijnh/tern/blob/master/defs/ecma5.json https://github.com/marijnh/tern/blob/master/defs/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"
    }
}

发生了什么是以下屏幕。

ctrl+space 将字符定义为类型

现在我试图追查这一点,我发现了一个typeToIconaddons/tern.js(不是实际的 tern 文件,插入 codemirror 的插件文件)中调用的函数

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,我也从未看到控制台输出,所以它告诉我没有到达此代码。我不得不走得更远。

我找到了一个名为TypeParserin的函数def.js,它是实际 tern 下载的一部分。

  var TypeParser = exports.TypeParser = function (spec, start, base, forceNew) {
    this.pos = start || 0;
    this.spec = spec;
    this.base = base;
    this.forceNew = forceNew;
  };

将控制台日志放在这里给了我一些结果,它们看起来像许多可用的类型,并且在jquery.json和中定义ecma5.json

据我所知,我完全不知道如何进行。

4

2 回答 2

1

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

于 2014-04-02T12:50:01.090 回答
0

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

然后通过更改 Hint 小部件自定义提示功能以提供类似的界面。

如果你真的想实现这个功能,你最好像我建议的那样实现自己的模块,以便完全控制在你手中。

于 2014-04-03T14:00:09.860 回答