2

我正在 RichTextFX CodeArea 中构建一个 YAML 编辑器(我相信它是一种 TextArea)。当我按 Enter 时,我想保持当前的缩进级别。例如:

- item1: foo
  item1A:
    subElement: A
<there should be 4 spaces here after I hit enter>

或者,如果有人已经在 RichTextFX 或 JavaFX 中构建了一个 yaml 编辑器,我希望有一个指向它的链接。

当我在此之后按回车时,添加一个子元素unde

4

2 回答 2

1

您可以尝试以下方法:

Pattern whiteSpace = Pattern.compile( "^\\s+" );

codeArea.addEventFilter( KeyEvent.KEY_PRESSED, KE ->
{
    if ( KE.getCode() == KeyCode.ENTER )
    {
        Matcher m = whiteSpace.matcher( codeArea.getParagraph( codeArea.getCurrentParagraph() ).getSegments().get( 0 ) );
        if ( m.find() ) Platform.runLater( () -> codeArea.insertText( codeArea.getCaretPosition(), m.group() ) );
    }
});
于 2019-04-22T08:48:28.067 回答
0

这是我写的一个小助手类,如果当前行以给定的后缀结尾,它将保持缩进甚至增加缩进一级。它使用 RichTextFX 的 InputMap-API。

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.fxmisc.richtext.GenericStyledArea;
import org.fxmisc.wellbehaved.event.EventPattern;
import org.fxmisc.wellbehaved.event.InputMap;
import org.fxmisc.wellbehaved.event.Nodes;  
import javafx.scene.input.KeyCode;

public class RichTextFXAutoIndenter {
    
    private static final Pattern LEADING_WHITESPACE = Pattern.compile( "^\\s+" );

    public static void install(GenericStyledArea<?, String, ?> genericStyledArea, String ... indentSuffixes) {
        Nodes.addInputMap(genericStyledArea, InputMap.consume(EventPattern.keyPressed(KeyCode.ENTER), event -> enterPressed(genericStyledArea, indentSuffixes)));       
    }
    
    private static void enterPressed(GenericStyledArea<?, String, ?> genericStyledArea, String[] indentSuffixes) {
        genericStyledArea.replaceSelection("\n" + getIndentation(genericStyledArea, indentSuffixes));
    }
    
    private static String getIndentation(GenericStyledArea<?, String, ?> genericStyledArea, String[] indentSuffixes) {
        String currentLine = genericStyledArea.getParagraph(genericStyledArea.getCurrentParagraph()).getSegments().get(0);
        Matcher m = LEADING_WHITESPACE.matcher(currentLine);
        String indent = "";
        if (m.find()) {
            indent =  m.group();
        }
        if (Arrays.stream(indentSuffixes).anyMatch(suffix -> currentLine.trim().endsWith(suffix))) {
            indent += "\t";
        }
        return indent;
    }
}
于 2022-01-31T13:10:32.697 回答