如何在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.isJavaIdentifierStartCharacter.isJavaIdentifierPart或使用库来实现此目的。

使用其他答案的输入,我得到了以下解决方案:

 @Override public void setActiveEditor(IAction action, IEditorPart editorPart) { ((CompilationUnitEditor) editorPart).getViewer().addTextListener(new ITextListener() { @Override public void textChanged(TextEvent event) { selectedText = event.getText(); } }); }