Skip to main content

An LSP, formatter, and linter for Pandoc markdown, Quarto, and RMarkdown

Project description

Panache

Build and Test Crates.io Open VSX VS Code codecov

A language server, formatter, and linter for Pandoc, Quarto, and R Markdown.

Installation

From crates.io

If you have Rust installed, the easiest way is likely to install from crates.io:

cargo install panache

Pre-built Binaries

Alternatively, you can install pre-built binary packages from the releases page for Linux, macOS, and Windows. For Linux, packages are available for generic distributions (tarballs) as well as Debian/Ubuntu (.deb) and Fedora/RHEL/openSUSE (.rpm).

If you prefer a one-liner installer that picks the right release artifact for your platform, you can use the installer scripts below. These scripts are fetched directly from this repository and then download the latest matching Panache CLI release asset for your platform, installing to a user-local directory by default. If you prefer, download and inspect the script before running it.

For macOS and Linux:

curl --proto '=https' --tlsv1.2 -LsSf \
    https://raw.githubusercontent.com/jolars/panache/refs/heads/main/scripts/panache-installer.sh | sh

For Windows PowerShell:

powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://raw.githubusercontent.com/jolars/panache/refs/heads/main/scripts/panache-installer.ps1 | iex"

Arch Linux

There are also two recipies available for Arch Linux in the AUR: panache and panache-bin. The first builds from source for your system, the second uses precompiled binaries attatched to GH releases. Install either using yay or your favorite AUR helper:

yay -S panache
yay -S panache-bin

NixOS

Panache is available in NixOS via the panache package in nixpkgs. To add it to your system configuration, include it in the environment.systemPackages:

{ pkgs, ... }:

{
  environment.systemPackages = [
    pkgs.panache
  ];
}

VS Code Extension

If you are running VS Code or an editor that supports VS Code extensions (like Positron), you can install the Panache extension from the VS Code Marketplace or the Open VSX extension, which will automatically also install the panache CLI and start the language server when editing supported files.

Development Version

To install the latest development version, you can run

cargo install --git https://github.com/jolars/panache.git panache

This presumes you have a working and up-to-date Rust toolchain (stable, 2024 edition) installed. You also need to have cargo in your PATH if you want to use the panache command directly after installation.

Usage

Panache provides a single CLI interface for formatting, linting, and running the LSP server.

Formatting

To format a file in place, simply run:

panache format document.qmd

You can also format from stdin by piping content into panache format:

cat <file> | panache format

panache format supports glob patterns and recursive directory formatting:

panache format **/*.{qmd,md}

You can use Panache as a linter via the --check flag to check if files are already formatted without making changes:

panache format --check document.qmd

External Code Formatters

Panache supports external formatters for code blocks. For example, you can configure it to run air on R code blocks and ruff on Python code blocks:

[formatters]
r = "air"
python = "ruff"
javascript = "prettier"
typescript = "prettier" # Reuse same formatter

You can setup custom formatters or modify built-in presets with additional arguments:

[formatters]
python = ["isort", "black"]
javascript = "foobar"

[formatters.isort]
args = ["--profile=black"]

[formatters.myformatters]
cmd = "foobar"
args = ["--print-width=100"]
stdin = true

Linting

Panache also features a linter that can report formatting issues and optionally auto-fix them. To run the linter, use:

panache lint document.qmd

As with panache format, you can use glob patterns and recursive formatting:

panache lint **/*.{qmd,md}

External Linters

As with formatting, Panache supports external linters for code blocks. These are configured in the [linters] section of the configuration, but due to the complexity of linting, including dealing with auto-fixing, external linters cannot be customized and only support presets and at the moment only support R via the jarl linter:

# Enable R linting
[linters]
r = "jarl" # R linter with JSON output

Language Server

Panache implements the language server protocol (LSP) to provide editor features like formatting, diagnostics, code actions, and more.

