2

我正在为 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 };
    }

我目前对我的文档进行了很好的分区。但是没有代码突出显示。一切都是黑色的。

如果我没有对文档进行分区,则突出显示有效。

我错过了什么吗?

谢谢

4

2 回答 2

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;
于 2012-12-12T01:35:40.607 回答
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 插件中找到。

于 2012-12-12T09:39:54.090 回答