Harper:隐私优先的本地语法检查工具,Rust实现,替代Grammarly
2026/9/5 14:23:20 网站建设 项目流程

在技术写作和日常沟通中,语法和拼写检查工具已成为不可或缺的助手。然而,对于注重隐私的开发者而言,将文档内容上传至云端服务(如 Grammarly)进行审查,始终伴随着数据泄露的隐忧。你是否曾因担心敏感代码注释或技术方案外泄,而不得不放弃使用便捷的语法检查?本文将为你介绍一个全新的解决方案:Harper

Harper 是一个用 Rust 语言编写的、完全免费且开源的语法检查器,旨在成为 Grammarly 的隐私友好型替代品。它完全在本地运行,你的任何文本都不会离开你的计算机。无论你是撰写技术博客、项目文档,还是进行日常的英文邮件沟通,Harper 都能在保护你隐私的前提下,提供高质量的语法、拼写和风格建议。

本文将带你从零开始,完整探索 Harper 的方方面面:从核心概念与优势,到详细的安装与配置步骤,再到实战使用与高级技巧,最后深入其架构并探讨扩展可能性。无论你是 Rust 爱好者、隐私倡导者,还是单纯在寻找一款好用的离线写作工具,都能在这里找到答案。

1. Harper 是什么?为什么选择它?

在深入安装和使用之前,我们有必要厘清 Harper 的定位、它与主流工具的区别,以及它为何值得你关注。

1.1 核心定义与解决的核心问题

Harper是一个本地的、命令行驱动的语法和写作风格检查工具。它通过内置的语言模型和规则集,分析你提供的文本,找出其中的语法错误、拼写错误、标点误用、冗余表达以及不符合简洁风格的问题。

它核心解决两大痛点:

  1. 隐私问题:所有处理均在本地完成,无需互联网连接,从根本上杜绝了文本内容被上传到第三方服务器的风险。
  2. 成本与可控性:完全免费、开源。你可以审查其所有代码,了解其工作原理,甚至可以根据自己的需求进行修改和定制,这是闭源商业软件无法提供的自由。

1.2 Harper vs. Grammarly:关键差异分析

为了更清晰地展示 Harper 的定位,我们将其与行业标杆 Grammarly 进行对比:

特性维度HarperGrammarly (免费版/高级版)
运行模式完全离线,本地处理云端服务,文本需上传至服务器
隐私性极高,数据不出设备存在隐私政策风险,敏感内容需谨慎
费用完全免费免费版功能有限,高级版需订阅
开源(MIT/Apache 2.0许可证)
定制性,可修改规则、训练模型低,仅能使用预设功能
使用方式命令行 (CLI)、编辑器插件浏览器插件、桌面应用、在线编辑器
功能范围核心语法、拼写、风格检查语法、拼写、风格、语气检测、抄袭检查等
适用场景开发者、技术写作者、隐私敏感用户、命令行爱好者普通用户、学生、商务人士,追求开箱即用

简单来说,如果你是一名开发者,习惯命令行,极度重视代码和文档的隐私,并且愿意为了绝对的数据控制权而接受一定的学习曲线和功能取舍,那么 Harper 就是为你量身打造的。Grammarly 则提供了更全面、更集成化、更“傻瓜式”的体验,但代价是隐私和费用。

1.3 技术栈优势:为什么是 Rust?

Harper 选择 Rust 语言实现,这并非偶然,而是带来了诸多工程优势:

  • 高性能:Rust 的零成本抽象和内存安全保证,使得 Harper 能在本地快速处理大量文本,体验流畅。
  • 安全性:内存安全特性减少了崩溃和安全漏洞的风险,这对于一个处理用户输入的工具至关重要。
  • 可移植性:Rust 编译生成独立的二进制文件,可以轻松分发到 Windows、macOS、Linux 等主流平台,无需复杂的运行时环境。
  • 现代生态:Rust 拥有活跃的文本处理、自然语言处理(NLP)和机器学习库生态,为 Harper 的未来发展奠定了基础。