Most users should configure their editor to start the language server automatically when editing. See the language server documentation for guides on configuring your editor. For VS Code and related editors such as Positron, there is a VS Code Marketplace extension and Open VSX extension that provides an LSP client and additional features.

If you need to run the server manually (for debugging), use:

panache lsp

The server communicates over stdin/stdout and provides document formatting capabilities. For Quarto projects, the LSP also reads _quarto.yml, per-directory _metadata.yml, and metadata-files includes to supply project-level metadata to bibliography-aware features. For Bookdown, _bookdown.yml, _output.yml, and index.Rmd frontmatter are also considered.

The list of LSP features supported by Panache includes, among others:

  • Document formatting (full document, incremental and range)
  • Diagnostics with quick fixes
  • Code actions for refactoring
    • Convert between loose/compact lists
    • Convert between inline/reference footnotes
  • Document symbols/outline
  • Folding ranges
  • Go to definition for references and footnotes

Configuration

Panache looks for a configuration in:

  1. .panache.toml or panache.toml in current directory or parent directories
  2. $XDG_CONFIG_HOME/panache/config.toml (usually ~/.config/panache/config.toml)

Example

# Markdown flavor and line width
flavor = "quarto"
line-width = 80
line-ending = "auto"

# Formatting style
[format]
wrap = "reflow"

# External code formatters (opt-in)
[formatters]
python = ["isort", "black"] # Sequential formatting
r = "air"                   # Built-in preset
javascript = "prettier"     # Reusable definitions
typescript = "prettier"
yaml = "yamlfmt"            # Formats both code blocks AND frontmatter

# Customize formatters
[formatters.prettier]
prepend-args = ["--print-width=100"]

# External code linters
[linters]
r = "jarl" # Enable R linting

See examples/panache.toml for a complete configuration reference.

Integrations

GitHub Actions

For CI, use the dedicated GitHub Action:

- uses: jolars/panache-action@v1

See the Integrations documentation for configuration options.

Pre-commit Hooks

Panache integrates with pre-commit to automatically format and lint your files before committing.

Installation:

First, install pre-commit if you haven't already:

pip install pre-commit
# or
brew install pre-commit

Then add Panache to your .pre-commit-config.yaml:

repos:
  - repo: https://github.com/jolars/panache
    rev: v2.16.0 # Use the latest version
    hooks:
      - id: panache-format # Format files
      - id: panache-lint # Lint and auto-fix issues

Install the hooks:

pre-commit install

Panache will now automatically run on your staged .qmd, .md, and .Rmd files before each commit.

See examples/pre-commit-config.yaml for more configuration options.

Motivation

I wanted a formatter that understands Quarto and Pandoc syntax. I have tried to use Prettier as well as mdformat, but both fail to handle some of the particular syntax used in Quarto documents, such as fenced divs and some of the table syntax.

For a side-by-side overview of how Panache compares to Prettier, Pandoc, rumdl, mdformat, mado, markdownlint, markdownlint-cli2, and marksman, see the comparison page. For benchmarks against the same set of tools, see the performance page.

Design Goals and Scope

  • Full LSP implementation with formatting, diagnostics, code actions, and more
  • Standalone CLI for both formatting and linting
  • Support for Quarto, Pandoc, and R Markdown syntax
  • Lossless CST-based parsing
  • Idempotent formatting
  • Semi-opinionated defaults with configurable style options for common formatting decisions
  • Support for running external formatters and linters on code blocks, with built-in presets for popular languages and tools

Acknowledgements

The development of Panache has simplified considerably thanks to the extensive documentation, well-structured code, and testing infrastructure provided by Pandoc. We also owe significant debt to the rust-analyzer project, on which Panche is heavily inspired.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

