我正在为eclipse制作自己的PowerShell编辑器插件。目前编辑器有一个很好的代码突出显示。但是为了能够制作出良好的大纲视图和格式,我需要一个好的文档分区。所以我现在只用两个规则创建了分区扫描器(扩展了RuleBasedPartitionScanner):
IToken psComment = new Token(PS_COMMENT);
IToken psFunction = new Token(PS_FUNCTION);
IPredicateRule[] rules = new IPredicateRule[2];
rules[0] = new EndOfLineRule("#", psComment);
rules[1] = new SingleLineRule("function", "{", psFunction);
setPredicateRules(rules);
我使用FastPartitioner创建了我的文档,并且需要所有内容类型(IDocument.DEFAULT_CONTENT_TYPE,PowershellPartitionScanner.PS_FUNCTION,PowershellPartitionScanner.PS_COMMENT)
为突出显示,我创建了一个扫描程序(扩展了RuleBasedScanner)。
在配置类中,我重写了getPresentrationReconciler:
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(
new PowershellScanner());
reconciler.setDamager(dr, PowershellPartitionScanner.PS_FUNCTION);
reconciler.setRepairer(dr, PowershellPartitionScanner.PS_FUNCTION);
dr = new DefaultDamagerRepairer(new PowershellScanner());
reconciler.setDamager(dr, PowershellPartitionScanner.PS_COMMENT);
reconciler.setRepairer(dr, PowershellPartitionScanner.PS_COMMENT);
dr = new DefaultDamagerRepairer(new PowershellScanner());
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
return reconciler;
我已经覆盖了:
@Override
public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
return new String[] { IDocument.DEFAULT_CONTENT_TYPE,
PowershellPartitionScanner.PS_COMMENT,
PowershellPartitionScanner.PS_FUNCTION };
}
我目前对我的文档进行了很好的分区。但没有代码突出显示。一切都是黑色的。
如果我没有对文档进行分区,则突出显示有效。
我错过了什么吗?
由于
答案 0 :(得分:3)
我认为错误在于为要突出显示的内容定义重复规则。看来你有PowershellPartitionScanner中定义的规则,也在PowershellScanner中定义。
请勿使用PowershellScanner突出显示这些分区规则,但为此目的使用单独的扫描程序。
1。首先从PowershellScanner中删除已经在PowershellPartitionScanner中定义的重复规则。
2. 然后定义扫描程序以突出显示分区(例如,从Eclipse示例“SampleJavaEditor”)
class SingleTokenScanner extends BufferedRuleBasedScanner {
public SingleTokenScanner(TextAttribute attribute) {
setDefaultReturnToken(new Token(attribute));
}
}
3. 在配置类中修改getPresentrationReconciler:
DefaultDamagerRepairer dr;
// General highlighting
dr = new DefaultDamagerRepairer(new PowershellScanner());
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
// Function partition
dr = new DefaultDamagerRepairer(
new SingleTokenScanner(
new TextAttribute(colorManager.getColor(new RGB(255, 0, 0)))
)
);
reconciler.setDamager(dr, PowershellPartitionScanner.PS_FUNCTION);
reconciler.setRepairer(dr, PowershellPartitionScanner.PS_FUNCTION);
// Comment partition
dr = new DefaultDamagerRepairer(
new SingleTokenScanner(
new TextAttribute(colorManager.getColor(new RGB(0, 255, 0)))
)
);
reconciler.setDamager(dr, PowershellPartitionScanner.PS_COMMENT);
reconciler.setRepairer(dr, PowershellPartitionScanner.PS_COMMENT);
return reconciler;
答案 1 :(得分:0)
实际上, 这解决了我的问题。在我的FileDocumentProvider扩展中添加了IDocumentExtension3。通过使用它我可以有两种类型的规则。
IDocument document = super.createDocument(element);
IDocumentExtension3 docExtension = (IDocumentExtension3) document;
if (document != null) {
IDocumentPartitioner partitioner = new DebugPartitioner(Activator
.getDefault().getPowershellPartitionScanner(),
new String[] { IDocument.DEFAULT_CONTENT_TYPE,
PowershellPartitionScanner.PS_FUNCTION,
PowershellPartitionScanner.PS_COMMENT });
partitioner.connect(document);
docExtension.setDocumentPartitioner(
Activator.POWERSHELL_PARTITIONING, partitioner);
}
return document;
解决方案是在PyDev eclipse插件中找到的。