2012-10-22 36 views
8

Tôi thích khi Eclipse cho phép tôi chuyển đổi giữa các tham số trong một cuộc gọi phương thức bằng cách sử dụng phím Tab. Tôi muốn plugin của tôi cung cấp chức năng tương tự. Để được chính xác, tôi đang tiêm một số đoạn văn bản vào trình soạn thảo và tôi muốn làm nổi bật cú pháp cụ thể và để cho lập trình viên nhảy đến kết quả tiếp theo bằng cách sử dụng phím Tab.Thêm mẫu mã Java theo lập trình

Đây là một ví dụ. Cho phép cho rằng tôi tự động tạo ra các đoạn mã sau:

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

tôi sẽ bơm đó vào trình soạn thảo và tôi muốn rằng [?] được nhấn mạnh và sẵn sàng cho sửa đổi (người dùng có thể gõ length()). Hơn nữa, nếu có nhiều hơn [?] đoạn, tôi muốn người dùng sử dụng Tab để chuyển sang tab tiếp theo.

Sau khi nghiên cứu một chút, tôi thấy rằng nó có thể được thực hiện bằng cách sử dụng templates. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ có liên quan nào trên Web. Có ai có kinh nghiệm với điều này?

UPDATE:

tôi thấy hai liên kết có thể có ích, mặc dù tôi vẫn không thể tìm ra một giải pháp.

link one

link two

Trả lời

8

mẫu Handler Codes:

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); 

Kết quả:

enter image description here

tôi đề nghị bạn sử dụng org.eclipse.jdt.ui.javaCompletionProposalComputer mở rộng. Nó cho phép bạn có thể đóng góp Template theo cách hợp pháp hơn.

Trong mã của tôi, có nhiều lỗi vì không có cách nào để nhận ISourceViewer hợp pháp. Tôi biết ISourceViewerITextTargetOperation chính nó, nhưng nó không phải là API (Đúc bất hợp pháp). Và Mẫu được thiết kế để được sử dụng bởi TemplateCompletionProcessor hoặc TemplateCompletionProposalComputer.

+0

Hoạt động như một sự quyến rũ! – bellpeace

1

Tôi không hoàn toàn chắc chắn những gì bạn muốn, nhưng bạn có thể làm những gì bạn muốn với các mẫu.

Ví dụ: mở trình chỉnh sửa java, đặt con trỏ vào bên trong phương thức, nhập arraya rồi nhấn ctlr-space và chọn arrayadd từ trình đơn bật lên. Bạn sẽ nhận được một mẫu có Chuỗi được đánh dấu, nhấn tab nhảy tới biến tiếp theo. Nguồn mẫu có thể được nhìn thấy trong,

Preferences -> java -> editor -> Mẫu

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

Tất cả mọi thứ bắt đầu một $ là một biến mà bạn có thể điền vào, và bạn có thể tab giữa các biến trong khi điền vào mẫu.

+0

Vâng, đây là cách mẫu hoạt động. Tuy nhiên, tôi đang phát triển một plugin sẽ tạo đoạn mã trên thời gian chạy. Tôi đang cố gắng tìm hiểu cách, nếu có thể, hãy sử dụng API mẫu để người dùng có thể sửa đổi và điều hướng giữa các trình giữ chỗ. Có thêm một số thông tin mà bạn muốn tôi cung cấp không? – bellpeace

+0

Đặt cược tốt nhất là theo dõi nguồn của plugin mẫu và xem cách nó hoạt động như thế nào. – sbridges

+1

Bạn đã kiểm tra org.eclipse.jface.text.templates.TemplateProposal chưa? Nếu bạn muốn chèn đoạn mã không sử dụng hỗ trợ nội dung, bạn cũng có thể kiểm tra phương thức TemplateProposal # apply(). – jeeeyul

0

Câu trả lời của tôi dựa trên câu trả lời của jeeeyul. Sự khác biệt là tôi không chỉ muốn có bản thân mẫu, mà còn phải nhập khẩu cho nó để được giải quyết và tự động thêm vào.Điều này có thể được thực hiện theo cách sau, sử dụng các công cụ 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); 
Các vấn đề liên quan