๐ Bug fix: Fix silent spell-check disable when ltex.language = "auto" is used with an HTTP LanguageTool backend (including the free and premium public servers). Previously, LTEX resolved "auto" locally using LanguageToolโs lightweight SimpleLanguageIdentifier, which returns only bare codes like en, de, pt. For three LT-registered bases (en, de, pt) the bare Language subclass is a grammar-only umbrella with no spell dictionary, so spell-check was silently skipped for English/German/Portuguese text โ other LT bases like es, fr, it are full checkers in their bare form and were not affected. Now "auto" is forwarded to the HTTP server together with a new ltex.preferredVariants setting (default ["en-US", "de-DE", "pt-BR"], specifically covering those three bare-insufficient bases), so the serverโs own ngram/fasttext detector picks a concrete variant and spell-check runs. Other LT bases are deliberately omitted from the defaults because adding their variants would silently enable regional grammar rules (e.g. Argentinian voseo for es-AR) for everyone writing that language. The responseโs language.code is recorded on the code fragment so per-language code actions (add-to-dictionary, disable-rule, hide-false-positive) key correctly. For the local Java backend, bare detected codes are promoted to the first matching ltex.preferredVariants entry before the LanguageTool interface is built. Word completion (CompletionListProvider) applies the same promotion so the bundled completionList.<variant>.txt resource is found. โ Andrea Alberti (@alberti42)
๐ Bug fix: Fix per-language ltex.dictionary, ltex.disabledRules, and ltex.hiddenFalsePositives entries being silently ignored when ltex.language = "auto" is used with an HTTP LanguageTool backend. On the HTTP path, settings.languageShortCode stays at the literal "auto" for the whole session (only the per-fragment code gets back-filled from the server response), but match-filtering looked up the per-language maps with settings.languageShortCode as the key โ so the lookup always hit the empty "auto" bucket and entries stored under the concrete variant (e.g. ltex.dictionary["en-US"]) were never applied. Clicking โAdd to dictionaryโ persisted correctly but every subsequent recheck re-flagged the word. Lookups now key on the fragmentโs resolved language code, so per-language settings take effect on the first check. The Java backend was unaffected because it rewrites settings.languageShortCode to the resolved variant before the check. โ Andrea Alberti (@alberti42)
๐ Bug fix: Normalize ltex.language input so regional variants (e.g. fr-FR, it-IT, es-ES) are mapped to the registered LanguageTool tag rather than silently disabling checking. Also accepts case variants of the "auto" sentinel ("Auto", "AUTO") and trims leading/trailing whitespace. โ Andrea Alberti (@alberti42)
๐ Bug fix: Offer the โAdd to dictionaryโ code action for spell-check matches produced by LanguageToolโs QB_NEW_*_ORTHOGRAPHY_*, AI_*_GGEC_REPLACEMENT_ORTHOGRAPHY_*, and ES_SIMPLE_REPLACE_* rule families (Premium/HTTP tier plus Spanish common-typo rules). โ Andrea Alberti (@alberti42)
๐ Bug fix: Markdown: accept spaces and backslashes inside angle-bracketed link destinations (e.g. [text](<path with spaces.pdf>) or Windows-style [text](<C:\Users\My Documents\file.pdf>)), so the link is recognized and surrounding punctuation does not leak into spell-checked text. โ Andrea Alberti (@alberti42)
๐ Bug fix: Set CompletionItemKind.Text on dictionary completion items. Previously items carried only a label, leaving kind null; clients that map kinds to icons (VS Code, lsp-mode + Corfu, others) fell through to a generic placeholder icon, making LTEX+ word completions look distinct from every other text-based completion source. โ Andrea Alberti (@alberti42)
๐ Bug fix: Allow textDocument/completion at the very last position of a document. The fragment lookup and prefix scan both used a strict < against code.length, so a cursor sitting one past the last character (an unterminated document with no trailing whitespace) produced an empty list. Loosened both checks to treat the position immediately after the last character as a valid completion site. โ Andrea Alberti (@alberti42)
๐ Bug fix: Make the markup parser linear instead of quadratic in document length. The shared character-driven loop in CharacterBasedCodeAnnotatedTextBuilder tries on the order of 20โ25 anchored regexes per character; the previous implementation called regex.find(this.code.substring(pos)) on every attempt, allocating a fresh String of (code.length − pos) bytes solely to give the leading ^ a position-0 to anchor against. On large documents this byte-copying cost dominated parse time. Replaced the substring with Matcher.region(pos, code.length).lookingAt(), which anchors at pos directly via the JDKโs region API, and wrapped the result in a small adapter that preserves the existing MatchResult semantics so no caller had to change. Measured on a 135 KB org file with all fragments enabled: warm latency drops from ~3.1 s to ~0.23 s (~14ร faster). Every fragmentized language (LATEX, Markdown, HTML, AsciiDoc, reStructuredText, Typst, org, โฆ) shares the base class and benefits. โ Andrea Alberti (@alberti42)
๐ Bug fix: Donโt parse regions of the document the user has disabled with a magic comment (e.g. # ltex: enabled=false in org, % ltex: enabled=false in LATEX, etc.). Previously the language-specific parser ran over every fragment, including disabled ones, and the result was discarded just before the LanguageTool check. On documents where most of the body sits behind such a directive this dominated request latency: a 135 KB org file with ~130 KB hidden behind enabled=false took ~3 s warm and now takes ~25โ55 ms โ about the same as if the disabled tail werenโt there at all. The optimization lives in the shared check pipeline and benefits every fragmentized language (LATEX, Markdown, HTML, AsciiDoc, reStructuredText, Typst, org, gitcommit, BibTEX, โฆ). โ Andrea Alberti (@alberti42)
๐ Bug fix: Org: donโt flag the wrapped half of a list item for โfirst letter not uppercaseโ. Previously every list-item line emitted a paragraph break at end-of-line, so a continuation line indented to the bullet body (e.g. + A long sentence that wraps\n onto the next line.) was sent to LanguageTool as a fresh paragraph and its lowercase first word was flagged. The parser now tracks the bullet body column and, when the next line is a true wrap (indented past the bullet and not itself a new bullet), suppresses the paragraph break so the wrap stays in the same paragraph. โ Andrea Alberti (@alberti42)
๐ Bug fix: Org: spell-check the term in description lists. The prefix of a description-list item (e.g. - Apple :: a red fruit) used to be consumed as one chunk of markup, which silently dropped the term (โAppleโ) on the floor โ typos in it went unnoticed. The parser now splits the prefix into bullet, term (text), and ` :: separator, so the term reaches LanguageTool and is spell- and grammar-checked like any other word. A single \n` separator keeps the term in the same LanguageTool paragraph as the description, so the descriptionโs lowercase first word (โa red fruitโ) is not flagged. โ Andrea Alberti (@alberti42)
๐ง Change: Update bundled Java runtime from 21.0.4+7 to 21.0.5+11. No separate beta Java runtime build is required anymore for Windows aarch64.
โจ New: Add support for Neorg (LSP language ID neorg) โ ltex-ls-plus#55
โจ New: Add support for \NewDoumentCommand, \NewDocumentEnvironment, \NewExpandableDocumentCommand, \NewCommandCopy, \NewEnvironmentCopy, \IfNoValueTF, \IfValueTF, \IfBlankTF, \IfBooleanTF and many more (LATEX) โ ltex-ls-plus#69
โจ New: Add support for AsciiDoc (LSP language IDs asciidoc) โ vscode-ltex-plus#128
๐ Bug fix: Fix false positives in Typst โ ltex-ls-plus#72
๐ Bug fix: Ignore code blocks and raw text in Typst โ ltex-ls-plus#74
๐ง Change: Update from Java 11 to 21. Be aware: Starting from LTEX+ LS 18.0.0, Java 21 or higher is required!
โจ New: Add arm64/aarch64 Java runtimes for Linux (e.g. Raspberry Pi), macOS (Apple M1 SoC and its successors) and Windows on ARM.
17.0.1 (August 29, 2024)
๐ Bug fix: Silence output to stdout caused by LanguageTool. This issue caused a crash of LTEX+ LS on Linux systems. Itโs a similar issue to https://github.com/valentjn/vscode-ltex/issues/68
17.0.0 (August 24, 2024)
๐ง Change: Rename to LTEX+ LS
๐ง Change: Update bundled Java runtime to 11.0.24+8
16.0.0 (March 19, 2023)
๐ง Change: Update LanguageTool to 6.0 (see LT release notes of 5.6, 5.7, 5.8, 5.9, and 6.0)
โจ New: Add support for Git commit messages (LSP language IDs git-commit and gitcommit) โ valentjn/ltex-ls#132
๐ง Change: Refactor CLI into ltex-cli; --input-documents and --setings-file are deprecated and will be removed in a future release
โจ New: Add support for automatic language detection via language short code auto; language variants like en-US are not detected, only generic languages like en; this will result in spelling errors not being reported โ valentjn/ltex-ls#103
โจ New: Provide ID of LanguageTool rule via diagnostics code, not as part of diagnostics message
โจ New: Link diagnostics to LanguageTool website with more information
โจ New: Add support for the main option of the babel package (LATEX) โ valentjn/vscode-ltex#391
โจ New: Add setting ltex.ltex-ls.languageToolOrgUsername to set username on languagetool.org for Premium API access โ valentjn/vscode-ltex#398
โจ New: Add setting ltex.ltex-ls.languageToolOrgApiKey to set API key on languagetool.org for Premium API access โ valentjn/vscode-ltex#398
โจ New: Add support for ltex.dictionary when using a LanguageTool HTTP server
๐ง Change: Handle disabled rules ourselves to prevent reinitialization of LanguageTool when running the Disable rule quick fix โ valentjn/vscode-ltex#390
๐ Bug fix: Fix LanguageTool reinitialized when running the Add '...' to dictionary quick fix โ valentjn/vscode-ltex#390
๐ Bug fix: Fix wrong parsing of inline math formulas in Markdown when using dollar signs as delimiters and containing only one character (e.g., $a$)
๐ Bug fix: Fix used i18n keys removed
๐ Bug fix: Fix fallback from German to English i18n
๐ง Change: For binary archives, migrate from AdoptOpenJDK JREs to own Java runtime generated from Eclipse Adoptium JDKs
โจ New: Add support for more LATEX commands (\mathop, \overline, \tilde, \alpha, etc.) for automatic vowel detection in formulas in LATEX โ valentjn/ltex-ls#92, Shuhao Cao (@scaomath)
๐ง Change: Ignore non-object values for InitializeParams.initializationOptions โ valentjn/ltex-ls#65
10.0.0 (February 12, 2021)
๐ Removal: Remove support for settings that are deprecated since 8.0.0: ltex.ignoreInRuleSentence, ltex.commands.ignore, ltex.commands.dummy, ltex.environments.ignore, ltex.markdown.ignore, and ltex.markdown.dummy
๐ง Change: Replace ltex/serverStatus request with ltex.getServerStatus command
โจ New: Add support for magic comments inside HTML comments in Markdown (<!-- ltex: SETTINGS -->)
โจ New: Check documents even if their code language is not supported
๐ Bug fix: Fix comment sign before babel commands not recognized โ valentjn/vscode-ltex#245
๐ Bug fix: Fix removing items in settings with a hyphen prefix sometimes not working
๐ Bug fix: Fix space not added between two arguments of LATEX commands
๐ Bug fix: Fix manually checking BibTEX documents not working
๐ Bug fix: Fix words in dictionary containing markup not recognized
9.2.0 (January 29, 2021)
โจ New: Add support for Pandoc-style inline math ($...$) and display math ($$...$$ with $$ being at the beginning/end of a Markdown block) to Markdown parser โ valentjn/vscode-ltex#210
๐ Bug fix: Fix false positives for words added by Add to dictionary for Slovak rule IDs MUZSKY_ROD_NEZIV_A, ZENSKY_ROD_A, and STREDNY_ROD_A โ valentjn/vscode-ltex#221
๐ Bug fix: Fix BibTEX field seealso not ignored, ignore category and parent โ valentjn/vscode-ltex#211
๐ง Change: Move rule ID to the end of diagnostic messages as VS Code truncates the messages if the Problems panel is narrow โ valentjn/vscode-ltex#233
๐ Bug fix: Fix regression that messages of possible spelling mistakes are not prepended with the respective unknown words โ valentjn/vscode-ltex#161
๐ Bug fix: Fix crash when using \begin or \end without an argument โ valentjn/vscode-ltex#236
๐ง Change: Change $/progress tokens to include a UUID instead of a counter
โจ New: Add customCapabilities in InitializeParams.initializationOptions
๐ Removal: Remove unneeded command arguments type and command
๐ง Change: Replace \dots with Unicode ellipsis … instead of three dots ... to fix some false positives
โจ New: Add documentation
8.1.1 (November 24, 2020)
๐ง Change: Migrate from Travis CI to GitHub Actions
8.1.0 (November 15, 2020)
๐ง Change: Prepend messages of possible spelling mistakes with the respective unknown words โ valentjn/vscode-ltex#161
โจ New: Add support for optional arguments of \newtheorem
๐ Bug fix: Fix wrong position of diagnostics when using a recognized LATEX command with a non-recognized set of arguments due to an infinite loop โ valentjn/vscode-ltex#167
โจ New: Add workaround to eliminate the need for workspace-specific setting names; ltex.dictionary, ltex.disabledRules, and ltex.enabledRules can now be used in multiple setting scopes (user settings, workspace settings, and workspace folder settings) at the same time without overriding each other; instead, the settings of the different scopes will be properly merged (see documentation)
โจ New: Add support for \usepackage[LANGUAGE]{babel} if in the same file as the text to be checked โ valentjn/vscode-ltex#140
โจ New: Add support for more BibLATEX commands such as \autocite, \citeauthor, etc. โ valentjn/vscode-ltex#143
โจ New: Add support for overriding hard-coded command signatures โ valentjn/ltex-ls#27
๐ง Change: Move handling of external setting files from ltex-ls to vscode-ltex
๐ง Change: Increase duration before sentences expire in the result cache to 60 minutes
๐ Bug fix: Fix many settings changes cleared sentence cache, which led to performance issues, e.g., changing the ltex.enabled setting via magic comments โ valentjn/vscode-ltex#134
๐ Removal: Remove dependency on org.apache.httpcomponents:httpclient by using the HTTP client that comes with Java 11 when connecting to an HTTP LanguageTool server
7.3.1 (October 12, 2020)
๐ Bug fix: Fix delayed publication of diagnostics by adding workaround to guess the caret position
๐ Bug fix: Fix recheck being triggered when generating list of quick fixes; this should improve speed
7.3.0 (October 10, 2020)
โจ New: Add support for \ell as well as \mathcal, \mathfrak, etc. to vowel detection โ valentjn/vscode-ltex#131
โจ New: Add setting ltex.ltex-ls.logLevel to control the verbosity of the server log
๐ Bug fix: Fix diagnostics sometimes not lined up with the text with switching back from incremental to full document updates; unfortunately, this disables the delayed publication of diagnostics at the caret position
๐ง Change: Restructure and simplify internal quick fix and command structure, removing the need for pseudo-telemetry notifications
๐ Bug fix: Fix performance issue with multiple languages in one document via magic comments due to LanguageTool being reinitialized on each keystroke โ valentjn/vscode-ltex#124
7.1.1 (September 20, 2020)
๐ Bug fix: Fix NullPointerException when supplying relative paths to external dictionary files
โจ New: Add settings ltex.workspaceDictionary, ltex.workspaceDisabledRules, and ltex.workspaceEnabledRules with window scope to amend the corresponding user-specific settings; these are workspace-specific settings that should be configured in workspace settings
โจ New: Add settings ltex.workspaceFolderDictionary, ltex.workspaceFolderDisabledRules, and ltex.workspaceFolderEnabledRules with resource scope to amend the corresponding user-specific and workspace-specific settings; these are workspace-folder-specific settings that should be configured in workspace folder settings
๐ง Change: Delay diagnostics at the current caret position (e.g., incomplete word or sentence) until the user has finished typing โ valentjn/vscode-ltex#46
๐ Bug fix: Fix wrong language-dependent settings used for magic comments
๐ Bug fix: Fix add to dictionary and disable rule quick fixes using wrong language when used with magic comments
๐ Bug fix: Improve code quality by fixing hundreds of Checkstyle, SpotBugs, and Checker Framework warnings
๐ง Change: Migrate from Gradle to Maven
๐ง Change: Update Maven dependencies
5.0.0 (June 1, 2020)
โจ New: Include all languages in LTEX LS; this removes the need for language support extensions โ valentjn/vscode-ltex#6
๐ง Change: Adhere to semantic versioning. This means that the version of LTEX LS is not tied to the version of LanguageTool anymore, as the version of LanguageTool is not a semantic version. LTEX LS 5.0.0 uses LanguageTool 4.9.
๐ง Change: Rename ltex.<LANGUAGE>.dictionary โ ltex.dictionary (object with <LANGUAGE> keys)
๐ง Change: Rename ltex.<LANGUAGE>.disabledRules โ ltex.disabledRules (object with <LANGUAGE> keys)
๐ง Change: Rename ltex.<LANGUAGE>.enabledRules โ ltex.enabledRules (object with <LANGUAGE> keys)
โจ New: Add support for more BibLATEX citation commands, add support for plural dummies, add support for \eg, \egc, \ie, \iec โ valentjn/vscode-ltex#43
โจ New: Add visual feedback in status bar during startup and checks that take a long time
๐ Removal: Remove null types and default values from settings, use empty string/array/object instead โ valentjn/vscode-ltex#41
๐ง Change: Use proper server/client model for language server/client
๐ง Change: Make documentation of vscode-ltex more extensive, put it on own website
4.9.3 (May 7, 2020)
๐ง Change: Revert to Java 8
๐ Removal: Remove support for external LanguageTool HTTP servers
4.9.2 (May 6, 2020)
๐ง Change: Update required version of Java (now 11 or newer)
๐ Bug fix: Fix \dots in math mode being interpreted as ...
4.7.9 (February 29, 2020)
๐ง Change: Update Markdown parser Flexmark to 0.60.2; this increases the speed of parsing Markdown
โจ New: Add possibility to ignore Markdown elements or replace them by dummy words via ltex.markdown.ignore and ltex.markdown.dummy โ valentjn/vscode-ltex#26
๐ง Change: Ignore Markdown code blocks by default
๐ง Change: Replace auto-links and inline Markdown code with dummy words by default
๐ Bug fix: Fix match positions were sometimes off by one, especially in Markdown documents
โจ New: Support multi-root workspaces, all configuration settings except ltex.enabled are now resource-specific โ valentjn/vscode-ltex#7
๐ง Change: Save dictionary settings under full language short code (e.g., en-US instead of en). If you already have a dictionary under ltex.en.dictionary and use en-US as language (not en), you have to rename the settings name to ltex.en-US.dictionary (similarly for other languages).
๐ Removal: Remove diagnostics when a file is closed
๐ Bug fix: Prevent insertion of text in TikZ mode
โจ New: Add support for more commands such as \newenvironment, \newgeometry, and \pagenumbering
4.6.13 (September 26, 2019)
๐ Bug fix: Fix LTEX LS not reinitialized after a language extension has been installed (which was missing during initialization)
4.6.12 (September 25, 2019)
๐ Bug fix: Patch LanguageToolโs AnnotatedText with linear interpolation to hopefully fix the fromPos must be less than toPos LT errors for good
๐ Bug fix: Fix \footnote in math mode messed up text mode and math mode
๐ง Change: Increase robustness in case locale or settings are not provided
๐ง Change: Ignore all brace and bracket arguments after \begin{environment} (tabular, array, etc.)
โจ New: Add support for some more commands and environments such as \pagestyle and eqnarray
4.6.11 (September 23, 2019)
๐ Bug fix: Detect and prevent infinite loops in LatexAnnotatedTextBuilder
๐ Bug fix: Fix infinite loop with other line endings than \n
๐ Bug fix: Fix some more fromPos must be less than toPos LT errors
๐ง Change: Check for interrupts to avoid 100% CPU usage on timeout (this doesnโt fix any bugs though)
โจ New: Add support for \email, \href, and \verb|...|
โจ New: Add support for more citation commands (\citep, \citet, etc.)
โจ New: Add support for float/theorem definition commands and starred sectioning commands
4.6.10 (September 18, 2019)
๐ Bug fix: Fix NullPointerException if LanguageTool has not been initialized โ valentjn/ltex-ls#1