Download Latest Version Flycheck v39.0 source code.zip (2.5 MB) Google Add to Preferred Sources
Home / v39.0
Name Modified Size InfoDownloads / Week
Parent folder
Flycheck v39.0 source code.tar.gz 2026-08-10 2.3 MB
Flycheck v39.0 source code.zip 2026-08-10 2.5 MB
README.md 2026-08-10 37.6 kB
Totals: 3 Items   4.8 MB 1

New Features

  • #2336: Carry the rule ids yaml-actionlint, r-lintr and puppet-lint already print, so the error list shows which check fired and C-c ! e can explain lintr's linters through their reference pages; messages lose the bracketed or parenthesised id they used to carry inline.
  • #2335: Bring back the sass and scss checkers, on Dart Sass; the originals went out in 36.0 with the death of Ruby Sass. Compiling catches what stylelint alone does not, such as undefined variables and mixins; compile errors come first, deprecation warnings and @warn messages show as warnings, and a buffer that compiles cleanly enough is handed on to the stylelint checkers. Requires Dart Sass 1.74 or newer; on anything older the checkers disable themselves rather than fail every check (#1549).
  • #2334: Add a luau-analyze checker for the Luau language, using the analyzer that ships with Luau (originally proposed in #2167). It runs in the Lua major modes but only on .luau files, since the analyzer rejects plain Lua constructs like goto, and it checks the buffer through a copy next to the original, so the project's .luaurc applies to unsaved contents.
  • #2331: Add flycheck-jsonnet-ext-code-files to bind external code files (--ext-code-file) for the jsonnet checker (originally proposed in #1932).
  • #2329: Explain more checkers' diagnostics with C-c ! e: yaml-yamllint, terraform-tflint, ruby-reek, markdown-pymarkdown and javascript-oxlint now open the rule's documentation page.
  • #2322: textlint carries the fixes its fixable rules emit, such as common-misspellings, so C-c ! f applies them; its eslint-compatible output had the fixes all along, and now a spec keeps it that way.
  • #2319: markdown-markdownlint-cli now carries the fixes markdownlint suggests, so C-c ! f and C-c ! F apply them; the checker reads markdownlint's JSON output, and a rule configured with severity: warning now shows as a warning rather than an error.
  • #2156: Add OCaml checkers. ocaml-dune checks a Dune project with dune build @check, so references to sibling modules and to the project's dependencies resolve, and ocaml checks a standalone file with ocamlfind ocamlc. Flycheck picks between them by whether the file belongs to a Dune project, since the compiler on its own would report every reference to a sibling module as an unbound module.
  • #2157: Add a swift checker using swiftc -parse, which parses a file without type-checking it, so it is right for any Swift file whether or not it belongs to a package. Type errors need a language server that knows how the project is built, through global-flycheck-eglot-mode or flycheck-lsp-mode.
  • #2286: Make tcl-nagelfar configurable: flycheck-tcl-nagelfar-syntax-databases lists the databases to load with -s, so a project whose procedures span several files stops reporting them as unknown commands, and flycheck-tcl-nagelfar-args passes arbitrary arguments (originally proposed in #1906).
  • #2279: Show LSP diagnostic tags. A language server marks unused imports and unreachable code as unnecessary and stale APIs as deprecated; those errors are now dimmed and struck through respectively, on top of the usual highlighting, with flycheck-eglot-mode and the native flycheck-lsp checker (#2275). Errors gain a tags slot, so other checkers can set them too. A tag is not a level: an unused import is still a warning.
  • #2231: Make the rust-clippy checker configurable with flycheck-rust-clippy-args (extra cargo clippy arguments) and the flycheck-rust-clippy-tests, flycheck-rust-clippy-all-targets and flycheck-rust-clippy-all-features toggles; flycheck-rust-features now applies to rust-clippy as well (originally proposed in #2087 and #2125).
  • #2231: Add flycheck-rust-edition to set the edition (--edition) for the rust checker when checking single-file crates outside a Cargo project.
  • #2234: Make the python-ruff checker configurable without a config file: flycheck-python-ruff-select, flycheck-python-ruff-extend-select and flycheck-python-ruff-ignore for rule tuning, flycheck-python-ruff-target-version, flycheck-python-ruff-preview, and flycheck-python-ruff-args for arbitrary ruff check arguments.
  • #2237: Expose more ruby-rubocop options: flycheck-rubocop-server to keep a warm server process alive (--server), flycheck-rubocop-only and flycheck-rubocop-except to focus or suppress cops, and flycheck-rubocop-args for arbitrary arguments.
  • #2238: Add flycheck-python-mypy-args for passing arbitrary arguments (such as --strict or --ignore-missing-imports) to mypy.
  • #2239: Add flycheck-dockerfile-hadolint-config to point dockerfile-hadolint at a .hadolint.yaml file (via --config) and flycheck-dockerfile-hadolint-args for arbitrary arguments.
  • #2240: Expose more terraform-tflint options: flycheck-tflint-config for a .tflint.hcl file (--config), flycheck-tflint-enabled-rules/flycheck-tflint-disabled-rules (--enable-rule/--disable-rule), and flycheck-tflint-args for arbitrary arguments.
  • #2241: Turn flycheck-stylelint-args into a real user option, so the four stylelint checkers (css/scss/sass/less) accept arbitrary arguments such as --custom-syntax.
  • #2242: Add flycheck-luacheck-globals to allow extra globals (--globals) and flycheck-luacheck-args for arbitrary arguments to lua-luacheck.
  • #2243: Add flycheck-yamllint-args for passing arbitrary arguments to yamllint.
  • #2245: Add flycheck-flake8-args and flycheck-pylint-args for passing arbitrary arguments (such as flake8's --select/--ignore or pylint's --disable/--load-plugins) to the python-flake8 and python-pylint checkers.
  • #2246: Add flycheck-phpcs-args and flycheck-phpmd-args for passing arbitrary arguments (such as phpcs's --sniffs/--exclude/--severity) to the php-phpcs and php-phpmd checkers.
  • #2247: Add args vars to the elixir-credo, erlang and scala-scalastyle checkers: flycheck-elixir-credo-args, flycheck-erlang-args and flycheck-scalastyle-args.
  • #2248: Add args vars to the protobuf-protoc, puppet-lint and statix checkers: flycheck-protoc-args, flycheck-puppet-lint-args and flycheck-statix-args.
  • #2249: Add args vars to the markdown-markdownlint-cli, markdown-markdownlint-cli2 and textlint checkers: flycheck-markdown-markdownlint-cli-args, flycheck-markdown-markdownlint-cli2-args and flycheck-textlint-args.
  • #2254: Add args vars to the Go checkers: flycheck-go-gofmt-args, flycheck-go-vet-args, flycheck-go-build-args, flycheck-go-test-args and flycheck-go-errcheck-args.
  • #2256: Make the JavaScript and data-format checkers configurable: javascript-oxlint gains flycheck-javascript-oxlint-config, flycheck-javascript-oxlint-deny and flycheck-javascript-oxlint-allow for rules and categories, and an args var; yaml-actionlint gains flycheck-yaml-actionlint-config; and javascript-standard, json-jq and yaml-jsyaml gain args vars.
  • #2261: Let a checker step aside when its tool cannot run in the buffer, instead of failing the same way on every check. python-flake8, python-ruff, python-pylint, python-mypy, ruby-rubocop/ruby-standard/ruby-chef-cookstyle, sh-shellcheck and the four stylelint checkers now recognise the exit statuses their tools use for a bad invocation, an unreadable configuration or a missing dependency, and disable themselves with the reason rather than reporting a suspicious result. A python-flake8 running under an interpreter that lacks its dependencies now says ModuleNotFoundError: No module named 'pycodestyle', and a stylelint with no configuration file says so. C-u C-c ! x re-enables a checker that disabled itself.

  • #2270: Say so when nothing can check a buffer, instead of leaving an inert FlyC- in the mode line with no explanation. Flycheck mentions it once per major mode per session, and distinguishes a mode no checker supports from one whose checkers are all unusable, which usually means the tool is not installed.

  • #2270: Mark an error whose fix has to be fetched before it is known to exist, such as an LSP quickfix code action, with [fix?] in the error list. Those errors deliberately carry no fix indicator, since it would promise a fix that may not be there, but nothing suggested C-c ! f was worth a try either.

