不知是不是Eclipse的生态策略和用户考虑,没有把MyEclipse那个Open in Explorer的小功能到整合到IDE。很多时候,是需要直接操作文件系统的。没有这个小功能,就只能:文件选中->右键快捷菜单Properties (Alt+Enter)->复制文件路径->Win+R->粘贴回车。这个是在Windows下的。如果经常打开命令行,以当前目录作为命令行的工作目录,还要手动输入CD命令,相当繁琐。于是就有了需求啦。在网上参考资料,最终效果图。为了简化操作,快捷键的必需的。这里我设了Ctrl +`和Ctril+1
代码和设定主要参考了下面的链接:
http://melord.iteye.com/blog/630339
http://www.ibm.com/developerworks/library/os-eclipse-3.3menu/
经过本人的阉割改造,plugin.xml设定如下
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <plugin> <extension point="org.eclipse.ui.commands"> <category id="welsney.floyd.eclipse.plugin.fsresource" name="File System"> </category> <command name="Open Directory" categoryId="welsney.floyd.eclipse.plugin.fsresource" id="welsney.floyd.eclipse.plugin.fsresource.openDir"> </command> <command name="Open Command" categoryId="welsney.floyd.eclipse.plugin.fsresource" id="welsney.floyd.eclipse.plugin.fsresource.openCmd"> </command> </extension> <extension point="org.eclipse.ui.menus"> <menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions"> <toolbar id="welsney.floyd.eclipse.plugin.fsresource.toolbar"> <command commandId="welsney.floyd.eclipse.plugin.fsresource.openDir" icon="icons/openHS.png" label="Open Directory" id="welsney.floyd.eclipse.plugin.fsresource.openDirMenuCommand"> </command> <command commandId="welsney.floyd.eclipse.plugin.fsresource.openCmd" icon="icons/MS-DOS.ico" label="Open Command" id="welsney.floyd.eclipse.plugin.fsresource.openCmdMenuCommand"> </command> </toolbar> </menuContribution> </extension> <extension point="org.eclipse.ui.handlers"> <handler commandId="welsney.floyd.eclipse.plugin.fsresource.openDir" class="filesystemresource.command.handler.OpenWinDirAction"> </handler> <handler commandId="welsney.floyd.eclipse.plugin.fsresource.openCmd" class="filesystemresource.command.handler.OpenWinCmdAction"> </handler> </extension> <extension point="org.eclipse.ui.bindings"> <key commandId="welsney.floyd.eclipse.plugin.fsresource.openDir" sequence="CTRL+`" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"> </key> <key commandId="welsney.floyd.eclipse.plugin.fsresource.openCmd" sequence="CTRL+1" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"> </key> </extension> </plugin>
事件响应处理Java Code如下,只把关键的获取文件路径的代码保留下来。
public abstract class AbstractFileSystemResourceAction extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchWindow window = HandlerUtil
.getActiveWorkbenchWindowChecked(event);
ISelection selection = window.getSelectionService().getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection).getFirstElement();
IResource resource = null;
if ((element instanceof IResource)) {
resource = (IResource) element;
} else if (element instanceof IAdaptable) {
resource = (IResource) ((IAdaptable) element)
.getAdapter(IResource.class);
}
if(resource != null) {
doExecute(resource.getLocation().toFile());
}
}
return null;
}
protected abstract void doExecute(File file);
}
编写具体执行的Action响应处理,如果不是目录的话,为了不把文件打开,做了特殊的处理。
public class OpenWinDirAction extends AbstractFileSystemResourceAction {
@Override
protected void doExecute(File file) {
if (file != null) {
if(file.isFile()) {
file = file.getParentFile();
}
try {
Runtime.getRuntime().exec("explorer.exe " + file.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
打开命令行的事件响应处理Action如下。Windows Platform的那条cmd命令有点闹心,折腾许久才把黑色小窗口给弄出来。
public class OpenWinCmdAction extends AbstractFileSystemResourceAction {
@Override
protected void doExecute(File file) {
if(file != null) {
if(file.isFile()) {
file = file.getParentFile();
}
try {
Runtime.getRuntime().exec("cmd /k start cd /d " + file.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}