【问题标题】:CodeMirror with Tern - Custom "Types" with Javascript IntellisenseCodeMirror with Tern - 使用 Javascript Intellisense 自定义“类型”
【发布时间】:2014-03-30 10:55:00
【问题描述】:

我正在使用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# 对象/数据库对象。 (那部分不重要,只知道我有具体型号)

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

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"
    }
}

发生了什么是以下屏幕。

现在我试图追踪它,我在addons/tern.js 中发现了一个名为typeToIcon 的函数(不是实际的 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,我也从未看到控制台输出,所以它告诉我没有到达此代码。我不得不走得更远。

我在def.js 中找到了一个名为TypeParser 的函数,它是实际燕鸥下载的一部分。

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

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

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

【问题讨论】:

  • 刚刚碰到这个问题,想知道您是如何解决问题的?

标签: javascript codemirror tern


【解决方案1】:

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

【讨论】:

  • 没有办法附加这个并让它相信还有其他原始类型吗?
  • 我知道这看起来很荒谬,请理解我并不想真正制作新类型。我正在为需要一些轻量级脚本的网站制作这个“编辑器”,而使用它的工作人员不知道如何编程。他们只是不是那种人。我正在使用我可以使用的所有工具使脚本“界面”对他们尽可能友好,以减少他们的困惑。能够标记[CHARACTER][ACTION] 等内容,将大大减轻他们所承受的压力。
  • 他们看到“对象”“功能”等,只是感到困惑。有时我可以通过它指导他们,但用户始终是最终产品中最重要的部分。
【解决方案2】:

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

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

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

【讨论】:

  • 看看这也是我采用的方法,认为它会起作用。但在此过程中,尝试偏离 javascrpt 原语只会导致tern 系统完全无法运行。我什至无法收到错误消息、控制台输出等任何内容。
  • 那你一定是在某处中断了流程,你应该调试那部分。我觉得这将是最好的方法,如果您提供一些您尝试过的代码,我们真的很乐意为您提供帮助。问候
  • 我非常感谢。我真的很想得到一些帮助。这让我因沮丧而落泪。我将尝试在一小时左右提供更多代码。我先声明一下,我对tern 的了解为 0。我知道我通过阅读源代码获得了什么,而 JavaScript 已经是我最弱的语言了。请稍等,当我看到我可以展示的内容可能会展示更多内容时。什么样的代码对你有帮助?
  • 嘿@djadmin,我已经添加了更多我可以添加的内容。如果没用,我很抱歉。我不知道我在做什么。 i.imgur.com/TyB2zXI.jpg
  • 我无法理解你的做法,但据我了解,你应该根据需要修改emacs.json文件,然后尝试用你的方法加载修改后的json。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多