当前位置: 首页 > 知识库问答 >
问题:

在RichTextFX代码区中保持缩进

长孙鸿
2023-03-14

我正在RichTextFX代码区(我认为这是一种TextArea)中构建一个YAML编辑器。我想在按Enter键时保持当前的缩进级别。例如:

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

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

当我在这之后按回车键时,要添加子元素unde

共有2个答案

万俟招
2023-03-14

这里有一个我编写的小助手类,如果当前行以给定后缀结尾,它将保持缩进,甚至将缩进增加一级。它使用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;
    }
}
商昂然
2023-03-14

您可以尝试以下操作:

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() ) );
    }
});
 类似资料:
  • 我使用的是RichTextFX,我很惊讶代码区没有默认启用滚动条。我怎样才能让它出现?

  • 我正在使用RichTextFx(CodeArea)突出显示我的代码。我想更改一些关键字的文本背景颜色并在下面使用css:

  • SVN 使用唯一的中央仓库作为开发者之间沟通的桥梁,在开发者的工作拷贝和中央仓库之间传递变更集合(changeset),协作得以发生。这和Git的协作模型有所不同,Git 给予每个开发者一份自己的仓库拷贝,拥有自己完整的本地历史和分支结构。用户通常共享一系列的提交而不是单个变更集合。Git 允许你在仓库间共享整个分支,而不是从工作副本提交一个差异集合到中央仓库。 下面的命令让你管理仓库之间的连接,

  • 我是Emacs的长期用户。我一直在试用VS Code,目前为止很喜欢。 我喜欢Emacs的一件事是,当我按tab时,它总是正确缩进代码。我已经看过了,但我似乎无法在VS代码中得到这种行为。我尝试过查看设置并搜索扩展程序,但没有运气。 有人能帮我吗?有没有我可以/必须安装的扩展程序来让它做我想做的事情? 我主要用PHP、HTML、CSS和Javascript编写代码。 先谢谢你。

  • 2.5. 代码缩进 Python 函数没有明显的 begin 和 end, 没有花括号, 用于标函数的开始和结束。 唯一的分隔符是一个冒号 (:), 接着代码本身是缩进的。 例 2.5. 缩进 buildConnectionString 函数 def buildConnectionString(params): """Build a connection string from a di

  • 我想缩进VisualStudio代码中的特定代码段。 我读了如何在Visual Studio Code中格式化代码?这提供了缩进整个代码的快捷方式,但在选择特定代码部分时不起作用。 在我的代码中选择了一些行后,我尝试了CtrlShiftF,但是整个文件是缩进的。我在Windows上使用Visual Studio Code Insider 1.8.0。我怎么能做到呢?