如何有效地查找源代码文件中的小拼写错误?

How to efficiently find small typos in source code files?

我想递归搜索大型代码库(主要是 python、HTML 和 javascript)以查找注释、字符串和 variable/method/class 名称中的拼写错误。强烈偏好在终端中运行的东西。

问题是像 aspellscspell 这样的拼写检查器几乎只能发现误报(例如编程术语、驼峰术语),而如果它能帮助我主要找到简单的拼写错误,我会很高兴像乱序或丢失的字母,例如维护与维护,限制与限制,部署与部署。

到目前为止我玩的是:

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

但它会找到如下内容:assertEqual, MyTestCase, lifecycle

我自己的这个解决方案主要针对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 -c correct.txt

现在粘贴这两个文件得到 typo;correctionpaste -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技能很差所以肯定space需要改进。

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

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 

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

如果您正在使用 JavaScript 或 Typescript 进行开发,那么您可以使用 ESLint 的拼写检查插件:

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

我发现它非常有用。

另一个选项是 scspell:

https://github.com/myint/scspell

它与语言无关,并声称 "usually catch many errors without an annoying false positive rate."