2. 环境准备与安装指南

Harper 的安装过程简单直接。由于它是预编译的二进制文件,你不需要安装 Rust 工具链即可使用。但为了覆盖所有用户和进阶需求,我们将介绍多种安装方法。

2.1 系统要求与前置检查

  • 操作系统:Windows 10/11, macOS 10.15+, 或主流的 Linux 发行版(如 Ubuntu 20.04+, Fedora, Arch)。
  • 终端:一个可用的命令行终端(如 PowerShell, Terminal, bash)。
  • 磁盘空间:约 50-100 MB 用于存放二进制文件及语言模型数据。
  • 网络:仅首次安装或更新时需要,用于下载二进制文件。

在开始前,请打开你的终端。

2.2 安装方法一:使用包管理器(推荐)

这是最便捷的安装方式,便于后续更新。

对于 macOS (使用 Homebrew):

brew install harper

对于 Linux (部分发行版):Harper 可能尚未进入所有官方仓库。你可以使用Cargo(Rust 的包管理器)安装,这需要先安装 Rust 工具链。

# 首先安装 Rust (如果尚未安装) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env # 使用 Cargo 安装 Harper cargo install harper

对于 Windows (使用 Scoop):

scoop install harper

2.3 安装方法二:手动下载二进制文件

如果包管理器不适用,你可以直接从 GitHub Releases 页面下载。

  1. 访问 Harper 的 GitHub Releases 页面:https://github.com/your-org/harper/releases(请注意,这是一个示例URL,实际项目URL需根据真实项目确定。下文将以假设的harper-lint项目为例进行演示)。
  2. 根据你的系统,下载对应的压缩包(例如harper-x86_64-pc-windows-msvc.zip用于 Windows,harper-x86_64-apple-darwin.tar.gz用于 macOS Intel芯片,harper-aarch64-apple-darwin.tar.gz用于 macOS Apple Silicon芯片)。
  3. 解压下载的文件。
  4. 将解压后的可执行文件(通常名为harperharper.exe)移动到系统的PATH环境变量包含的目录中,例如:
    • macOS/Linux:/usr/local/bin/
    • Windows:C:\Windows\System32\或任何已存在于PATH中的目录。

2.4 验证安装

安装完成后,在终端中输入以下命令验证是否安装成功:

harper --version

如果安装正确,你将看到类似harper 0.5.0的版本号输出。

2.5 安装语言模型(首次运行自动完成)

Harper 依赖于一个本地语言模型来工作。当你第一次运行检查命令时,它会自动下载所需的模型文件(大约几十MB)。请确保首次运行时网络通畅。

3. 基础使用与核心命令详解

安装成功后,让我们通过一系列具体示例来掌握 Harper 的基本用法。它的核心命令简洁而强大。

3.1 检查单个文件

这是最常用的场景。假设你有一个名为blog_post.md的 Markdown 文件。

harper check blog_post.md

Harper 会读取文件内容,进行分析,并在终端中输出检查结果。结果会以清晰的格式显示,包括错误位置(行号、列号)、错误类型、问题描述以及修改建议。

3.2 检查标准输入(Stdin)和直接输入文本

你可以通过管道将其他命令的输出传递给 Harper,或者直接检查一段文本。

示例1:检查echo命令输出的文本

echo "She do not like apples." | harper check

输出会指出 “do” 应改为 “does”。

示例2:交互式检查(按 Ctrl+D 结束输入,在Windows Cmd中按 Ctrl+Z)

harper check

然后你可以开始输入多行文本,输入完成后按Ctrl+D(Unix) 或Ctrl+Z(Windows) 结束,Harper 会立即对刚才输入的所有文本进行检查。

3.3 递归检查整个目录

如果你想检查一个项目中的所有文档,可以使用--recursive-r标志。

