Android Studio 插件:按等号对齐进行格式化

29 篇文章 0 订阅
10 篇文章 0 订阅

背景

项目中有很多常量类,看上去不整齐,有时候想找一个常量眼特别花。于是写了一个小插件,用来把它们按照等号进行格式化。
在这里插入图片描述

效果

在这里插入图片描述

实现

public class FormatAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent e) {
        // 获取编辑器model
        final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);

        final Project project = e.getProject();
        if (null == mEditor || project == null) {
            return;
        }

        // 获取代码内容
        final Document document = mEditor.getDocument();
        // 获取光标model
        final CaretModel caretModel = mEditor.getCaretModel();
        // 获取选中区域model
        final SelectionModel selectionModel = mEditor.getSelectionModel();

        String s = selectionModel.getSelectedText();
        if (s == null || s.length() == 0) {
            System.out.println("no selection");
            return;
        }

        // 找到最远的等号的 index
        String[] lines = s.split("\n");
        int maxIndexOfEqual = -1;
        for (String line : lines) {
            int indexOfEqual = line.indexOf("=");
            if (indexOfEqual > maxIndexOfEqual) {
                maxIndexOfEqual = indexOfEqual;
            }
        }

        if (maxIndexOfEqual < 0) {
            System.out.println("no equal sign");
            return;
        }

        // 给每一行的等号前添加空格
        StringBuilder newDocumentBuilder = new StringBuilder();
        for (String line : lines) {
            String newLine = line;
            int indexOfEqual = line.indexOf("=");
            if (indexOfEqual > 0 && indexOfEqual < maxIndexOfEqual) {
                String lineHead = line.substring(0, indexOfEqual);
                String lineEnd = line.substring(indexOfEqual, line.length());

                int blankCount = maxIndexOfEqual - indexOfEqual;
                StringBuilder lineMidBuilder = new StringBuilder();
                for (int i = 0; i < blankCount; i++) {
                    lineMidBuilder.append(" ");
                }
                String lineMid = lineMidBuilder.toString();

                newLine = lineHead + lineMid + lineEnd;
            }
            newDocumentBuilder.append(newLine).append('\n');
        }

        // 替换旧代码
        int start = selectionModel.getSelectionStart();
        int end = selectionModel.getSelectionEnd();
        WriteCommandAction.runWriteCommandAction(project, () -> {
            document.replaceString(start, end, newDocumentBuilder.toString());
        });
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值