
Harper 语言服务器 harper-ls 实战指南编辑器内实时拼写与语法检查的完整接入手册【免费下载链接】harperOffline, privacy-first grammar checker. Fast, open-source, Rust-powered项目地址: https://gitcode.com/GitHub_Trending/har/harper本文围绕 Harper 项目的官方文档packages/web/src/routes/docs/integrations/language-server/page.md展开系统讲解harper-ls语言服务器的安装方式、四层词典体系、代码操作Code Actions、忽略注释机制与完整的 JSON 配置项并结合 harper-ls 源码 深入剖析其配置解析、词典合并与诊断发布的底层实现帮助你把 Harper 的拼写与语法检查能力无缝接入任意支持 LSP 的编辑器。一、harper-ls 是什么Harper 的 LSP 前端harper-ls是 Harper一个离线、隐私优先的 Rust 语法检查器的 Language Server Protocol 前端。开箱即用它为绝大多数编程语言提供注释comments解析能力并对所有 Markdown 文件做全文检查。从源码结构看服务器基于tower-lsp-server与tokio构建支持两种通信方式见 main.rs默认 TCP 模式监听127.0.0.1:4000仅接受一个客户端连接stdio 模式通过--stdio参数或-s启用走标准输入/输出这是 VS Code 等编辑器通常使用的方式。harper-ls --stdio启动后服务器会向编辑器拉取配置initialized阶段调用pull_config并在每次文档变更时重新解析设置配置热更新无需重启进程实现见 backend.rs 的 pull_config。二、安装方式harper-ls已在 crates.io 显示其描述为 The language checker for developers.。官方文档提供以下安装渠道ScoopWindowsscoop install harperHomebrewmacOS / Linuxbrew install harperArch Linux稳定版可从extra仓库安装sudo pacman -S harper如需要最新构建可用 AUR helper 安装harper-gitparu -S harper-git # 或 yay -S harper-git等等Nixpkgs / NixOSHarper 已进入 Nixpkgs可按常规方式安装harper包例如加入environment.systemPackages也可以在临时 shell 中试用nix-shell -p harper如果已启用nix-command与flakes实验特性nix shell nixpkgs#harperTermuxAndroid使用内置包管理器apt install harperCargo如果已安装 Rust可直接从 crates.io 安装cargo install harper-ls --locked注意需确保~/.cargo/bin在系统$PATH中Debian 系 Linux 可能需要先安装build-essential项目仅支持最新稳定版 Rust可用rustc --version与官方发布页对比确认。GitHub Releases若以上方式均不可用官方还提供预编译的可移植二进制文件GitHub Releases 页面。三、四层词典体系harper-ls拥有四种词典用户词典user、工作区词典workspace、文件本地词典file-local与静态词典static。拼写检查时四层词典被合并后协同工作。从源码看合并逻辑位于 backend.rs 的 generate_file_dictionary// 全局词典 内置静态词典 用户词典 工作区词典 let mut dict MergedDictionary::new(); dict.add_dictionary(FstDictionary::curated()); let user_dict self.load_user_dictionary().await; dict.add_dictionary(Arc::new(user_dict)); let ws_dict self.load_workspace_dictionary().await; dict.add_dictionary(Arc::new(ws_dict)); // 文件本地词典在 generate_file_dictionary 中最后并入也就是说每个被检查的文件实际使用的是「静态 用户 工作区 文件本地」的MergedDictionary。3.1 用户词典User Dictionary每个harper-ls用户拥有独立词典在第一次向其中添加单词时按需创建。默认位置如下操作系统位置Linux$XDG_CONFIG_HOME/harper-ls/dictionary.txt或$HOME/.config/harper-ls/dictionary.txtmacOS$HOME/Library/Application Support/harper-ls/dictionary.txtWindows%FOLDERID_RoamingAppData%/harper-ls/dictionary.txt该词典是纯文本、按行分隔的单词列表可自由增删单词拼写错误上的代码操作可以把单词加入此列表其位置也可通过 目录配置 定制userDictPath。3.2 工作区词典Workspace Dictionary每个使用harper-ls的工作区拥有独立词典默认位于工作区根目录的.harper-dictionary.txt。这一默认值可以在 config.rs 的 Default 实现 中确认workspace_dict_path: .harper-dictionary.txt.into(),格式同样是按行分隔的纯文本单词列表位置可通过workspaceDictPath配置覆盖。3.3 文件本地词典File-Local Dictionary当你遇到只在某个特定文件上下文内才成立的词或专有名词时可通过代码操作将其加入文件本地词典。加入后这些单词仅在拼写检查该特定路径的文件时才会进入合并词典。默认存放目录各操作系统操作系统位置Linux$XDG_DATA_HOME/harper-ls/file_dictionaries或$HOME/.local/share/harper-ls/file_dictionariesmacOS$HOME/Library/Application Support/harper-ls/file_dictionariesWindows%FOLDERID_LocalAppData%/harper-ls/file_dictionaries文件格式与用户词典相同位置同样可配置fileDictPath。实现上每个文件的词典文件是目录路径拼接文件 URI 映射后的文件名见 backend.rs 的 get_file_dict_path 与 io_utils.rs 的fileify_path因此不同文件的本地词典互不干扰。3.4 静态词典Static Dictionary静态词典编译进二进制文件中目前不可修改内容覆盖日常几乎可能遇到的所有单词。官方欢迎通过 PR 或 issue 提交新词提交前请先阅读官方文档中的词典贡献说明。四、代码操作Code Actionsharper-ls提供代码操作帮助你快速处理拼写或语法错误。以下示例假设你把 contained 误拼为 containes 并已选中它代码操作 / 命令说明示例Quick Fixes为选中的错误提供修正建议Replace with: containedHarperIgnoreLint在当前会话内忽略选中的错误Ignore Harper error.HarperAddToUserDict将选中的单词加入用户词典Add containes to the user dictionary.HarperAddToWSDict将选中的单词加入工作区词典Add containes to the workspace dictionary.HarperAddToFileDict将选中的单词加入文件本地词典Add containes to the file dictionary.从源码看这些操作在 backend.rs 的 execute_command 中逐一实现以HarperAddToUserDict为例命令会加载用户词典 →append_word追加单词 → 保存词典文件 → 重新解析文档并立即发布新诊断所以点击操作后错误提示会立刻刷新。每个 Quick Fix 动作还会附带一个HarperRecordLint命令见 diagnostics.rs用于把采纳的修正记录到统计文件最终在shutdown时由save_stats落盘。五、忽略注释Ignore Commentsharper-ls支持跳过包含以下任一标记的注释块harper:ignoreharper: ignorespellcheck:ignorespellcheck: ignorespell-checker:ignorespell-checker: ignorespellchecker:ignorespellchecker: ignore后四种与 CSpell 的忽略注释相同这是有意为之——方便用户同时使用 Harper 与 CSpell。这一行为在源码中的实现位置是 harper-comments/src/masker.rsCommentMasker在生成注释掩码时若注释文本命中ignore_condition即包含上述任一标记该注释段就整体从检查范围中剔除。官方文档给出的示例// harper:ignore this line will not be spellcheckd function sample() { // harper: ignore // This line and any other line after it // will also not be spellcheckd // including this this one }在上述示例中spellcheckd、this this 等拼写或语法错误都不会被标记。仓库中还有各语言的忽略注释测试用例可作参照例如 ignore_comments.c、ignore_comments.rs、ignore_comments.ps1 等。六、配置harper-ls期望一个包含harper-ls键的 JSON 对象所有配置放在该键之下{ harper-ls: { // Your config goes here... } }这一约定在源码中是硬性要求Config::from_lsp_config 会校验根对象并取出harper-ls键缺失时直接报错Settings must contain a harper-ls key.。6.1 目录配置Directories配置项类型默认值说明userDictPathstring设置用户词典的文件路径workspaceDictPathstring设置工作区词典的文件路径fileDictPathstring设置文件本地词典所在目录ignoredLintsPathstring设置已忽略 lint 列表所在目录这些路径始终相对于harper-ls所在工作区的根目录解析。源码中每个路径都经过path.try_resolve_in(workspace_root)处理config.rs L102-L149空字符串则回退到Default实现中的系统默认值。6.2 Linters 配置Linter 开关位于linters键下{ harper-ls: { linters: { // Your linter configs go here... } } }各 linter 的完整清单与说明见官方规则页rules。所有 linter 均为boolean类型。以下示例展示了部分 linter 及其默认值{ harper-ls: { linters: { SpellCheck: true, SpelledNumbers: false, AnA: true, SentenceCapitalization: true, UnclosedQuotes: true, WrongApostrophe: false, LongSentences: true, RepeatedWords: true, Spaces: true, CorrectNumberSuffix: true } } }从源码看该对象被反序列化为harper_core的FlatConfigconfig.rs L159-L161随后通过LintGroup::new_curated(...).with_lint_config(...)应用见 backend.rs L291-L310。未显式指定的 linter 保持各自默认值。6.3 Code Actions 配置位于codeActions键下{ harper-ls: { codeActions: { // Your code action configs go here... } } }配置项类型默认值说明ForceStablebooleanfalse将代码操作固定到稳定位置把始终应可用的操作如把拼错的单词加入词典排在前面实现细节在 diagnostics.rs当force_stable为真时动作列表整体reverse()使词典类稳定操作从末尾翻转到列表头部默认顺序中它们排在 Quick Fix 建议之后。该配置最初源于上游 issue #89见 config.rs 中 CodeActionConfig 的注释。6.4 Markdown 配置位于markdown键下{ harper-ls: { markdown: { // Your Markdown configs go here... } } }配置项类型默认值说明IgnoreLinkTitlebooleanfalse跳过对链接标题的检查源码中对应 config.rs 对 markdown.IgnoreLinkTitle 的解析写入MarkdownOptions后传给 Markdown / Quarto / Literate Haskell 等解析器。6.5 其他配置配置项类型默认值说明diagnosticSeverityerror、hint、information、warninghint诊断在编辑器中显示的严重程度isolateEnglishbooleanfalse在英语与其他语言混合的文档中仅检查英文文本。该功能极新且不稳定不能保证完美工作dialectAmerican、British、Australian、Canadian、IndianAmerican设置 Harper 期望的英语方言maxFileLengthnumber120000允许检查的文件最大长度字节。超出该值则不检查excludePatternsarray[]忽略规则的 glob 集合文件命中任一 glob 则不检查默认值均可在 config.rs 的 Default for Config 中逐一对应验证。两个值得注意的源码细节maxFileLength的语义backend.rs L418-L426 中超过长度的文档被替换为Document::default()即主动清空而非保留旧诊断防止文件超长后旧 lint 与文档失去同步excludePatterns使用globset构建GlobSetconfig.rs L193-L208匹配失败或格式非法的 glob 会导致配置解析报错。6.6 源码中额外提供的配置项除官方文档列出的配置外从 config.rs 的解析逻辑还能看到两个同样有效的键以当前仓库源码为准配置项类型默认值说明statsPathstring数据目录下harper-ls/stats.txt统计记录的落盘位置同样相对工作区根解析diagnosticDelayMsnumber0停止输入后延迟多少毫秒再发布诊断0表示立即发布见 backend.rs 的 schedule_diagnostics配置测试用例位于 config.rs 的 tests 模块七、支持的语言harper-ls支持大量编程语言与标记语言。完整列表含 LSP Language ID 与是否仅注释语言Language ID仅注释AsciiDocasciidocCc✅Clojureclojure✅CMakecmake✅Ccpp✅C#csharp✅DAMLdaml✅Dartdart✅Elixirelixir✅Git Commitgit-commit/gitcommitGleamgleam✅Gogo✅Groovygroovy✅Haskellhaskell✅HTMLhtmlInkinkJavajava✅JavaScriptjavascript✅JavaScript Reactjavascriptreact✅Jujutsu Descriptionjj-commit/jjdescriptionKotlinkotlin✅Literate Haskelllhaskell/literate haskellLualua✅EmailmailMarkdownmarkdownNixnix✅Org ModeorgPHPphp✅PowerShellpowershell✅Plain Textplaintext/textPythonpython✅Rubyruby✅Rustrust✅Scalascala✅Shell/Bash Scriptshellscript✅Soliditysolidity✅Swiftswift✅TOMLtoml✅TypeScripttypescript✅TypeScript Reacttypescriptreact✅TypsttypstZigzig✅LaTeX/TeXlatex/tex/plaintex仅注释的语言依赖 harper-comments 中的 tree-sitter 注释解析器只提取注释文本参与检查其余源码被掩膜mask掉。从源码结构看backend.rs 的 update_document非注释语言的标识符还可以自动进入标识符词典CollapseIdentifiers/create_ident_dict使检查器不把代码符号误判为拼写错误。若希望新增语言支持可参考官方 issue#79的讨论。八、小结与源码索引harper-ls将 Harper 的核心检查能力封装为标准 LSP 服务安装后即可在编辑器中开箱获得多语言注释与 Markdown 的拼写、语法检查并通过四层词典 代码操作 忽略注释 细粒度 JSON 配置形成完整工作流。深入阅读时建议按以下路径入手harper-ls/src/main.rs进程入口stdio / TCP 两种传输模式harper-ls/src/backend.rsLSP 主实现词典合并、诊断发布、命令执行harper-ls/src/config.rs全部配置项的解析与默认值harper-ls/src/diagnostics.rslint → 诊断 / 代码操作的转换harper-comments/src/masker.rs注释掩膜与harper:ignore系列标记的实现。【免费下载链接】harperOffline, privacy-first grammar checker. Fast, open-source, Rust-powered项目地址: https://gitcode.com/GitHub_Trending/har/harper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考