Eclipse plugin xtext中的自动格式设置

Eclipse plugin xtext中的自动格式设置,eclipse-plugin,xtext,xtend,Eclipse Plugin,Xtext,Xtend,我想问的是,有没有一种方法可以在xtext中自动进行漂亮的格式化,而无需(ctrl+shift+f)或从首选项菜单打开它。我真正想要的是,每当用户完成编写代码时,它就会自动格式化(或在运行时),而无需使用(ctrl+shift+f)。有一种方法称为“自动编辑”。这并不完全是用户完成写入的时间,而是每个令牌的时间。至少我是这么做的。你当然可以改变这一点。我会给你一个例子,我实现了我自己的项目。它基本上将everykeyword大写为用户类型(由空格和结束行触发) 这是一个用户界面的东西。因此,在您

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

有一种方法称为“自动编辑”。这并不完全是用户完成写入的时间,而是每个令牌的时间。至少我是这么做的。你当然可以改变这一点。我会给你一个例子,我实现了我自己的项目。它基本上将everykeyword大写为用户类型(由空格和结束行触发)

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

在mydsluimule.java中,您需要附加AutoEdit定制类,如下所示:

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

您使用的是旧的还是新的(2.8+)格式API?Franz我使用的是新版本。试试看!看到它在您键入时发生变化真是太神奇了:谢谢,这将为项目增添更多的美丽;)
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);

    }
}
public Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() 
{
    return 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);
    }
}