# 检查当前目录及所有子目录下的 .md 和 .txt 文件 harper check . --recursive # 你也可以指定特定的文件扩展名 harper check docs/ --recursive --ext md --ext txt

3.4 理解检查报告

Harper 的输出格式清晰易读。一个典型的错误报告如下:

blog_post.md:12:5-12:10 error[G001]: Subject-verb agreement | 12 | The list of items are on the table. | ^^^^^ ^^^ | = help: The subject "list" is singular. Consider changing "are" to "is".
  • blog_post.md:12:5-12:10: 文件名、行号、起始列和结束列,精准定位问题。
  • error[G001]: 错误级别和错误代码。error表示语法错误,warning表示风格建议。
  • Subject-verb agreement: 错误类型。
  • 代码片段和波浪线 (^): 直观地标出问题所在位置。
  • help: 具体的修改建议。

3.5 常用命令行选项

Harper 提供了丰富的选项来定制检查行为:

选项简写说明示例
--recursive-r递归检查目录harper check . -r
--ext-e指定要检查的文件扩展名(可多次使用)harper check . -r -e md -e rst
--ignore-i忽略指定的文件或目录(支持 glob 模式)harper check . -r -i “node_modules/”
--format-f指定输出格式 (human,json,compact)harper check file.md -f json
--rules启用/禁用特定规则harper check file.md --rules=G001,G002 --disable=W101
--diff仅检查 Git 暂存区与工作区的差异部分harper check --diff
--help-h显示帮助信息harper --help

--format json示例: 这对于集成到自动化脚本或编辑器插件中非常有用。

harper check file.md --format json

输出将是结构化的 JSON 数据,便于程序解析。

4. 实战案例:集成到写作工作流

仅仅在命令行中使用是不够的。真正的效率提升来自于将 Harper 无缝集成到你日常的写作和开发环境中。下面我们以几个典型场景为例。

4.1 场景一:在 VS Code 中实时检查 Markdown

你可以通过 VS Code 的任务系统或使用已有的 Linter 插件架构来集成 Harper。

方法A:配置 VS Code 任务

  1. 在项目根目录打开.vscode/tasks.json文件(如果没有则创建)。
  2. 添加以下配置:
    { "version": "2.0.0", "tasks": [ { "label": "Check Grammar with Harper", "type": "shell", "command": "harper", "args": ["check", "${file}"], "group": { "kind": "build", "isDefault": false }, "presentation": { "reveal": "always", "panel": "dedicated" }, "problemMatcher": { "owner": "harper", "fileLocation": ["relative", "${workspaceFolder}"], "pattern": { "regexp": "^(.*):(\\d+):(\\d+)-(\\d+):\\s*(error|warning)\\[(\\w+)\\]:\\s*(.*)$", "file": 1, "line": 2, "column": 3, "endColumn": 4, "severity": 5, "code": 6, "message": 7 } } } ] }
  3. 打开一个 Markdown 文件,按Ctrl+Shift+P,输入 “Run Task”,选择 “Check Grammar with Harper”。结果将显示在“问题”面板中,你可以像处理代码错误一样点击跳转。

方法B:使用 Linter 插件(如vscode-markdownlint的补充)虽然目前可能没有官方的 Harper VS Code 扩展,但你可以将其配置为 Markdown 文件的预保存钩子,或者期待社区开发相关插件。一个简单的方案是使用文件监视工具(如entr)在文件保存时自动运行 Harper。

4.2 场景二:作为 Git 预提交钩子(Pre-commit Hook)

