Подтвердить что ты не робот

Есть ли способ принудительно использовать вкладки вместо пробелов в Java?

CheckStyle предлагает проверить постоянное использование пробелов, но, к сожалению, отсутствует противоположная идея: Использовать исходный код для использования вкладок. Есть ли способ добавить эту функциональность? Это не обязательно CheckStyle, другие инструменты также приветствуются.

То же, что этот вопрос, но для Java.

ИЗМЕНИТЬ

Мне не нужен улучшитель кода, поскольку нормальное состояние базы кода будет состоять из всех вкладок. Мне просто нужен инструмент, который может сообщить о наличии альтернативного отступа. Таким образом, я могу настроить новую конфигурацию непрерывной сборки, которая не сработает при вводе пробелов.

4b9b3361

Ответ 1

Хотя Checkstyle не имеет встроенной проверки для этого, вы можете принудительно ввести отступы только для табуляции, используя проверку RegexpSinglelineJava. Обратите внимание, что это только проверяет, какой символ используется для отступов, а не для правильного уровня отступа.

Бесстыдно украден из источника Hibernate OGM:

<module name="RegexpSinglelineJava">
    <property name="format" value="^\t* +\t*\S"/>
    <property name="message" value="Line has leading space characters; indentation should be performed with tabs only."/>
    <property name="ignoreComments" value="true"/>
</module>

Ответ 2

Использование пробелов вместо вкладок в отступ является предпочтительным, поскольку оно обеспечивает согласованность компоновки во всех редакторах/зрителях. Но если вы все еще этого хотите, вы всегда можете сделать свою собственную проверку для checkstyle или пользовательской задачи maven plugin/ant. Логике тоже не сложно реализовать: все, что вам нужно, чтобы проверить, превышает ли ведущее пространство на любой строке длину вкладки.

Изменить: в том числе пример ant. Его две недели с тех пор, как вы отправили, и вы все еще не счастливы, и у меня было свободное время:) Поэтому я приготовил для вас небольшое решение для задач ant.

Задача ant

public class SpaceDetectorTask extends Task {
    public static final String REGEX = "^[ ]+";
    public static final Pattern p = Pattern.compile(REGEX);

    private FileSet fileSet;
    private boolean failOnDetection;

    // Usual getters/setters

    public void addFileSet(FileSet fileSet) {
        this.fileSet = fileSet;
    }

    public void execute() {
        DirectoryScanner ds = fileSet.getDirectoryScanner();
        String[] files = ds.getIncludedFiles();
        for (int x = 0; x <= files.length -1; x++) {
            process(ds.getBasedir(), files[x]);
        }
    }

    public void process(File dir, String file) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(new File(dir, file)));
            String line;
            int linecount = 0;
            System.out.println("File: " + file);
            boolean ignore = false;
            while((line = reader.readLine()) != null) {
                linecount++;

                // exclude comment blocks
                if (line.contains("/**") || line.contains("*/")) {
                    ignore = !ignore;
                    continue;
                }

                if (!ignore) {
                    if (p.matcher(line).find()) {
                        int spcCount = line.length() - (line.replaceAll(REGEX, "")).length();
                        if (spcCount >= 4) { // break whenever 4 leading spaces are detected. Configure as you need.
                            String msg = "File: "+ file + " is using spaces as indentation.";
                            if (failOnDetection) {
                                throw new BuildException(msg);
                            } else {
                                getProject().log(msg);
                            }
                        }
                    }
                    reader.close();
                }
            }
        } catch (IOException e) {
            if (failOnDetection) {
                throw new BuildException(e);
            } else {
                getProject().log("File: " + file + "\n" + e.getMessage());
            }
        }
    }

В ant build.xml

  • Скомпилировать задачу сначала
  • Объявить его

    <taskdef name="detect-spaces"
             classname="com.blah.blah.build.tools.SpaceDetectorTask">
            <classpath>
                <pathelement path="${dir.classes}"/>
                <fileset dir="C:/apache-ant-1.7.1/lib">
                    <include name="**/*.jar"/>
                </fileset>
            </classpath>
    </taskdef>
    
  • используйте его

    <target name="rules.spaces">
        <detect-spaces
            failOnDetection="true">
            <fileset dir="${dir.src.java}">
                <include name="**/*.java"/>
            </fileset>
        </detect-spaces>
    </target>
    

Записывать maven/checkstyle plugin shoulnt тоже сложно.

Ответ 3

Этот способ намного проще, чем другие предлагаемые методы.

Создайте тест Regexp в группе Разное и установите

Формат: ^[ \t]*
Сообщение: Отступы должны быть вкладками
Недопустимый шаблон: (отмечено)

Ответ 4

Найдите ведущее пространство с помощью этой команды:

grep -e "^\t* " `find . -name *.java`

Затем переверните статус выхода.

Ответ 5

Jalopy может быть вашим поиском. Он не обновлялся некоторое время, но он все равно должен работать. Существует также коммерческая версия, доступная от Triemax.

Ответ 6

Наш Java Formatter будет делать это напрямую. Исходный текст шаблона JavaFormatter (для некоторого определения prettyprint:-) и отступов логически фиксирует количество пробелов на вложенный блок (например, indent = 3 [по умолчанию]).

Можно заставить Java Formatter использовать символы TAB в левом поле для пробела, и он будет использовать TAB для перехода к следующему столбцу, который соответствует заданному пользователем количеству столбцов столбцов табуляции. Если вы определяете границы табуляции, чтобы иметь такое же разделение, как расстояние отступа, вы получите один знак табуляции за отступ, просто форматируя код. Если вы определяете indent = 8, с табулями останавливается каждые 8 ​​столбцов (1,9,17,...), вы, как правило, получаете вкладки, которые работают со многими редакторами, поскольку интерпретация вкладок по умолчанию - "каждые 8 ​​столбцов".

Ответ 7

В IntelliJ я выполняю форматирование кода в стандартном формате при регистрации. Таким образом, вы можете иметь пробелы/вкладки при вводе, но код периодически изменяется на стандартный формат и всегда корректен в управлении версиями (где он должен быть общим)

Должно быть что-то подобное, что вы можете сделать без IntelliJ, как предварительная проверка в script.

Использование вкладок вместо пробелов было хорошей идеей в 80, но действительно ли вы думаете, что это важно в 10-х годах? Это, конечно, не может быть на диске!