2012-10-22 80 views
8

當Eclipse允許我在使用Tab鍵的方法調用中的參數之間跳轉時,我很喜歡。我希望我的插件提供類似的功能。準確地說,我在編輯器中注入了一些文本,我想突出顯示特定的語法,並讓程序員使用Tab鍵跳轉到下一個匹配項。以編程方式添加Java代碼模板

這裏是一個例子。讓我們假設我動態創建下面的代碼片段:

String a = "bogus string"; 
int i = a.[?] 

我將注入到這一點的編輯器,我想那[?]被突出顯示,並準備修改(用戶可以鍵入length())。此外,如果有更多[?]碎片,我希望用戶使用Tab移動到下一個碎片。

經過研究,我發現它可以使用templates來完成。但是,我無法在網上找到任何相關示例。有沒有人有這方面的經驗?

UPDATE:

我發現了兩個環節,雖然我仍然沒能拿出一個解決方案,可能是有用的。

link one

link two

回答

8

樣品處理器代碼:

AbstractTextEditor activeEditor = 
     (AbstractTextEditor) HandlerUtil.getActiveEditor(event); 

ISourceViewer sourceViewer = 
     (ISourceViewer) activeEditor.getAdapter(ITextOperationTarget.class); 

Point range = sourceViewer.getSelectedRange(); 

// You can generate template dynamically here! 
Template template = new Template("sample", 
     "sample description", 
     "no-context", 
     "private void ${name}(){\r\n" + 
     "\tSystem.out.println(\"${name}\")\r\n" 
     + "}\r\n", true); 

IRegion region = new Region(range.x, range.y); 
TemplateContextType contextType = new TemplateContextType("test"); 
TemplateContext ctx = 
    new DocumentTemplateContext(contextType, 
     sourceViewer.getDocument(), 
     range.x, 
     range.y); 

TemplateProposal proposal 
    = new TemplateProposal(template, ctx, region, null); 

proposal.apply(sourceViewer, (char) 0, 0, 0); 

結果:

enter image description here

我建議你使用org.eclipse.jdt.ui.javaCompletionProposalComputer擴展。它可以讓你以更合法的方式提供模板。

在我的代碼中,由於無法合法獲得ISourceViewer,所以存在黑客行爲。我知道ISourceViewer本身就是ITextTargetOperation,但它不是API(Illegal Casting)。並且模板旨在設計爲由TemplateCompletionProcessorTemplateCompletionProposalComputer使用。

+0

工程就像一個魅力! – bellpeace

1

我不是很確定你想要什麼,但你可以做你想要什麼樣的模板。例如,打開Java編輯器,將光標放在方法中,鍵入arraya然後ctlr-space,然後從彈出菜單中選擇arrayadd。你會得到一個帶有高亮字符串的模板,按Tab跳轉到下一個變量。模板源中可以看出,

首選項 - >爪哇 - >編輯 - >模板

${array_type}[] ${result:newName(array)} = new ${array_type}[${array}.length + 1]; 
System.arraycopy(${array}, 0, ${result}, 0, ${array}.length); 
${result}[${array}.length]= ${var}; 

一切開始一個$是一個變量,你可以填,你可以一邊變量之間的標籤填寫模板。

+0

是的,這是模板如何工作。不過,我正在開發一個插件,它將在運行時創建代碼片段。我正在嘗試瞭解如何在可能的情況下使用模板API,以便用戶可以在佔位符之間進行修改和導航。是否有更多信息希望我提供? – bellpeace

+0

最好的辦法是追蹤模板插件的來源,然後看看它是如何工作的。 – sbridges

+1

您是否檢查過org.eclipse.jface.text.templates.TemplateProposal?如果你想插入不使用內容輔助的片段,你也可以檢查TemplateProposal#apply()方法。 – jeeeyul

0

我的回答是基於jeeeyul的回答。不同之處在於我不僅需要模板本身,還需要導入以自動解析和添加。這可以通過以下方式完成,使用JDT的東西:

AbstractTextEditor activeEditor = 
      (AbstractTextEditor) HandlerUtil.getActiveEditor(event); 
    if (activeEditor == null) { 
     return null; 
    } 
    ITypeRoot element = EditorUtility.getEditorInputJavaElement(activeEditor, true); 
    if (element == null) { 
     return null; 
    } 
    ICompilationUnit unit = element.getAdapter(ICompilationUnit.class); 
    if (unit == null) { 
     return null; 
    } 
    ISourceViewer sourceViewer = (ISourceViewer) activeEditor.getAdapter(ITextOperationTarget.class); 
    Point range = sourceViewer.getSelectedRange(); 
    // You can generate template dynamically here! 
    Template template = new Template("new List", "Add new list creation", JavaContextType.ID_STATEMENTS, 
      "List<${type}> ${name:newName(java.util.List)} = new ArrayList<${type}>();${:import(java.util.List, java.util.ArrayList)}", 
      true); 
    IRegion region = new Region(range.x, range.y); 
    JavaContextType contextType = new JavaContextType(); 
    contextType.setId(JavaContextType.ID_STATEMENTS); //Set context type, for which we apply this template 
    contextType.addResolver(new ImportsResolver("import","import")); //Add imports resolver if we want imports to be added automatically for some template 
    CompilationUnitContext ctx = new JavaContext(contextType, sourceViewer.getDocument(), range.x, 
      range.y, unit); 
    TemplateProposal proposal = new TemplateProposal(template, ctx, region, null); 
    proposal.apply(sourceViewer, (char) 0, 0, 0); 
相關問題