在xtext中自动漂亮格式化 [英] auto pretty formatting in xtext

查看:171
本文介绍了在xtext中自动漂亮格式化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想问的是,有没有办法在xtext中自动执行漂亮的格式化,而不用(ctrl + shift + f)或从首选项菜单中打开它。我真正想要的是每当用户完成编写代码时,它会自动格式化(或运行时),而不用(ctrl + shift + f)。

I want to ask that is there a way to do Pretty formatting in xtext automatically without (ctrl+shift+f) or turning it on from preference menu. What I actually want is whenever a user completes writing the code it is automatically pretty formatted (or on runtime) without (ctrl+shift+f).

推荐答案

有一种方法来做,这被称为AutoEdit。这不完全是用户完成写作,而是每一个令牌。这至少是我所做的。你可以肯定地改变了。我会给你一个例子,我为自己的项目实施了自己。它基本上按照用户类型(由空格和终点线触发)来利用每个关键字。

There is a way for doing that which is called "AutoEdit". It's not exactly when the user completes writing but it's with every token. That's at least what I have done. You can for sure change that. I will give you an example that I implemented myself for my project. It basically capitalizes everykeyword as the user types (triggered by spaces and endlines).

这是一个UI的东西。因此,在您的UI项目中:

It is a UI thing. So, In your UI project:

在MyDslUiModule.java中,您需要附加AutoEdit自定义类,就像这样:

in MyDslUiModule.java you need to attach your AutoEdit custom made class do that like this:

public Class<? extends DefaultAutoEditStrategyProvider> bindDefaultAutoEditStrategyProvider() 
{
    return MyDslAutoEditStrategyProvider.class;
}

我们的类将被称为MyDslAutoEditStrategyProvider,所以,继续创建一个MyDslAutoEditStrategyProvider .java文件。我有这样做我在介绍中解释的:

Our class will be called MyDslAutoEditStrategyProvider so, go ahead and create it in a MyDslAutoEditStrategyProvider.java file. Mine had this to do what i explained in the introduction:

import java.util.Set;

import org.eclipse.jface.text.DocumentCommand;
import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.IGrammarAccess;
import org.eclipse.xtext.ui.editor.autoedit.DefaultAutoEditStrategyProvider;
import org.eclipse.xtext.ui.editor.model.XtextDocument;

import com.google.inject.Inject;
import com.google.inject.Provider;

public class MyDslAutoEditStrategyProvider extends DefaultAutoEditStrategyProvider {

@Inject
Provider<IGrammarAccess> iGrammar;

private Set<String> KWDS;

@Override
protected void configure(IEditStrategyAcceptor acceptor) {

    KWDS = GrammarUtil.getAllKeywords(iGrammar.get().getGrammar());

    IAutoEditStrategy strategy = new IAutoEditStrategy() 
    {

        @Override
        public void customizeDocumentCommand(IDocument document, DocumentCommand command) 
        {
            if ( command.text.length() == 0 || command.text.charAt(0) > ' ') return;

            IRegion reg = ((XtextDocument) document).getLastDamage();

            try {
                String token = document.get(reg.getOffset(), reg.getLength());
                String possibleKWD = token.toLowerCase();
                if ( token.equals(possibleKWD.toUpperCase()) || !KWDS.contains(possibleKWD) ) return;
                document.replace(reg.getOffset(), reg.getLength(), possibleKWD.toUpperCase());

            } 
            catch (Exception e) 
            {
                System.out.println("AutoEdit error.\n" + e.getMessage());   
            }
        }
    };

    acceptor.accept(strategy, IDocument.DEFAULT_CONTENT_TYPE);

    super.configure(acceptor);

    }
}





$ b $我假设你说用户完成写作可以是用户保存文件。如果是这样,在MyDslUiModule.java中保存:


I assume you saying "user completes writing" can be as "user saves file". If so here is how to trigger the formatter on save:

如何触发格式化程序:

public Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() 
{
    return MyDslDocumentProvider.class;
}

创建MyDslDocumentProvider类:

Create the MyDslDocumentProvider class:

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;

public class MyDslDocumentProvider extends XtextDocumentProvider 
{
    @Override
    protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite)
            throws CoreException {
        IHandlerService service = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
        try {
            service.executeCommand("org.eclipse.xtext.ui.FormatAction", null);
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
        super.doSaveDocument(monitor, element, document, overwrite);
    }
}

这篇关于在xtext中自动漂亮格式化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