Integracja z edytorem

Emacs (Apheleia)

Apheleia uruchamia zewnętrzne formatery przy zapisie bufora, zachowując pozycję kursora.

(with-eval-after-load 'apheleia
  (push '(snapper . ("snapper" "--format" "org")) apheleia-formatters)
  (push '(org-mode . snapper) apheleia-mode-alist)
  ;; Add for other formats:
  (push '(latex-mode . snapper) apheleia-mode-alist)
  (push '(markdown-mode . snapper) apheleia-mode-alist))

Flaga --format automatycznie wykrywa format na podstawie rozszerzenia pliku, więc można ją pominąć, jeśli pliki mają standardowe rozszerzenia.

Vim / Neovim

Użyj formatprg, aby przekierować tekst przez snappera:

autocmd FileType org setlocal formatprg=snapper\ --format\ org
autocmd FileType tex setlocal formatprg=snapper\ --format\ latex
autocmd FileType markdown setlocal formatprg=snapper\ --format\ markdown

Następnie gq do przeformatowania zaznaczonego tekstu lub gggqG do przeformatowania całego bufora.

Dla Neovima z conform.nvim:

require("conform").setup({
  formatters = {
    snapper = {
      command = "snapper",
      args = { "--format", "$FILETYPE" },
      stdin = true,
    },
  },
  formatters_by_ft = {
    org = { "snapper" },
    tex = { "snapper" },
    markdown = { "snapper" },
  },
})

LSP (any editor with LSP support)

Snapper ships a Language Server Protocol implementation. Start it with:

snapper lsp

This provides document formatting, range formatting, and diagnostics (flags lines with multiple sentences) over the standard LSP protocol on stdin/stdout.

Neovim (native LSP)

vim.api.nvim_create_autocmd("FileType", {
  pattern = { "org", "tex", "markdown" },
  callback = function()
    vim.lsp.start({
      name = "snapper",
      cmd = { "snapper", "lsp" },
    })
  end,
})

Emacs (eglot)

(add-to-list 'eglot-server-programs
             '((org-mode latex-mode markdown-mode) "snapper" "lsp"))

VS Code

Add to settings.json (requires a generic LSP client extension):

{
  "lsp.servers": {
    "snapper": {
      "command": "snapper",
      "args": ["lsp"],
      "filetypes": ["org", "tex", "markdown"]
    }
  }
}

Helix

Add to ~/.config/helix/languages.toml:

[[language]]
name = "org"
language-servers = ["snapper"]

[language-server.snapper]
command = "snapper"
args = ["lsp"]

Ogólne (dowolny edytor)

Snapper domyślnie czyta ze stdin i pisze na stdout. Każdy edytor obsługujący przekierowanie przez zewnętrzny program będzie działał:

cat paper.org | snapper --format org