Eclipse插件扫描程序和分区扫描程序

时间:2012-12-10 18:18:35

标签: eclipse eclipse-plugin eclipse-rcp

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

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

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

我错过了什么吗?

由于

2 个答案:

答案 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插件中找到的。