- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 Eclipse 编写一个插件,它为我们的软件堆栈中使用的特定预处理器指令提供语法突出显示。在编译实际代码之前,这些会被外部程序替换(想象一个像 <% FOO %>
这样的标签被其他东西替换,比如版本字符串)。
所以插件为每个标签提供了注释以快速识别这些。不是实现自己的编辑器,而是为已经存在的编辑器(如 JavaEditor 或 PHP-Editor)提供注释。
现在的问题是外部程序处理的文件都具有相同的文件扩展名,比如 .inc
.它们可以包含 Java 代码或 PHP 代码(将来也可能包含其他语言)。
我已经成功地向我的插件添加了一个内容类型,我可以根据某些标准区分不同的文件。所以,当我有一个 java .inc
文件并分配内容类型 inc file (java)
.
但是,用户应该能够覆盖此自动检测(此外,有时自动检测可能会失败)。因此,我希望能够使用不同的编辑器(Java 编辑器、PHP 编辑器等)打开一个文件 ( foo.inc
) 并能够保存此关联。
我目前想到的方法:
最佳答案
我发现了如何覆盖文件打开操作:通过注册 actionProvider
覆盖 org.eclipse.ui.navigator.resources.OpenActions
.我提供了所有代码,因为将所有这些不同的东西放在一起并使其工作相对困难。
让我们从 plugin.xml 条目开始:
<!-- overwrite OpenActions -->
<extension
point="org.eclipse.ui.navigator.navigatorContent">
<actionProvider
class="myplugin.navigator.OpenActionProvider"
id="myplugin.navigator.actions.open"
overrides="org.eclipse.ui.navigator.resources.OpenActions"
priority="highest">
<enablement>
<and>
<instanceof
value="org.eclipse.core.resources.IFile">
</instanceof>
<test
property="org.eclipse.core.resources.extension"
value="frm">
</test>
</and>
</enablement>
</actionProvider>
</extension>
<extension
point="org.eclipse.ui.navigator.viewer">
<viewerActionBinding
viewerId="org.eclipse.ui.navigator.ProjectExplorer">
<includes>
<actionExtension
pattern="myplugin.navigator.actions.open">
</actionExtension>
</includes>
</viewerActionBinding>
</extension>
package myplugin.navigator;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionConstants;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
public class OpenActionProvider extends CommonActionProvider {
private OpenEditorActionGroup fOpenGroup;
@Override
public void init(ICommonActionExtensionSite site) {
ICommonViewerWorkbenchSite workbenchSite = null;
if (site.getViewSite() instanceof ICommonViewerWorkbenchSite) {
workbenchSite = (ICommonViewerWorkbenchSite) site.getViewSite();
}
if (workbenchSite != null) {
if (workbenchSite.getPart() != null && workbenchSite.getPart() instanceof IViewPart) {
IViewPart viewPart = (IViewPart) workbenchSite.getPart();
fOpenGroup = new OpenEditorActionGroup(viewPart);
}
}
}
@Override
public void dispose() {
if (fOpenGroup != null) {
fOpenGroup.dispose();
fOpenGroup = null;
}
super.dispose();
}
@Override
public void fillActionBars(IActionBars actionBars) {
if (fOpenGroup == null)
return;
fOpenGroup.updateActionBars();
actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, fOpenGroup.getOpenAction());
}
@Override
public void fillContextMenu(IMenuManager menu) {
if (fOpenGroup == null)
return;
fOpenGroup.fillContextMenu(menu);
}
@Override
public void setContext(ActionContext context) {
super.setContext(context);
if (fOpenGroup == null)
return;
fOpenGroup.setContext(context);
}
}
package myplugin.navigator;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.actions.OpenWithMenu;
import org.eclipse.ui.navigator.ICommonMenuConstants;
public class OpenEditorActionGroup extends AbstractActionGroup {
private OpenFileAction fOpenFileAction;
public OpenEditorActionGroup(IViewPart viewPart) {
super(viewPart);
}
@Override
protected void makeActions() {
fOpenFileAction= new OpenGenElementAction(getViewPart().getSite().getPage());
}
public static IStructuredSelection convertSelectionToResources(ISelection s) {
List<Object> converted = new ArrayList<Object>();
if (s instanceof StructuredSelection) {
Object[] elements = ((StructuredSelection) s).toArray();
for (int i = 0; i < elements.length; i++) {
Object e = elements[i];
if (e instanceof IResource) {
converted.add(e);
} else if (e instanceof IAdaptable) {
IResource r = (IResource) ((IAdaptable) e).getAdapter(IResource.class);
if (r != null) {
converted.add(r);
}
}
}
}
return new StructuredSelection(converted.toArray());
}
@Override
public void fillContextMenu(IMenuManager menu) {
System.out.println("fillcontextmenu");
if (getContext() == null)
return;
IStructuredSelection celements = (IStructuredSelection)getContext().getSelection();
IStructuredSelection selection = convertSelectionToResources(celements);
fOpenFileAction.selectionChanged(celements);
if (!fOpenFileAction.isEnabled())
return;
menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN, fOpenFileAction);
fillOpenWithMenu(menu, selection);
}
package myplugin.navigator;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.ActionGroup;
public abstract class AbstractActionGroup extends ActionGroup {
private final IViewPart fViewPart;
public AbstractActionGroup(IViewPart viewPart) {
Assert.isNotNull(viewPart);
fViewPart = viewPart;
makeActions();
}
protected IViewPart getViewPart() {
return fViewPart;
}
protected ImageDescriptor getImageDescriptor(String relativePath) {
return ImageDescriptor.createFromURL(null);
}
protected abstract void makeActions();
@Override
public abstract void fillContextMenu(IMenuManager menu);
@Override
public abstract void fillActionBars(IActionBars actionBars);
@Override
public abstract void updateActionBars();
}
package myplugin.navigator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.part.FileEditorInput;
public class OpenGenElementAction extends OpenFileAction {
private IFile selectedFile = null;
private final IWorkbenchPage workbenchPage;
public OpenGenElementAction(IWorkbenchPage page) {
super(page);
workbenchPage = page;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public void run() {
System.out.println("RUN");
}
@Override
protected boolean updateSelection(IStructuredSelection selection) {
if (selection.size() != 1)
return super.updateSelection(selection);
Object element = selection.getFirstElement();
if (element instanceof IFile) {
selectedFile = (IFile)element;
}
return selectedFile != null || super.updateSelection(selection);
}
}
关于eclipse-plugin - 使用不同编辑器处理相同文件扩展名的 Eclipse 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5728651/
我有一个 .crt 文件。打开那个文件,我看到它以开头 -----BEGIN CERTIFICATE----- 如何从这个文件生成这 2 个文件?: 以-----BEGIN CERTIFICATE R
我有一个文件被加载到 fd.ChosenName 并想知道是否有一个快速的解决方案,例如与 stringbuilder 相反的截断文件名(扩展名)以用于显示目的。因此,如果 fd.ChosenName
我的文件名如下:name1.csv,我想提取该字符串的两个子字符串。一种将 name1 存储在一个变量中,另一种将扩展名 csv 存储在另一个变量中,但不带点。 我一直在寻找是否有像 Java 的 i
我正在尝试找出一种方法来确定我在 struts2 应用程序中上传的文件的文件类型。我的应用程序可以读取 CSV 和 XML 文件并根据上传的文件类型执行操作。我将该文件作为“File”类的实例。该文件
如何使用 NLP/信息提取 (IE) 方法检测/找出首字母缩略词的含义(扩展名)? 我们希望检测自由文本中是否使用了单词或其首字母缩略词,并将其映射到相同的实体/标记。 大多数在线论文都是关于医学缩略
我正在编写一个 shell 脚本,该脚本需要改变其行为,并根据特定 X11 扩展的存在或不存在为被调用程序提供不同的选项。我有一个可行的解决方案,但我希望有一个更干净的解决方案。我愿意考虑一个简单的
我要查找文件名的扩展名,扩展名只能是3个字符。 有点像, filename = str(input("Please enter filename: ")) 然后我想执行一个任务来查找扩展名,如果扩展名
我正在开发一种文档管理系统。最终用户是企业级用户。 我目前仅检查并允许上传符合以下条件之一的文件: "png|jpe?g|gif|xls|doc|docx|csv|ppt|txt|pdf|rtf" 我
尝试将文件列表添加到 Jlist,然后过滤 JList 中的文件以仅返回 .txt 文件和固定字符长度。还尝试删除返回的文件路径,并仅在文件 JList 中显示文件名+扩展名。 到目前为止,除了删除文
File.py file = fields.Binary('File') @api.multi def get_file(self): if self.file: xsl_fi
我尝试使用导航 Controller 使我的应用程序处于纵向模式我收到此错误 iam usring Xcode7 and Swift 2 And Target System IOS 9.3 声明仅在文
这个问题在这里已经有了答案: Test whether a glob has any matches in Bash (22 个回答) 关闭去年。 您将如何使用 bash 判断目录中是否存在特定扩展名
我正在开发转换器服务,我使用 FFMPEG 转换视频。 我想检查输入文件,哪种真的是视频。 我使用以下命令并获取文件类型。但是如果文件已经被操作过就无法理解了: curl -s -o /dev/nul
我需要一个规则来添加 .html 扩展名,只要有“不”结尾的斜杠。 一个新客户最近更改了电子商务脚本,新版本以不同的方式处理 SEO,并更改了他们所有 16,000 多个产品链接。这在站点被重新索引之
我正在尝试使用 Kickstarter 进行扩展以覆盖页面的正常呈现,并呈现 PDF 文件。为此我使用 FPDF。但我不确定该怎么做。我尝试这样做,但没有成功: AddPage();
在寻找巴恩斯利蕨分形的实现时,我遇到了一个具有 .pde 扩展名的实现。哪种编程语言使用此扩展? Implementation Page 最佳答案 此代码来自Processing.org,一个基于Ja
Visual Studio Code (1.22.2) 提供了一个名为 .dockerfile 的文件扩展名。在保存对话框中。带有此扩展名的文件是什么? Dockerfile 包含在所有文档和示例中,
我正在为32位计算机编译一个应用程序,因为该应用程序的创建者将其设置为64位。我确保所有库和DLL都是32位的。但是,我在编译时遇到问题。当我使用sh make.sh进行编译时,当它进入GCC构建部分
当我将文件保存在 img/upload 文件夹中时,文件会以正确的文件扩展名保存。 但是,当我尝试下载该文件时,会附加一个 .htm 文件扩展名。 我怎样才能避免这种情况?我在下面添加了我的代码; V
GHC 有几种有用的语言 extensions用于机械派生各种常见的 Haskell 类型类(-XDeriveFunctor、-XDeriveFoldable、-XDeriveTraversable)
我是一名优秀的程序员,十分优秀!