Bugs fixed

  • #2333: Stop the C/C++ checkers warning about #pragma once in every standalone header (#2178): the buffer is always the compiler's main file, so the warning fired on the very idiom headers are supposed to use. In a source file it still fires, as intended.
  • #2331: Read go-jsonnet's static errors, which carry no STATIC ERROR: prefix and never matched the patterns written against the C++ binary, so the jsonnet checker reported nothing on the implementation flycheck's own documentation recommends.
  • #2327: Read Scala 3's diagnostics. The compiler draws each of them in a box under a -- [E008] Not Found Error: file:line:column header, with unconditional coloring, so the scala checker has reported nothing on Scala 3 since dotty shipped. Scala 2's plain output is still read (#2179).
  • #2325: Stop org-lint freezing Emacs on large Org setups (#2161): its invalid-id-link checker rescans every org-id file in the session on each check, so it sits in the new flycheck-org-lint-disabled-checkers by default; set that to nil to run everything org-lint has.
  • #2324: Keep the errors earlier checkers in a chain reported when a later checker dies by a signal, and say what killed it, instead of clearing the buffer's whole result (#1881).
  • #2323: Fix flycheck-next-error cycling forever between two errors when one's region sits inside the other's, and flycheck-previous-error skipping the inner one (#1781). Language servers report overlapping regions routinely, so the 2020 bug bites much harder today.
  • #2299: Show an annotation straight away when you jump to an error, rather than on the next thing you do (#2293). Annotations are built for the visible part of the buffer from post-command-hook, which runs before redisplay, so a jump that sends point off screen was building them while the window still described where it had been.
  • #2299: Keep a sideline annotation off the column the continuation glyph needs, so a message that fits stops spilling onto the next line by one character (#2292). Without a right fringe to draw that glyph in, as on a terminal, the rightmost column is not text's to use.
  • #2297: Read rebar3's diagnostics again. rebar3 3.24 replaced file:line:column: message with a box drawn around the offending line, which none of the patterns matched, so erlang-rebar3 has been reporting nothing since. The mark under the offending line says which column it means, so the column survives. Older rebar3's plain output is still read.
  • #2297: Read a parse error from the byte compiler on Emacs 31 and newer, which goes on to name the buffer it was reading and so no longer matched.
  • #2297: Point the rst checker at rst2pseudoxml. Docutils 0.21 dropped the .py from its front ends, so rst2pseudoxml.py has not existed since April 2024 and the checker had nothing to run.
  • #2289: Report check-declare warnings again on Emacs 29 and newer. Emacs 29 put the whole warning on one line where earlier versions broke it across two, which the pattern did not allow, so flycheck-emacs-lisp-check-declare has been finding nothing since.
  • #2289: Stop byte-compiling and checkdoc'ing Eask files, which hold data rather than code. The list of such files still named only Cask and Carton, and the Eldev exclusion beside it compared a whole path against a bare file name, so it never applied either.
  • #2289: Drop the program name jq 1.7 puts in front of its diagnostics, so a json-jq message reads Expected value before ',' rather than jq: parse error: Expected value before ','.
  • #2303: Fix Flycheck asking Eglot for diagnostics a hundred times a second while a diagnostic is live, on Emacs 31 with a server that answers textDocument/diagnostic (#2291). The two reports Eglot answers with are the two halves of one set, the pulled diagnostics and the pushed ones; taking them as competing answers made each one look like a change, and the check that followed asked again. Flycheck now assembles the reports that arrive together and re-checks only when the result differs from what it already shows. Diagnostics a report did not account for are kept rather than dropped, so the pulled and the pushed set both reach the buffer.
  • #2284: Fix Emacs exhausting max-lisp-eval-depth in an Eglot buffer on Emacs 31 (#2201). Eglot answers one request for diagnostics with two reports, the pulled set and then the pushed one, and #2278 treated only the first as the answer; the second looked volunteered and started a check that asked again.
  • #2282: Refuse a quick fix whose edit names coordinates that cannot mean what they say, rather than editing somewhere the checker never pointed at. A column of zero used to raise an args-out-of-range, a negative line silently edited the first line, and an end before its start was quietly swapped. A position past the end of the buffer is still allowed, since a fix for a missing trailing newline names one.
  • #2281: Fold a multi-line message onto one line in flycheck-annotate-mode's compact styles. Plenty of checkers wrap a message over several lines, and the newline reached the screen: eol gave the annotated line extra rows instead of sitting after it, and sideline lost the right-edge alignment that defines it. The below style still shows messages in full.
  • #2280: Carry flycheck-annotate-background's line tint through a below-style annotation, so the tinted line and the messages under it read as one region instead of a tinted bar, an untinted block and a tinted bar again (#2276). The messages keep their own colours.
  • #2278: Fix Emacs locking up in an Eglot buffer whose server answers textDocument/diagnostic rather than pushing (#2262). Under that model asking Eglot for diagnostics sends a request and returns, so the answer arrived after the guard against re-checking had unwound: the answer started a check, the check asked again, and rust-analyzer was fielding hundreds of requests a second.
  • #2266: Stop re-running a check for a diagnostics push that changes nothing. Language servers republish an unchanged set freely while they index or build, and every one of those used to cost a full check, overlay rebuild included (#2262). Both the Eglot bridge and the native flycheck-lsp checker now compare before re-checking. flycheck-verify-setup reports how many pushes a buffer's server sent, how many of them changed anything, and at what rate.
  • #2277: Stop the *eldoc* window still popping open on a jump when any Eldoc source answers asynchronously, such as a language server (#2201). Eldoc waits for every source before displaying, so the display outlived the binding #2265 relied on.
  • #2265: Stop flycheck-next-error and other jumps popping the *eldoc* window open. Documenting interactively is what refreshes the echo area after a command Eldoc does not recognise, but eldoc-display-in-buffer reads the same flag as a request to show the documentation buffer (#2201). Only the echo area sees the request now; the buffer is still kept up to date.
  • #2264: Make the two LSP bridges compose, so a lint server can run behind Eglot's server: with flycheck-eglot-mode and flycheck-lsp-mode both on and both -exclusive options nil, eglot-check now chains to flycheck-lsp and both report into the same error list. Previously each bridge chained only to a command checker and never to the other, so whichever mode enabled last silently won. Which of the two leads no longer depends on the order the modes enable in either.
  • #2257: Fix the stale value of flycheck-version, which M-x flycheck-version reports when Flycheck was not installed as a package. Development builds now report 39.0-snapshot.
  • #2259: Stop marking every LSP diagnostic as fixable. A code-action fix is only fetched when applied, so Flycheck cannot know in advance that one exists, and marking it anyway replaced the familiar double-arrow indicator with the fix indicator on every diagnostic in an Eglot or flycheck-lsp buffer. The fix indicator, the error list's [fix] badge and the inline fix marker now appear only where a fix is known to exist; C-c ! f still asks the server on any diagnostic.
  • #2259: Explain the mode-line indicator when no error counts sit behind it: -, !, . and ? now say what they mean in a tooltip, and clicking one runs flycheck-verify-setup on the buffer.
  • #2259: Replace the wall of text Flycheck printed to the echo area when it could not read a checker's output. A crashing linter, such as a misconfigured python-flake8 printing a traceback, now produces one line naming the checker and pointing at C-c ! v, which shows what the checker actually printed. Flycheck no longer suggests filing a bug report against itself for what is nearly always a local setup problem.
  • #2233: Fix flycheck-annotate-mode's below style trapping vertical motion on the annotated line - next-line needed an extra press to get past it and evil-next-visual-line could not move past it at all. The multi-line message now hangs off the following line instead of the annotated line's newline.
  • #2235: Fix flycheck-verify-setup erroring with Wrong type argument: number-or-marker-p, nil when eslint is not installed (#2232); flycheck-call-checker-process-for-output no longer chokes on a missing executable either.
  • #2236: Detect the project root of a javascript-eslint buffer from a flat config file (eslint.config.js and its .mjs/.cjs/.ts variants), not only the legacy .eslintrc/.eslintignore that ESLint 9 dropped.
  • #2244: Apply flycheck-go-build-tags to the go-vet checker as well, so a tagged build is checked consistently across the Go checkers.
  • #2255: Fix the error message not reaching the echo area after flycheck-next-error and other jumps, with the default Eldoc-based display (#2201); Eldoc keeps out of the echo area unless the command that ran is one it knows, so Flycheck now asks it to document interactively.
  • #2250: Fix several option-variable defects: flycheck-cuda-includes and flycheck-tflint-variable-files used a directory widget for options that are lists of files, flycheck-annotate-format-function and flycheck-annotate-style-functions were missing :risky, and a few options carried a malformed :package-version.

