ctrl+shift+p filters: :st2 :st3 :win :osx :linux
Browse

Fmt

by mitranim ALL

Sublime Text plugin for auto-formatting arbitrary code by calling arbitrary executables, such as `gofmt`

Details

Installs

  • Total 9
  • Win 3
  • Mac 4
  • Linux 2
Jan 27 Jan 26 Jan 25 Jan 24 Jan 23 Jan 22 Jan 21 Jan 20 Jan 19 Jan 18 Jan 17 Jan 16 Jan 15 Jan 14 Jan 13 Jan 12 Jan 11 Jan 10 Jan 9 Jan 8 Jan 7 Jan 6 Jan 5 Jan 4 Jan 3 Jan 2 Jan 1 Dec 31 Dec 30 Dec 29 Dec 28 Dec 27 Dec 26 Dec 25 Dec 24 Dec 23 Dec 22 Dec 21 Dec 20 Dec 19 Dec 18 Dec 17 Dec 16 Dec 15 Dec 14
Windows 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Mac 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Linux 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Readme

Source
raw.​githubusercontent.​com

Overview

Sublime Text plugin for auto-formatting arbitrary code by calling arbitrary executables. Works for gofmt, rustfmt, any similar tool that's an executable and uses standard input/output.

Features:

  • Format on demand. Optionally auto-format on save.
  • Configure executables and other settings per scope (syntax type: source.go, source.rust and so on).
  • Preserve cursor and scroll position when formatting.
  • Show errors in an output panel (configurable).

Limitations:

  • Invokes a subprocess every time. Good enough for formatters written in compiled languages, such as gofmt and rustfmt. If a given formatter is written in JS and takes a second to start up, this tool might not be suitable.

Based on https://github.com/mitranim/sublime-gofmt and fully replaces it. Also replaces RustFmt and countless others.

Why

Why this exists?

Package Control has special-case formatter plugins for different languages, and the monstrous Formatter with too many batteries included. This makes it hard to add formatters: someone has to make and publish a new plugin every time, or fork a repo and make a PR, etc.

Many formatters just call a subprocess and use stdio. One plugin can handle them all, while letting the user specify any new formatter for any new syntax! This works for gofmt, rustfmt, clang-format, and endless others.

Installation

Package Control

  1. Get Package Control.
  2. Open the command palette: ⇪⌘P or ⇪P.
  3. Package Control: Install Package.
  4. Fmt.

Manual

Clone the repo and symlink it to your Sublime packages directory. Example for MacOS:

git clone https://github.com/mitranim/sublime-fmt.git
cd sublime-fmt
ln -sf "$(pwd)" "$HOME/Library/Application Support/Sublime Text 3/Packages/Fmt"

To find the packages directory on your system, use Sublime Text menu → Preferences → Browse Packages.

Usage

The plugin has no default formatters. You must specify them in the plugin settings. Example for Go:

Error: language “sublime-settings” is not supported
{
  "rules": [
    {"selector": "source.go", "cmd": ["goimports"]},
  },
}

To understand Sublime scopes and selector matching, read this short official doc: https://www.sublimetext.com/docs/selectors.html.

How to get scope name. Option 1: menu → Tools → Developer → Show Scope Name. Option 2: run the command Fmt: Format Buffer, and if not configured for the current scope, it will tell you!

To format on demand, run the Fmt: Format Buffer command from the command palette. See below how to configure hotkeys.

To auto-format on save, set "format_on_save": true in the settings. Can be global or per rule.

Settings

See Fmt.sublime-settings for all available settings. To override them, open:

menu → Preferences → Package Settings → Fmt → Settings

The plugin looks for settings in the following places, with the following priority:

  • "Fmt" dict in general Sublime settings, project-specific or global.
  • Fmt.sublime-settings, user-created or default.

For overrides, open project or global settings and make a "Fmt" entry:

Error: language “sublime-settings” is not supported
{
  "Fmt": {
    "rules": [
      {
        "selector": "source.some_lang",
        "cmd": ["some_lang_fmt", "--some_arg"],
      },
    ],
  },
}

A rule may contain any of the root-level settings, such as format_on_save. This allows fine-tuning.

Commands

In Sublime's command palette:

  • Fmt: Format Buffer

Hotkeys

Hotkeys? More like notkeys!

To avoid potential conflicts, this plugin does not come with hotkeys. To hotkey the format command, add something like this to your .sublime-keymap:

Error: language “sublime-keymap” is not supported
{"keys": ["primary+k", "primary+j"], "command": "fmt_format_buffer"}

This will trigger on a quick ⌘kj or ^kj depending on your OS.

Changelog

2020-12-28. Support env variable substitution. Format-on-save is no longer enabled by default.

2020-11-26. Support variable substitution in cmd.

2020-11-25. Use scope selectors instead of exactly matching the scope name.

2020-10-25. Support subprocess timeout, always kill the subprocess.

2020-10-23. Support several ways of printing errors. By default, errors are shown in a transient output panel at the bottom.

License

https://unlicense.org