如何在Eclipse中获取所选代码?
对于我的插件,我正在尝试访问CompilationUnitEditor中的选定代码。 因此,我添加了对上下文菜单的贡献并使用以下代码:
public class ContextMenuHandler implements IEditorActionDelegate { private IEditorPart editorPart; @Override public void setActiveEditor(IAction action, IEditorPart editorPart) { this.editorPart = editorPart; } @Override public void run(IAction action) { JavaUI.getEditorInputJavaElement(editorPart.getEditorInput()); } @Override public void selectionChanged(IAction action, ISelection selection) { if (selection instanceof TextSelection) { TextSelection text = (TextSelection) selection; System.out.println("Text: " + text.getText()); } else { System.out.println(selection); } } }
现在的问题是方法selectionChanged(…)仅在我真正选择某些内容时被调用,以便我可以复制/粘贴它。 但我想访问像这样突出显示的Code元素(这里我想得到“IEditorPart”)
不幸的是,我不知道我应该寻找什么。
你应该做这个:
((CompilationUnitEditor) editorPart).getViewer().getSelectedRange();
ISourceViewer
类有很多关于源位置和编辑器的有用且有趣的方法。 您可能还想查看JavaSourceViewer
。
编辑
看起来我没有完全回答你的问题。 问题是,只有当选择的长度> 0时才会调用selectionChanged事件。我不知道为什么会出现这种情况,但这就是动作委托一直工作的方式。
如果您希望在插入符更改时收到通知,则应该使用编辑器的查看器注册选择更改的侦听器。 做这样的事情:
((CompilationUnitEditor) editorPart).getViewer() .addSelectionChangedListener(mySelectionListener);
mySelectionListener
的类型为org.eclipse.jface.viewers.ISelectionChangedListener
。 以这种方式注册,应该为您提供您正在寻找的所有活动。 编辑关闭时要小心取消注册。
检测插入符当前位置会不会更容易。 拥有该位置可让您轻松检测插入符号是否在单词上(根据需要定义单词,例如空格分隔,java标识符或正则表达式)。
我不能在这里运行eclipse,但是我会使用CaretListener类来检测插入符号的移动,从而提取它下面的单词。 作为caretMoved
方法的参数给出的caretMoved
将包含偏移量。
CaretListener
可以附加到您的StyledText
组件的Adapter
,您可以从您的EditorPart
获取(暂时没有任何更多信息,因为我没有在这里运行eclipse)。
希望能帮助到你。
编辑:一些代码。
final StyledText text = (StyledText)editorPart.getAdapter(Control.class); text.addCaretListener(new CaretListener() { public void caretMoved(CaretEvent event) { int offset = event.caretOffset; String word = findWord(offset, text); if (word.length() > 0) { System.out.println("Word under caret: " + word); } } }); private String findWord(int offset, StyledText text) { int lineIndex = text.getLineAtOffset(offset); int offsetInLine = offset - text.getOffsetAtLine(lineIndex); String line = text.getLine(lineIndex); StringBuilder word = new StringBuilder(); if (offsetInLine > 0 && offsetInLine < line.length()) { for (int i = offsetInLine; i >= 0; --i) { if (!Character.isSpaceChar(line.charAt(i))) { word.append(line.charAt(i)); } else { break; } } word = word.reverse(); } if (offsetInLine < line.length()) { for (int i = offsetInLine; i < line.length(); ++i) { if (i == offsetInLine) continue; // duplicate if (!Character.isSpaceChar(line.charAt(i))) { word.append(line.charAt(i)); } else { break; } } } return word.toString(); }
这是一个简单的实现,可以根据光标周围的空格字符获取光标下的单词。 应该使用更强大的实现来检测有效的Java标识符等。例如,使用Character.isJavaIdentifierStart
和Character.isJavaIdentifierPart
或使用库来实现此目的。
使用其他答案的输入,我得到了以下解决方案:
@Override public void setActiveEditor(IAction action, IEditorPart editorPart) { ((CompilationUnitEditor) editorPart).getViewer().addTextListener(new ITextListener() { @Override public void textChanged(TextEvent event) { selectedText = event.getText(); } }); }