这是保证代码库中文档质量的绝佳方式。你可以防止含有语法错误的文档被提交。

  1. 在项目根目录,确保有.git/hooks目录。
  2. 创建或修改.git/hooks/pre-commit文件(无扩展名)。
  3. 添加以下内容(Linux/macOS):
    #!/bin/sh echo "Running Harper grammar check..." # 检查所有暂存的 .md 文件 git diff --cached --name-only --diff-filter=ACM | grep '\.md$' | while read file; do if [ -f "$file" ]; then harper check "$file" if [ $? -ne 0 ]; then echo "Harper found issues in $file. Commit aborted." exit 1 fi fi done
  4. 赋予该文件执行权限:chmod +x .git/hooks/pre-commit

现在,每次你执行git commit时,Harper 都会自动检查所有暂存的 Markdown 文件。如果发现问题,提交会被中止,你必须修复错误后才能成功提交。

4.3 场景三:在 CI/CD 流水线中自动检查

你可以在 GitHub Actions、GitLab CI 等持续集成服务中添加 Harper 检查步骤,确保 Pull Request 中的文档质量。

GitHub Actions 示例 (.github/workflows/harper.yml):

name: Harper Grammar Check on: [pull_request, push] jobs: harper: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install Harper run: | # 这里假设 Harper 提供了 Linux 二进制包的下载链接 wget -O harper.tar.gz https://github.com/your-org/harper/releases/download/v0.5.0/harper-x86_64-unknown-linux-gnu.tar.gz tar -xzf harper.tar.gz sudo mv harper /usr/local/bin/ - name: Run Harper run: | # 检查所有 .md 文件 find . -name "*.md" -not -path "./node_modules/*" -not -path "./.git/*" | xargs harper check

这样,每次代码推送或 PR 创建时,都会自动运行语法检查,并将结果反馈在 CI 界面上。

5. 高级配置与自定义规则

Harper 的强大之处在于其可定制性。你可以通过配置文件来调整其行为,甚至定义自己的检查规则。

5.1 配置文件:.harper.toml

在项目根目录创建.harper.toml文件,Harper 会自动读取其中的配置。

一个基础的配置文件示例:

# .harper.toml [default] # 要检查的文件扩展名 extensions = ["md", "txt", "rst"] # 要忽略的目录和文件 ignore = ["node_modules", "target", "*.tmp"] # 默认输出格式 format = "human" # 启用所有错误规则,但禁用某些风格警告 disable_rules = ["W101", "W203"] # W101可能是“过度使用副词”,W203可能是“句子过长” [rule.G001] # 针对特定规则进行配置 severity = "warning" # 将主谓一致错误从 error 降级为 warning [rule.SP001] # 假设 SP001 是拼写检查规则 # 指定自定义词典路径 custom_dictionary = "./.custom_dict.txt"

5.2 创建自定义词典

Harper 的拼写检查器可能不认识专业术语、技术缩写或产品名。你可以创建一个自定义词典文件来避免误报。

  1. 创建一个文本文件,例如.custom_dict.txt
  2. 每行添加一个单词(不区分大小写)。
    Kubernetes GraphQL WebAssembly OpenAI CSDN Rustacean
  3. .harper.toml中配置custom_dictionary路径指向该文件。

5.3 理解与调整规则集

Harper 的规则分为几类:

  • G*: 语法规则 (Grammar)
  • S*: 风格规则 (Style)
  • P*: 标点规则 (Punctuation)
  • SP*: 拼写规则 (Spelling)

使用harper list-rules命令可以查看所有可用规则及其描述。你可以根据项目风格指南,在配置文件中批量启用或禁用某类规则。

# 禁用所有风格类警告 disable_rules = ["S*", "W*"] # 只启用语法和拼写检查 enable_rules = ["G*", "SP*"]

6. 常见问题与故障排除

即使工具设计得再完善,在实际使用中也可能遇到问题。下面是一些常见场景及其解决方案。

6.1 安装与运行问题

