Strict, native code style formatting plugin for Neovim. Expose deep nesting, overlong lines, trailing whitespace, trailing empty lines, todos and inconsistent indentation.
Strict (or nvim-strict) is an all-Lua wrapper for a collection of regular expressions which combine to provide lightweight, IDE-like code style hints and formatting.
Strict is language agnostic; it highlights and formats properties common to all programming languages. It pairs well with the Neovim LSP client for language-specific code formatting with strict and configurable code style formatting.
- Highlights deeply-nested code
- Highlights and splits overlong lines
- Highlights and removes trailing empty lines and whitespace
- Highlights and converts tab or space indentation
- Highlights TODO comments
- Formatting functions preserve window, cursor, jumplist and search state
- Include and exclude filetypes and buftypes
- No external dependencies
- Highly configurable and extensible
- Blazingly fast
Strict can be installed using any package manager. Here is an example using packer.nvim to install and setup Strict using the default configuration. Note that Strict is only enabled once the setup
function has been called.
use({
'emileferreira/nvim-strict',
config = function()
require('strict').setup()
end
})
Strict comes with batteries included and (IMHO) sane defaults. The default configuration is shown below. It can be modified and passed to the setup
function to override the default values. The configuration options are documented in strict.txt.
local default_config = {
included_filetypes = nil,
excluded_filetypes = nil,
excluded_buftypes = { 'help', 'nofile', 'terminal', 'prompt' },
match_priority = -1,
deep_nesting = {
highlight = true,
highlight_group = 'DiffDelete',
depth_limit = 3,
ignored_trailing_characters = nil,
ignored_leading_characters = nil
},
overlong_lines = {
highlight = true,
highlight_group = 'DiffDelete',
length_limit = 80,
split_on_save = true
},
trailing_whitespace = {
highlight = true,
highlight_group = 'SpellBad',
remove_on_save = true
},
trailing_empty_lines = {
highlight = true,
highlight_group = 'SpellBad',
remove_on_save = true
},
space_indentation = {
highlight = false,
highlight_group = 'SpellBad',
convert_on_save = false
},
tab_indentation = {
highlight = true,
highlight_group = 'SpellBad',
convert_on_save = true
},
todos = {
highlight = true,
highlight_group = 'DiffAdd'
}
}
The following is an example of a more forgiving configuration.
require('strict').setup({
excluded_filetypes = { 'text', 'markdown', 'html' },
deep_nesting = {
depth_limit = 5,
ignored_trailing_characters = ',',
ignored_leading_characters = '.'
},
overlong_lines = {
length_limit = 120
}
})
The highlights of Strict can be temporarily disabled, per window, by the following command.
:call clearmatches()
The command below writes the current buffer without triggering autocmds which bypasses the format-on-save functionality of Strict.
:noa w
The formatting functions are exported for use in keymaps, autocmds or other plugins. Below is a basic example of using the functions in keymaps.
local strict = require('strict')
local options = { noremap = true, silent = true }
vim.keymap.set('n', '<Leader>tw', strict.remove_trailing_whitespace, options)
vim.keymap.set('n', '<Leader>tl', strict.remove_trailing_empty_lines, options)
vim.keymap.set('n', '<Leader>st', strict.convert_spaces_to_tabs, options)
vim.keymap.set('n', '<Leader>ts', strict.convert_tabs_to_spaces, options)
vim.keymap.set('n', '<Leader>ol', strict.split_overlong_lines, options)
"Looks cool!" - TJ DeVries, Neovim core maintainer
Pull requests, bug reports and feature requests are welcomed.