如何高效地在源代码文件中找到小错误?

7

我希望能够递归地搜索一个大型代码库(主要是python、HTML和javascript)中的注释、字符串以及变量/方法/类名称,以查找拼写错误。强烈推荐使用在终端中运行的工具。

问题在于拼写检查器如aspell或scspell几乎只能发现假阳性(例如编程术语、驼峰式术语等),而我希望它主要能够帮助我发现简单的拼写错误,例如字母错位或缺失,例如maintenane vs. maintenance、resticted vs. restricted、dpeloyment vs. deployment。

目前我正在尝试使用以下工具:

for f in **/*.py ; do echo $f ; aspell list < $f |  uniq -c ; done

但它会找到任何类似这样的内容:assertEqual, MyTestCase, lifecycle

3个回答

3

我的解决方案主要针对Python文件,但最终也在HTML和JS文件中找到了问题。仍需要手动筛选错误结果,但只需几分钟即可完成,并找出了约150处注释的拼写错误,这些错误还可以在非注释的部分中找到。

将此保存为可执行文件,例如extractcomments

#!/usr/bin/env python3
import argparse
import io
import tokenize


if __name__ == "__main__":
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument('filename')
    args = parser.parse_args()

    with io.open(args.filename, "r", encoding="utf-8") as sourcefile:
        for t in tokenize.generate_tokens(sourcefile.readline):
            if t.type == tokenize.COMMENT:
                print(t.string.lstrip("#").strip())

收集所有评论以进行进一步处理:
for f in **/*.py ; do  ~/extractcomments $f >> ~/comments.txt ; done

使用一个或多个 aspell 字典递归地在您的代码库上运行它,并收集所有被识别为拼写错误的单词并计算它们的出现次数:

aspell <~/comments.txt --lang=en list|aspell --lang=de list | sort | uniq -c | sort -n > ~/typos.txt

生成的结果如下:

10 availabe
 8 assignement
 7 hardwird

将不带前导数字的列表清理出误报后,将其复制到第二个文件correct.txt中,并运行aspell以获取每个拼写错误的期望替换:aspell -c correct.txt

现在将这两个文件粘贴在一起,格式为typo;correction,使用paste -d";" typos.txt correct.txt > known_typos.csv

现在我们想要递归地替换代码库中的这些内容:

#!/bin/bash

root_dir=$(git rev-parse --show-toplevel)

while IFS=";" read -r typo fix ; do
    git grep -l -z -w "${typo}" -- "*.py" "*.html"  | xargs -r --null sed -i "s/\b${typo}\b/${fix}/g"
done < $root_dir/known_typos.csv

我的bash技能很差,所以肯定还有提高的空间。

更新:通过运行以下命令,我可以找到更多方法名称中的拼写错误:

grep -r def --include \*.py . | cut -d ":" -f 2- |tr "_" " " | aspell --lang=en list | sort -u

更新2:成功修复了一些错别字,例如下划线名称中的拼写错误或者没有单词边界的字符串(如i_am_a_typpo3)。

#!/bin/bash                                                                                                                         

root_dir=$(git rev-parse --show-toplevel)                                                                                           
while IFS=";" read -r typo fix ; do                                                                                                 
    echo ${typo}                                                                                                                    
    find $root_dir  \( -name '*.py' -or -name '*.html' \) -print0 | xargs -0 perl -pi -e "s/(?<![a-zA-Z])${typo}(?![a-zA-Z])/${fix}/g"                                                                                                                    
done < $root_dir/known_typos.csv 

1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接