问题现象可能原因解决思路
command not found: harperHarper 未安装或不在PATH中。1. 确认已按步骤安装。
2. 在终端输入which harper(Unix) 或where harper(Windows) 检查路径。
3. 将 Harper 二进制文件所在目录添加到系统的PATH环境变量。
首次运行卡住或报网络错误无法下载语言模型。1. 检查网络连接。
2. 尝试设置代理(如果适用):export https_proxy=http://your-proxy:port(Unix) 或set https_proxy=...(Windows)。
3. 手动下载模型:查看 Harper 文档,找到模型文件手动下载地址,放置到 Harper 的缓存目录(通常位于~/.cache/harper%APPDATA%\harper)。
检查速度很慢模型文件较大或硬件性能有限。1. 首次加载模型后会缓存,后续运行会快很多。
2. 确认使用的是否为适合你 CPU 架构的版本(如 Apple Silicon Mac 应使用 aarch64 版本)。
3. 考虑禁用一些复杂的风格规则。

6.2 检查结果相关问题

问题现象可能原因解决思路
报告了太多“错误”,但文本看起来没问题。1. 规则过于严格。
2. 文本包含技术术语、代码片段或非标准语法。
1. 使用--disable参数临时禁用某些规则进行测试。
2. 将技术术语添加到自定义词典。
3. 使用<!-- harper-ignore --><!-- harper-ignore-end -->注释(如果支持)包裹代码块或特定段落,让 Harper 跳过检查。
没有报告任何问题,但明显有错误。1. 相关规则被禁用。
2. 文件扩展名不在检查范围内。
3. 文件被.harper.toml中的ignore模式匹配。
1. 运行harper check file.md --rules=all检查所有规则。
2. 使用--ext md显式指定扩展名。
3. 检查配置文件中的ignore列表。
JSON 格式输出无法解析。输出可能包含非 JSON 内容(如进度条或日志)。确保使用--format json参数,并且命令执行成功(退出码为0)。在脚本中,可以先检查$?%ERRORLEVEL%

6.3 性能与资源问题

Harper 作为本地工具,性能通常很好。但如果检查非常大的文件(如整本书稿),可能会占用较多内存。如果遇到性能问题,可以考虑:

  • 将大文件拆分成小章节分别检查。
  • 在 CI 环境中,为运行 Harper 的容器分配足够的内存。
  • 关注项目更新,性能优化是开源项目的持续工作。

7. 最佳实践与工程建议

将 Harper 有效地融入个人或团队的工作流,需要一些策略和约定。

7.1 个人使用最佳实践

  1. 循序渐进:不要一开始就启用所有规则。先从基本的语法和拼写检查(G*,SP*)开始,适应后再逐步引入风格建议(S*,W*)。
  2. 善用忽略注释:在撰写技术文档时,代码片段、命令输出、变量名常常会被误报。学会使用 Harper 提供的忽略注释语法(请查阅其最新文档)来包裹这些内容,保持检查的针对性。
  3. 建立个人词典:维护一个全局的自定义词典文件,存放你常用但 Harper 不认识的专有名词、技术术语、公司内部用语等。将这个文件放在云同步目录(如 Dropbox, iCloud)下,并在所有设备的配置中引用它。
  4. 集成到编辑流程:将harper check命令绑定到你的文本编辑器或 IDE 的保存快捷键上,实现“保存即检查”,获得即时反馈。

7.2 团队协作最佳实践

  1. 共享配置文件:在团队项目的根目录提交.harper.toml文件。这能确保所有团队成员使用同一套检查标准,保证文档风格的一致性。
  2. 统一的自定义词典:在项目内维护一个.custom_dict.txt文件,包含项目特有的术语、产品名、团队成员姓名等。将其纳入版本控制。
  3. 强制性的预提交钩子:如第4.2节所示,为团队仓库配置 Git 预提交钩子。这是保证代码库中文档质量底线的最有效手段。可以考虑使用pre-commit框架来管理钩子,使配置更易移植。
  4. CI/CD 门禁:将 Harper 检查作为 CI 流水线的一个必过环节。可以设置为:如果发现任何语法错误(error级别),则流水线失败;对于风格警告(warning级别),则仅输出报告而不阻塞流水线,供作者参考。
  5. 制定团队写作风格指南:Harper 的规则配置应与团队的写作风格指南对齐。例如,如果团队指南允许使用被动语态,则应在配置中禁用相关的主动语态建议规则(如S101)。

