带Tern的CodeMirror-定制“;“类型”;使用Javascript Intellisense
我正在使用带Tern的CodeMirror-定制“;“类型”;使用Javascript Intellisense,javascript,codemirror,tern,Javascript,Codemirror,Tern,我正在使用tern为运行codemirr的窗口提供一些增强的智能感知,它工作得很好,但我遇到了一个问题,我想添加一些自定义的“类型”,这样在下拉列表中它们旁边就可以有图标。我把代码缩小了一点 在.json定义文件中,类型似乎是使用声明的!键入指令,如下所示 "Infinity": { "!type": "number", "!url": "https://developer.mozill
tern
为运行codemirr
的窗口提供一些增强的智能感知,它工作得很好,但我遇到了一个问题,我想添加一些自定义的“类型
”,这样在下拉列表中它们旁边就可以有图标。我把代码缩小了一点
在.json
定义文件中,类型似乎是使用声明的!键入指令,如下所示
"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.json
和jquery.json
def文件。它们在这里被发现
因此,当用户点击CTRL+SPACE
并看到CHARACTER
时,我希望它旁边有一种[CHARACTER
]类型。所以我认为第一步是指定character作为类型
character.json
下面的屏幕显示了发生的情况
现在我试图找到这个,我在addons/tern.js
中发现了一个名为typeToIcon
的函数(不是实际的tern文件,是插入codemirror的插件文件)
所以我想啊哈!就是这样代码>,所以我想我可以在这里添加我的类型
我添加了console.log(类型)代码>到函数,查看输出是什么样的。但这从未触发过,即使在我点击CTRL+SPACE
时,我也从未看到控制台输出,因此它告诉我未到达此代码。我得往回走
我在def.js
中找到了一个名为TypeParser
的函数,这是实际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
中定义的
就我所知,我完全不知道如何进行。样式由CodeMirror Tern插件处理,它只识别原始JS类型。定义JSON定义文件时,不能只使用随机字符串作为类型,必须使用引用JS环境中实际变量的名称或基本类型(string
,number
,等等)。因为您的问题太具体,CodeMirror无法提供,所以总有出路。
从您提供的代码中我了解到,您可以在语言模式下识别“user”、“entity”和其他自定义数据类型,例如:((“javascript.js”),并将它们的类型存储在本地/全局变量列表中
然后通过更改提示小部件定制提示功能,以提供类似的界面
如果你真的想实现这个功能,你最好像我建议的那样实现自己的模块,这样你就可以完全控制了。没有办法附加这个并让它相信还有其他原始类型?我知道这看起来很荒谬,请理解我不想实际创建新类型。我正在为一个需要一些轻量级脚本的网站制作这个“编辑器”,而使用它的工作人员不知道如何编程。他们不是那种人。我正在使用我所能使用的每一种工具,使脚本“界面”对他们尽可能友好,这样他们就不会那么困惑了。能够给诸如[字符]
,[动作]
等事物贴上标签,将大大减轻他们所承受的压力。他们看到“对象”“功能”等,只是感到困惑。有时候我可以指导他们,但用户始终是最终产品中最重要的部分。这也是我采取的方法,我认为这会奏效。但是在这个过程中的某个时刻,试图偏离javascrpt原语只会导致tern
系统完全无法运行。我甚至不能得到一条错误消息,一个控制台输出,任何东西。那么你一定是在某个地方破坏了流程,你应该调试那个部分。我觉得这将是最好的方法,如果您提供一些您尝试过的代码,我们将非常乐意帮助您。我非常感激。我真的很想得到一些帮助。这让我沮丧得流下了眼泪。我将尝试在一个小时左右提供更多的代码。我将在前言中说明我对tern
的了解为0。我知道我从源代码中获得了什么,JavaScript已经是我最薄弱的语言了。请稍等,我看看我能展示什么,可以展示更多。什么样的代码对你有帮助?嘿@djadmin,我已经添加了更多我可以添加的代码。如果没有用,我很抱歉。我不知道我在做什么。我无法理解您的方法,但据我所知,您应该根据需要修改emacs.json文件,然后尝试用您的方法加载修改后的json
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;
}
var TypeParser = exports.TypeParser = function (spec, start, base, forceNew) {
this.pos = start || 0;
this.spec = spec;
this.base = base;
this.forceNew = forceNew;
};