github github
stars 417
issues 13
subscribers 3
forks 24



7 days ago


Async formatting and linting utility for neovim.


  • Blazingly fast
  • Async using coroutine and luv spawn
  • Builtin support for popular formatters and linters
  • Easy configuration for custom tools
  • Light-weight


Installation for lazy.nvim

    -- Builtin configuration, optional
    dependencies = {

Guard is configured as follows:

local ft = require('guard.filetype')

-- Assuming you have guard-collection

-- Call setup() LAST!
    -- Choose to format on every write to a buffer
    fmt_on_save = true,
    -- Use lsp if no formatter was defined for this filetype
    lsp_as_default_formatter = false,
    -- By default, Guard writes the buffer on every format
    -- You can disable this by setting:
    -- save_on_fmt = false,
  • Use GuardFmt to manually call format, when there is a visual selection only the selection is formatted. NOTE: Regional formatting just sends your selection to the formatter, if there's not enough context incoherent formatting might occur (e.g. indent being erased)
  • GuardDisable disables auto format for the current buffer, you can also GuardDisable 16 (the buffer number)
  • Use GuardEnable to re-enable auto format, usage is the same as GuardDisable

Example Configuration

Format c files with clang-format and lint with clang-tidy:


Or use lsp to format lua files first, then format with stylua, then lint with selene:


Register multiple filetypes to a single linter or formatter:


Lint all your files with codespell

-- NB: this does not work with formatters

Custom Configuration

Easily setup your custom tool if not in the defaults or you do not want guard-collection bundled:

    cmd              -- string: tool command
    args             -- table: command arguments
    fname            -- boolean: insert filename to args tail
    stdin            -- boolean: pass buffer contents into stdin
    timeout          -- integer
    ignore_patterns  -- table: don't run formatter when pattern match against file name
    ignore_error     -- boolean: when has lsp error ignore format
    find             -- string: format if the file is found in the lsp root dir
    env              -- table: environment variables passed to cmd (key value pair)

    -- special
    parse            -- function: used to parse linter output to neovim diagnostic
    fn               -- function: if fn is set other fields will not take effect

For example, format your assembly with asmfmt:

    cmd = 'asmfmt',
    stdin = true

Consult the builtin tools if needed.

Supported Tools

See here for an exhaustive list.