7.3 安全与隐私考量重申

虽然 Harper 是本地工具,但在团队和 CI 环境中仍需注意:

  • 模型文件来源:确保从官方渠道下载 Harper 二进制文件和语言模型,避免恶意篡改。
  • CI 环境网络:如果 CI 服务器需要下载模型,确保其网络环境是安全可信的。
  • 自定义规则审计:如果引入了第三方或自定义规则,应对其代码进行审计,防止规则本身包含恶意逻辑(虽然风险极低)。

8. 深入原理与扩展开发

对于 Rust 开发者和希望深度定制 Harper 的用户,了解其内部原理和扩展方式会大有裨益。

8.1 Harper 的核心架构浅析

Harper 的架构通常遵循以下模块化设计(具体实现可能因版本而异):

  1. 前端解析:读取输入(文件、stdin),根据文件类型(如 Markdown)进行初步解析,可能剥离代码块、链接等不需要检查的部分。
  2. 文本提取与规范化:从解析后的内容中提取纯文本句子,并进行分词、句子分割等规范化处理。
  3. 规则引擎:核心组件。加载所有启用的规则(G*,S*等)。每条规则都是一个独立的检查器。
  4. 语言模型集成:拼写检查(SP*)和部分高级语法检查可能依赖一个本地轻量级语言模型(如通过tokenizersonnxruntime运行的小型模型)来理解上下文。
  5. 结果聚合与报告:收集所有规则检查出的问题,进行排序、去重,然后根据指定的格式(human,json)生成报告。

8.2 为 Harper 贡献规则

Harper 作为开源项目,欢迎社区贡献。如果你发现某个常见的语法错误或希望推广某种写作风格,可以尝试为其编写规则。

规则通常是实现特定Ruletrait 的结构体。一个简单的规则框架可能如下所示(此为概念性示例,非真实代码):

// 假设的规则定义示例 pub struct PassiveVoiceRule; impl Rule for PassiveVoiceRule { fn id(&self) -> &'static str { "S102" } fn description(&self) -> &'static str { "建议使用主动语态替代被动语态" } fn check(&self, context: &RuleContext) -> Vec<Diagnostic> { let mut diagnostics = Vec::new(); // 分析 context.text,寻找被动语态模式(如 “was written by”) // 如果找到,创建一个 Diagnostic 对象,包含位置和建议 // diagnostics.push(diagnostic); diagnostics } }

贡献前,请详细阅读项目的CONTRIBUTING.md文档,理解测试框架和代码规范。

8.3 与其他工具集成展望

Harper 的 CLI 接口和 JSON 输出格式,为其与其他工具的集成打开了大门:

  • 编辑器深度集成:开发正式的 VS Code、IntelliJ IDEA、Vim/Neovim 插件,提供行内提示和快速修复(Quick Fix)功能。
  • 文档生成流水线:与Sphinx,MkDocs,Docusaurus等文档生成工具结合,在构建阶段自动检查所有源文件。
  • 自定义报告工具:编写脚本,解析 Harper 的 JSON 输出,生成团队内的写作质量仪表盘,统计常见错误类型。

Harper 代表了一种趋势:将强大的、原本依赖云端的 AI 辅助工具,通过开源和本地化的方式,转变为尊重用户隐私、可自由掌控的基础设施。它可能没有商业软件那样华丽的外衣和无所不包的功能,但它提供了最宝贵的东西:控制权、透明度和信任。

从今天开始,尝试用 Harper 来检查你的下一篇技术博客、API 文档或项目 README。你可能会发现,在享受自动化校对便利的同时,守护数据隐私也可以如此简单。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询