有没有办法在Java中使用制表符而不是空格?
2022-09-03 13:15:58
CheckStyle提供了检查空格的一致使用,但遗憾的是缺乏相反的想法:强制源代码使用选项卡。有没有办法添加此功能?它不必是CheckStyle,其他工具也欢迎。
与这个问题相同,但对于Java。
编辑
我不需要代码美化器,因为代码库的正常状态将是所有选项卡。我只需要一个可以报告交替缩进存在的工具。这样,我就可以设置一个新的连续构建配置,该配置在引入空格时将失败。
CheckStyle提供了检查空格的一致使用,但遗憾的是缺乏相反的想法:强制源代码使用选项卡。有没有办法添加此功能?它不必是CheckStyle,其他工具也欢迎。
与这个问题相同,但对于Java。
编辑
我不需要代码美化器,因为代码库的正常状态将是所有选项卡。我只需要一个可以报告交替缩进存在的工具。这样,我就可以设置一个新的连续构建配置,该配置在引入空格时将失败。
尽管 Checkstyle 对此没有内置检查,但您可以使用检查强制实施仅制表符缩进。请注意,这仅检查用于缩进的字符,而不检查缩进级别是否正确。RegexpSinglelineJava
无耻地从冬眠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>
最好使用空格而不是制表符进行缩进,因为它提供了所有编辑器/查看器的布局一致性。但是,如果您仍然想要它,您可以随时对checkstyle或自定义maven插件/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());
}
}
}
在蚂蚁建造中.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 插件也很困难。