格檢查:Harper 集成完整配置指南)
桌面應(yīng)用【免費下載鏈接】QOwnNotesQOwnNotes is a plain-text file notepad and todo-list manager with Markdown support and Nextcloud / ownCloud integration.項目地址https://gitcode.com/gh_mirrors/qo/QOwnNotes點擊查看免費下載QOwnNotes 通過內(nèi)置的 Harper 支持在筆記編輯器中提供可選的離線語法與風(fēng)格檢查offline grammar and style checking基于harper-ls語言服務(wù)器在本地完成檢測無需把筆記內(nèi)容發(fā)送到任何外部服務(wù)。本文將帶你完成 Harper 的啟用、運輸方式Transport選擇、方言與 Linter 配置、連接測試并從源碼層面剖析它的工作機(jī)理幫助你把這套檢查能力無縫接入自己的寫作流程。Harper 與現(xiàn)有拼寫檢查的關(guān)系Harper 并不是用來替代 QOwnNotes 原有拼寫檢查spellchecking的而是作為其補(bǔ)充拼寫檢查負(fù)責(zé)基礎(chǔ)拼寫糾錯Harper 更進(jìn)一步覆蓋語法、風(fēng)格、標(biāo)點與措辭層面的問題。在 README 中QOwnNotes 將 Harper 與 LanguageTool、Markdown LSP 并列介紹三者同屬于編輯器可選的語法/風(fēng)格檢查能力。核心功能根據(jù) Harper 文檔 與源碼實現(xiàn)該功能包含以下能力彩色下劃線標(biāo)注語法、風(fēng)格、標(biāo)點、措辭問題按類別用不同顏色顯示在編輯器內(nèi)右鍵菜單替換建議右鍵點擊問題文本即可看到候選替換詞忽略機(jī)制支持Ignore this rule忽略某條規(guī)則與Ignore word忽略某個單詞操作快速開關(guān)Edit編輯菜單提供Check grammar with Harper切換項完全本地檢查通過harper-ls語言服務(wù)器以Stdio或TCP方式通信全程無需聯(lián)網(wǎng)。設(shè)置步驟打開 QOwnNotes 的Settings設(shè)置選擇Editor - Harper即可看到 harpersettingswidget.ui 中定義的完整配置界面。1. 啟用功能勾選Enable offline grammar and style checking with Harper啟用 Harper 離線語法與風(fēng)格檢查。該開關(guān)對應(yīng)設(shè)置鍵harperEnabled默認(rèn)值為false源碼中由 harperchecker.cpp 的readSettings()讀取。同時Edit菜單中的Check grammar with Harper動作見 mainwindow.ui也會同步該開關(guān)狀態(tài)具體邏輯位于 mainwindow.cpp。2. 選擇運輸方式Transport選項說明默認(rèn)值Stdio (recommended)由 QOwnNotes 直接啟動本地harper-ls進(jìn)程對應(yīng)模式值 0推薦TCP連接一個已經(jīng)運行的harper-ls服務(wù)器對應(yīng)模式值 1—運輸方式保存在設(shè)置鍵harperTransportMode中。源碼層面harperclient.cpp 的ensureTransport()根據(jù)模式分別創(chuàng)建HarperStdioTransport基于QProcess或HarperTcpTransport基于QTcpSocket兩種傳輸實現(xiàn)。Stdio 模式參數(shù)Command / binary path命令/二進(jìn)制路徑默認(rèn)命令為harper-ls對應(yīng)設(shè)置鍵harperBinaryPathAuto-detect自動檢測通過QStandardPaths::findExecutable在系統(tǒng)PATH中查找harper-ls見 harpersettingswidget.cpp找到后會把完整路徑回填到輸入框Browse瀏覽手動選擇 Harper 可執(zhí)行文件。啟動時Stdio 傳輸會以harper-ls --stdio參數(shù)拉起子進(jìn)程并等待最多 2 秒確認(rèn)啟動成功harperclient.cpp。TCP 模式參數(shù)Server address服務(wù)器地址默認(rèn)127.0.0.1對應(yīng)設(shè)置鍵harperTcpAddressPort端口默認(rèn)4000對應(yīng)設(shè)置鍵harperTcpPortUI 中允許的范圍為 1~65535。TCP 連接等待超時同為 2 秒連接失敗時會記錄下一次重試時間當(dāng)前實現(xiàn)為失敗后等待 2 秒再重連見ensureStarted()。3. 選擇方言DialectDialect下拉框提供 5 種英語方言選項American美式默認(rèn)British英式Australian澳式Canadian加式Indian印式方言值保存在harperDialect中會作為dialect字段寫入發(fā)送給harper-ls的配置harperclient.cpp。4. 調(diào)整檢查延遲Check delayCheck delay檢查延遲控制 QOwnNotes 在停止輸入后、發(fā)起檢查請求前等待的毫秒數(shù)。UI 中可調(diào)范圍為500~5000 ms步長 100 ms默認(rèn) 1500 ms對應(yīng)設(shè)置鍵harperCheckDelay。底層通過單次定時器QTimer實現(xiàn)防抖debounce并在設(shè)置讀取時把定時器間隔同步為該值harperchecker.cpp。5. 選擇啟用的 Linter以下 12 個 Linter 均可獨立勾選源碼中的內(nèi)部標(biāo)識見括號UI 名稱內(nèi)部標(biāo)識Spell Check拼寫檢查SpellCheckSentence Capitalization句首大寫SentenceCapitalizationRepeated Words重復(fù)單詞RepeatedWordsLong Sentences長句LongSentencesAn vs A冠詞 a/an 選擇AnAUnclosed Quotes未閉合引號UnclosedQuotesCorrect Number Suffix數(shù)字后綴糾正CorrectNumberSuffixSpaces空格SpacesQuote Spacing引號間距QuoteSpacingNo French Spaces無法語空格NoFrenchSpacesWrong Apostrophe錯誤撇號WrongApostropheSpelled Numbers拼寫數(shù)字SpelledNumbers默認(rèn)啟用SpellCheck、AnA、SentenceCapitalization、RepeatedWords、LongSentences、Spaces、QuoteSpacing、NoFrenchSpaces、WrongApostrophe、CorrectNumberSuffix、UnclosedQuotes這 11 項SpelledNumbers默認(rèn)關(guān)閉完整默認(rèn)列表見 harperchecker.cpp。勾選結(jié)果保存在harperEnabledLinters中并在發(fā)送配置時以布爾開關(guān)形式寫入 LSP 的linters配置對象。6. 測試連接點擊Test Connection按鈕驗證配置是否可用Stdio 模式下會嘗試啟動harper-lsTCP 模式下會嘗試連接配置的服務(wù)器測試時會發(fā)送一段固定測試文本This are a test sentence.harpersettingswidget.cpp收到checkFinished信號則彈窗提示連接成功并附帶服務(wù)器版本號收到checkError則提示連接失敗原因。頁面底部還有一個Status狀態(tài)區(qū)Stdio 模式下會顯示找到的harper-ls路徑與版本通過執(zhí)行harper-ls --version查詢TCP 模式下顯示目標(biāo)地址與端口。7. 管理忽略項設(shè)置頁提供兩個重置按鈕Reset ignored rules重置忽略的規(guī)則清除所有通過右鍵菜單Ignore this rule忽略的規(guī)則Reset ignored words重置忽略的單詞清除所有通過右鍵菜單Ignore word忽略的單詞。兩者點擊后均會彈出確認(rèn)對話框。忽略的規(guī)則保存在harperIgnoredRules、忽略的單詞保存在harperIgnoredWords中。值得注意的是忽略單詞時不僅會記錄到 Harper 自己的集合還會同步調(diào)用QOwnSpellChecker把該詞加入系統(tǒng)拼寫詞典harperchecker.cpp。工作原理Harper 在 QOwnNotes 中的工作流程由三個核心組件協(xié)作完成全部位于 services 目錄HarperCheckerharperchecker.h / harperchecker.cpp編輯器側(cè)的調(diào)度器負(fù)責(zé)決定檢查哪些內(nèi)容、何時發(fā)起請求、緩存與管理忽略項HarperClientharperclient.h / harperclient.cppLSP 客戶端負(fù)責(zé)與harper-ls的協(xié)議通信HarperMatchharpertypes.h表示單個檢查結(jié)果的數(shù)據(jù)結(jié)構(gòu)包含偏移量、長度、消息、規(guī)則 ID、規(guī)則類別、替換建議與上下文文本。只檢查可見區(qū)塊QOwnNotes 不會把整篇文檔一次性發(fā)給 Harper而是通過visibleBlocks()計算當(dāng)前視口viewport內(nèi)可見的文本塊harperchecker.cpp。滾動編輯器時也會觸發(fā)重新調(diào)度監(jiān)聽垂直滾動條的valueChanged。跳過無關(guān)內(nèi)容shouldCheckBlock()會跳過以下類型的文本塊harperchecker.cpp不可見或無效的塊空白行trim 后為空標(biāo)題行HeadlineEnd狀態(tài)代碼塊CodeBlock狀態(tài)以及 MarkdownHighlighter 中CodeCpp之后的所有代碼狀態(tài)。防抖與緩存防抖每次文本變化只啟動單次定時器間隔即設(shè)置中的Check delay避免每敲一個鍵就發(fā)一次請求區(qū)塊級緩存每個文本塊以其 SHA-1 哈希作為鍵緩存結(jié)果內(nèi)容未變化時直接復(fù)用緩存條目默認(rèn) TTL 為 300 秒、上限 500 條過期與超限條目會被清理cleanupExpiredCache()與enforceCacheLimit()結(jié)果有效性校驗請求返回時會重新計算文檔 SHA-1與提交時記錄的哈希比對若文檔在請求期間被修改則丟棄過期結(jié)果handleRequestFinished()。LSP 協(xié)議通信細(xì)節(jié)HarperClient 實現(xiàn)了標(biāo)準(zhǔn)的 Language Server ProtocolLSP2.0 流程包括初始化握手initialize/initialized并聲明textDocument/codeAction與workspace/configuration能力通過workspace/didChangeConfiguration下發(fā)方言與 Linter 配置用textDocument/didOpen打開一個虛擬 Markdown 文檔URI 形如file:///qownnotes-harper-id.mdlanguageId 為markdown接收textDocument/publishDiagnostics通知將行/列坐標(biāo)換算為絕對偏移構(gòu)造HarperMatch對每個診斷發(fā)起textDocument/codeAction請求從返回結(jié)果中解析Replace with: ...形式的替換建議decodeReplacementTitle()以及 workspace edit 中的newText所有請求帶 5 秒超時超時或服務(wù)異常時通過checkError信號通知上層。問題高亮與右鍵菜單著色QOwnNotesMarkdownHighlighter的highlightHarper()qownnotesmarkdownhighlighter.cpp根據(jù)ruleCategory決定下劃線顏色Spelling拼寫→ 紅色Style風(fēng)格→ 琥珀色#c99500Punctuation標(biāo)點→ 綠色#1c8f47Typography排版→ 紫色#7a3db8其余默認(rèn) Grammar 語法類→ 藍(lán)色#2a6fdb。 高亮采用SpellCheckUnderline波浪下劃線樣式并附帶問題消息作為 tooltip。右鍵菜單addHarperMenuSection()qownnotesmarkdowntextedit.cpp在光標(biāo)位置命中問題時會彈出菜單包含類別與規(guī)則名不可點擊的頭部、最多 8 條替換建議、Ignore this rule、Ignore word ...。選擇替換建議后通過applyHarperReplacement()以對應(yīng)位置范圍直接替換文本。不可用時的降級行為如果 Harper 無法啟動或連接如harper-ls未安裝QOwnNotes 會在狀態(tài)欄顯示帶警告圖標(biāo)的提示消息持續(xù)約 5 秒并通過connectionError信號通知隨后停止檢查直到服務(wù)恢復(fù)可用harperchecker.cpp。構(gòu)建前提Harper 支持是可選的取決于構(gòu)建時是否啟用該特性CMake 構(gòu)建src/CMakeLists.txt中定義HARPER_ENABLED選項默認(rèn)ONsrc/CMakeLists.txt啟用后通過target_compile_definitions(... HARPER_ENABLED)傳入編譯器qmake 構(gòu)建對應(yīng)源碼文件在 src/QOwnNotes.pro 中登記。若構(gòu)建未啟用該特性Settings - Editor - Harper頁面會顯示Harper support is not available in this build.且所有選項不可用Edit菜單中的Check grammar with Harper動作也會被隱藏mainwindow.cpp。與 LanguageTool 的關(guān)系Harper 與 LanguageTool 可以同時啟用。兩者的定位差異在于LanguageTool既可連接本地自托管服務(wù)也可連接遠(yuǎn)程服務(wù)如http://localhost:8081或https://api.languagetoolplus.com并支持按 Spelling/Grammar/Style/Punctuation/Typography 類別勾選Harper主打完全本地離線通過harper-ls以 Stdio 或 TCP 方式工作無需配置任何遠(yuǎn)程 URL。在實現(xiàn)上二者相互獨立分別由LANGUAGETOOL_ENABLED與HARPER_ENABLED編譯開關(guān)控制高亮渲染也走各自的管線因此可以放心疊加使用。常見問題harper-ls沒有找到先確認(rèn)已安裝 Harper 命令行工具并使其位于PATH中然后點擊設(shè)置頁的Auto-detect或使用Browse手動指定可執(zhí)行文件路徑。TCP 連接失敗確認(rèn)harper-ls已以 TCP 服務(wù)方式啟動、地址端口與設(shè)置一致默認(rèn)127.0.0.1:4000再用Test Connection驗證。修改配置后不生效HarperChecker 的scheduleCheck()每次觸發(fā)前都會調(diào)用readSettings()重新讀取設(shè)置因此改動保存后會在下一次檢查時自動生效。檢查結(jié)果沒有出現(xiàn)確認(rèn)已勾選啟用開關(guān)、對應(yīng)的 Linter 處于開啟狀態(tài)并且光標(biāo)所在文本塊不是標(biāo)題或代碼塊這些內(nèi)容會被有意跳過。相關(guān)文檔拼寫檢查LanguageTool 語法與風(fēng)格檢查Markdown LSPQOwnNotes 核心概念贊分享桌面應(yīng)用【免費下載鏈接】QOwnNotesQOwnNotes is a plain-text file notepad and todo-list manager with Markdown support and Nextcloud / ownCloud integration.項目地址https://gitcode.com/gh_mirrors/qo/QOwnNotes點擊查看免費下載相關(guān)推薦QOwnNotes 集成 Harper 離線語法與風(fēng)格檢查完整配置指南與 harper-ls 工作原理QOwnNotes 集成 Harper 離線語法與風(fēng)格檢查完整配置指南與 harper ls 工作原理 QOwnNotes 通過可選集成 Harper htt桌面應(yīng)用QOwnNotes 集成 Harper基于 harper-ls 的離線語法與風(fēng)格檢查配置指南QOwnNotes 集成 Harper基于 harper ls 的離線語法與風(fēng)格檢查配置指南 QOwnNotes 可在筆記編輯器中集成 Harper http桌面應(yīng)用QOwnNotes 集成 Harper離線語法與風(fēng)格檢查的配置與實現(xiàn)原理QOwnNotes 集成 Harper離線語法與風(fēng)格檢查的配置與實現(xiàn)原理 QOwnNotes 通過本地 harper ls 語言服務(wù)器提供可選的 離線語法與風(fēng)桌面應(yīng)用創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考