panache_cli-2.40.0.tar.gz (1.6 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

panache_cli-2.40.0-py3-none-win_arm64.whl (4.2 MB view details)

Uploaded Python 3Windows ARM64

panache_cli-2.40.0-py3-none-win_amd64.whl (4.5 MB view details)

Uploaded Python 3Windows x86-64

panache_cli-2.40.0-py3-none-musllinux_1_2_x86_64.whl (4.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

panache_cli-2.40.0-py3-none-musllinux_1_2_aarch64.whl (4.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

panache_cli-2.40.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

panache_cli-2.40.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

panache_cli-2.40.0-py3-none-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

panache_cli-2.40.0-py3-none-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file panache_cli-2.40.0.tar.gz.

File metadata

  • Download URL: panache_cli-2.40.0.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for panache_cli-2.40.0.tar.gz
Algorithm Hash digest
SHA256 09f480517b987c13df3c7e82d2dceb43f061f1cee5669564823ad8b12f5103f6
MD5 cc4d6353447925cd539960814cbbe188
BLAKE2b-256 73101bc840e17c3271325d51ecae771877541598e97acfef685f8ca5a2c7b24c

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0.tar.gz:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: panache_cli-2.40.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 4.2 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for panache_cli-2.40.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 b02446fe359a58e95397db17013f584c88c20acc8eee36507bfa3ec0acbae615
MD5 25cdea1c7e5623c57052685c10c510d1
BLAKE2b-256 91f49d5378bef033bfb43da8dc2fd244b32a4b0503b8cbd45163faa59f8e9d3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-win_arm64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: panache_cli-2.40.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 4.5 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for panache_cli-2.40.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 25f120c8b4909b114271ceb1f55a828b783ba364b18728e28b43dd5af5e061f7
MD5 0c13829443a475aec708e80eb3e90912
BLAKE2b-256 53eb614dee0204f1c4fcbbdcce1eb2249c1ef0315c47f121bab7f606c21e55a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-win_amd64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for panache_cli-2.40.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8ff6488d4dc3c0de2b36cbac29f122e7cb875437c10a59583fbff3d9ca8562e2
MD5 b3af115184359f234a624824a4d7abcd
BLAKE2b-256 b9a212abf5c0899ee0b449ba5c0e45f2bef806cacf744590aac97861a7c93dd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for panache_cli-2.40.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5129319e018336cc1742b8997ee38b621005ffad755b481b618490add52dd701
MD5 7567d5c3fb3b2f78e32644e1a99d09ce
BLAKE2b-256 233b02adc22f06ccca6a38e8cea41fce0bac69c9da22b37246a521c16cc74d5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for panache_cli-2.40.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8144571bd95b26d8df271b8721070652a6ecc16dcebdb8d770d07e2349013938
MD5 78a7618aba9b1f2e06879c8ba13fad57
BLAKE2b-256 0f83a4f8b93fcc38b919808b472add90b4f541dae1fd597c90e7081337ecb2e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for panache_cli-2.40.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1bd181d1e6499a0c1c3ee9dbba4874f506a1bb89eedd81e50f0a7a5d3b788f4e
MD5 386dc75307bf09e155c3a84c64f29995
BLAKE2b-256 e68eb41fd6cd397f786c1be7262ba65bf100e42a926f37d5dd82b673f80bbe70

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for panache_cli-2.40.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0640d78cf193ca2f0d5b6954b65d73589ad4ece9b3b8f5e12c8994e2a781b17a
MD5 ed52953fb5286d0cbbd02a45dabdcac3
BLAKE2b-256 ad840f6e80acbe8fd3cf8bd95449e2cb340f1f5002b2ebfa087de9ae46d3548c

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file panache_cli-2.40.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for panache_cli-2.40.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 50bd843c140c25d24b4a323df0e072327275c817fbb4bf3cd43702dad6c85aad
MD5 123662f0d6b5af1aaf6b4b8f24353022
BLAKE2b-256 aa1cea826ca34978e34f8079b210ce67af36c45e15d79d43a2eff40e2c63dc0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for panache_cli-2.40.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: publish-pypi.yml on jolars/panache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page