2012-12-10 73 views
2

我正在为eclipse制作自己的PowerShell编辑器插件。目前编辑器有一个很好的代码突出显示。但为了能够制作出好的大纲视图和格式,我需要一个很好的文档分区。所以我创建的分区扫描仪(扩展RuleBasedPartitionScanner)目前只有两个规则:Eclipse插件扫描器和分区扫描器

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

其实, 这解决了我的问题。在我的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插件中找到。

+0

你能告诉什么是调试分区器,它的作用是什么? [你为什么需要分区和分区调解](http://blog.darevay.com/2007/11/the-eclipse-reconciler/comment-page-1/#comment-33203)? – Val

3

我认为错误在于定义你想要突出的事情重复的规则。看起来你有在PowershellScanner中定义的PowershellPartitionScanner中定义的规则。

不要使用PowershellScanner突出显示这些分区规则,而是使用单独的扫描程序来达到此目的。

1.首先从PowershellPartitionScanner中定义的PowershellScanner中删除重复的规则。

2.然后定义一个扫描器突出分区(例如,从Eclipse的样本 “SampleJavaEditor”)

class SingleTokenScanner extends BufferedRuleBasedScanner { 
    public SingleTokenScanner(TextAttribute attribute) { 
     setDefaultReturnToken(new Token(attribute)); 
    } 
} 

修改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; 
+0

非常感谢!我也担心重复规则会干扰,问题在于我对突出显示和分区有相同的规则。我的解决方案在上面。您的评论将不胜感激。 –