如何有效地找到源代码文件中的小错别字?

时间:2017-03-17 10:03:21

标签: python spell-checking lint aspell

我想以递归方式搜索大型代码库(主要是python,HTML和javascript),以便在注释,字符串以及变量/方法/类名中搜索拼写错误。对在终端中运行的东西的强烈偏好。

问题在于,像aspellscspell这样的拼写检查器几乎只能找到误报(例如编程术语,类似术语),而我会很高兴它能帮助我主要找到像乱码的简单拼写错误或遗失的信件,例如维护与维护,重新与限制,部署与部署。

到目前为止我玩的是:

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

但它会找到类似的内容:assertEqual, MyTestCase, lifecycle

3 个答案:

答案 0 :(得分:0)

我自己的这个解决方案专注于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词典以递归方式在您的代码库中运行它,并收集所有标识为拼写错误的字典并计算其出现次数:

cat ~/comments.txt | aspell --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

Update2:管理以解决例如错别字在内部强调的名称或字符串中没有字边界,例如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 :(得分:0)

如果您使用打字稿,则可以使用我为拼写检查创建的gulp插件: https://www.npmjs.com/package/gulp-ts-spellcheck

答案 2 :(得分:0)

如果您使用JavaScript或Typescript进行开发,则可以使用此拼写检查插件来实现ESLint:

https://www.npmjs.com/package/eslint-plugin-spellcheck

我发现它非常有用。

另一种选择是scspell:

https://github.com/myint/scspell

它与语言无关,声称“通常会捕获许多错误而不会产生令人讨厌的误报率。”