CheckStyle提供了检查空格的一致使用,但可悲的是缺少相反的想法:强制源代码使用制表符。有没有办法添加这个功能?它不必是CheckStyle,也可以使用其他工具。
与此问题相同,但适用于Java。
编辑
我不需要一个代码美化器,因为代码库的正常状态将是所有制表符。我只需要一个能够报告替代缩进存在的工具。这样我就可以设置一个新的持续构建配置,当引入空格时将失败。
CheckStyle提供了检查空格的一致使用,但可悲的是缺少相反的想法:强制源代码使用制表符。有没有办法添加这个功能?它不必是CheckStyle,也可以使用其他工具。
与此问题相同,但适用于Java。
编辑
我不需要一个代码美化器,因为代码库的正常状态将是所有制表符。我只需要一个能够报告替代缩进存在的工具。这样我就可以设置一个新的持续构建配置,当引入空格时将失败。
RegexpSinglelineJava
检查来强制执行仅使用制表符进行缩进。请注意,这仅检查用于缩进的字符,而不是正确的缩进级别。<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>
<property name="tabWidth" value="4"/>
。 - Qix - MONICA WAS MISTREATEDpublic 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文件中
Declare it
<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>
use it
<target name="rules.spaces">
<detect-spaces
failOnDetection="true">
<fileset dir="${dir.src.java}">
<include name="**/*.java"/>
</fileset>
</detect-spaces>
</target>
^ [\t]*
使用此命令搜索前导空格:
grep -e "^\t* " `find . -name *.java`
我们的Java格式化程序可以直接完成此操作。 JavaFormatter对源文本进行漂亮的打印(某些定义为漂亮的打印),并在每个嵌套块中逻辑地缩进一定数量的空格(例如,默认情况下为indent = 3)。
可以强制Java Formatter在左边距使用TAB字符作为空格,并且它将使用TAB跳到与用户指定的制表符停止列号相对应的下一列。如果您定义制表符具有与缩进距离相同的间隔,则通过格式化代码,您将获得每个缩进一个制表符字符。如果您定义indent = 8,并且制表符停止每8列(1,9,17,...),则倾向于获得与许多编辑器配合使用的选项卡,因为选项卡的默认解释是“每8列”。