Changes

  • #2313: Truncate a sideline annotation that cannot fit between the code and the window edge, with an ellipsis, instead of letting it land after the code and wrap onto the next line (#2312).
  • #2311: Remove the haml checker; use haml-lint, which reports a template that fails to parse as well as one that parses but reads badly. Haml 6 replaced its command line with subcommands in 2022, so haml -c --stdin has been answering Could not find command "_c" ever since, and neither replacement will do: haml parse reports no line number, and haml render runs the template's Ruby.
  • #2304: Compile without warnings on Emacs 31, which made when-let, if-let, revert-buffer-in-progress-p and a bare any in rx obsolete. Installing Flycheck there printed a screenful of them, and our own build treats a warning as an error, so the snapshot CI job could not get as far as running the specs.
  • #2287: Copy every error at point as one kill-ring entry, so a single yank pastes them all, and show the lot in the echo area rather than only the first (#2096). They went in one at a time before, which left the rest behind M-y, and a destructive nreverse meant the echo area only ever showed one. A message containing a % is no longer read as a format string.
  • #2250: Tidy up the configuration for consistency: rename flycheck-mode-success-indicator to flycheck-mode-line-success-indicator, flycheck-jsonnet-command-args to flycheck-jsonnet-args, and the markdownlint-cli -enable-rules/-disable-rules options to -enabled-rules/-disabled-rules (the old names remain as obsolete aliases), and mark more options :safe so they can be set as file- or directory-local variables.
  • #2251: Improve two stale defaults: flycheck-gfortran-language-standard now defaults to nil (GFortran's own default) instead of the 1995 standard, and flycheck-phpcs-changed-git-base defaults to "main" instead of "trunk".
  • #2252: Give the config-file options a single, consistent name scheme: the …rc variables (flycheck-flake8rc, flycheck-rubocoprc, flycheck-stylelintrc, and the rest) are renamed to a …-config suffix (flycheck-flake8-config, flycheck-rubocop-config, flycheck-stylelint-config, …), matching the newer checkers. The old names keep working as obsolete aliases.
  • #2253: Pick more modern defaults when several checkers support a language: python-ruff is now preferred over python-flake8, markdown-markdownlint-cli2 over markdown-markdownlint-cli, and python-pyright is reachable (ahead of python-pycompile) instead of a silent no-op. Reorder flycheck-checkers or use flycheck-select-checker to override.
  • #2267: Rename flycheck-pylintrc to flycheck-pylint-config, the one config-file option #2252 left on the old scheme. The old name keeps working as an obsolete alias.

What's Changed

New Contributors

Full Changelog: https://github.com/flycheck/flycheck/compare/v38.3...v39.0

Source: README.md, updated 2026-08-10