echasnovski/mini.nvim

github github
split-and-window
stars 5,294
issues 38
subscribers 18
forks 190
CREATED

2021-06-18

UPDATED

3 days ago


GitHub license GitHub tag Current version

Library of 40+ independent Lua modules improving overall Neovim (version 0.8 and higher) experience with minimal effort. They all share same configuration approaches and general design principles.

Think about this project as "Swiss Army knife" among Neovim plugins: it has many different independent tools (modules) suitable for most common tasks. Each module can be used separately without any startup and usage overhead.

If you want to help this project grow but don't know where to start, check out contributing guides or leave a Github star for 'mini.nvim' project and/or any its standalone Git repositories.

Table of contents

Installation

There are two branches to install from:

  • main (default, recommended) will have latest development version of plugin. All changes since last stable release should be perceived as being in beta testing phase (meaning they already passed alpha-testing and are moderately settled).
  • stable will be updated only upon releases with code tested during public beta-testing phase in main branch.

Here are code snippets for some common installation methods:

  • Manually with git clone (compatible with mini.deps):
-- Put this at the top of 'init.lua'
local path_package = vim.fn.stdpath('data') .. '/site'
local mini_path = path_package .. '/pack/deps/start/mini.nvim'
if not vim.loop.fs_stat(mini_path) then
  vim.cmd('echo "Installing `mini.nvim`" | redraw')
  local clone_cmd = {
    'git', 'clone', '--filter=blob:none',
    -- Uncomment next line to use 'stable' branch
    -- '--branch', 'stable',
    'https://github.com/echasnovski/mini.nvim', mini_path
  }
  vim.fn.system(clone_cmd)
  vim.cmd('packadd mini.nvim | helptags ALL')
end
Branch Code snippet
Main { 'echasnovski/mini.nvim', version = false },
Stable { 'echasnovski/mini.nvim', version = '*' },
Branch Code snippet
Main Plug 'echasnovski/mini.nvim'
Stable Plug 'echasnovski/mini.nvim', { 'branch': 'stable' }
  • Every module is also distributed as a standalone Git repository. Check out module's information for more details.

Important: don't forget to call module's setup() (if required) to enable its functionality.

Note: if you are on Windows, there might be problems with too long file paths (like error: unable to create file <some file name>: Filename too long). Try doing one of the following:

  • Enable corresponding git global config value: git config --system core.longpaths true. Then try to reinstall.
  • Install plugin in other place with shorter path.

Modules

If you are browsing without particular objective and don't know which module to look at:

  • To improve your editing experience, start with 'mini.ai', 'mini.operators', 'mini.pairs', 'mini.surround'.
  • To improve your general workflow, start with 'mini.bracketed', 'mini.files', 'mini.jump2d', 'mini.pick'.
  • To make your Neovim more beautiful, start with 'mini.animate', 'mini.hues', 'mini.icons', 'mini.notify'.
Module Description Overview Details
mini.ai Extend and create a/i textobjects README Help file
mini.align Align text interactively README Help file
mini.animate Animate common Neovim actions README Help file
mini.base16 Base16 colorscheme creation README Help file
mini.basics Common configuration presets README Help file
mini.bracketed Go forward/backward with square brackets README Help file
mini.bufremove Remove buffers README Help file
mini.clue Show next key clues README Help file
mini.colors Tweak and save any color scheme README Help file
mini.comment Comment lines README Help file
mini.completion Completion and signature help README Help file
mini.cursorword Autohighlight word under cursor README Help file
mini.deps Plugin manager README Help file
mini.diff Work with diff hunks README Help file
mini.doc Generate Neovim help files README Help file
mini.extra Extra 'mini.nvim' functionality README Help file
mini.files Navigate and manipulate file system README Help file
mini.fuzzy Fuzzy matching README Help file
mini.git Git integration README Help file
mini.hipatterns Highlight patterns in text README Help file
mini.hues Generate configurable color scheme README Help file
mini.icons Icon provider README Help file
mini.indentscope Visualize and work with indent scope README Help file
mini.jump Jump to next/previous single character README Help file
mini.jump2d Jump within visible lines README Help file
mini.map Window with buffer text overview README Help file
mini.misc Miscellaneous functions README Help file
mini.move Move any selection in any direction README Help file
mini.notify Show notifications README Help file
mini.operators Text edit operators README Help file
mini.pairs Autopairs README Help file
mini.pick Pick anything README Help file
mini.sessions Session management README Help file
mini.splitjoin Split and join arguments README Help file
mini.starter Start screen README Help file
mini.statusline Statusline README Help file
mini.surround Surround actions README Help file
mini.tabline Tabline README Help file
mini.test Test Neovim plugins README Help file
mini.trailspace Trailspace (highlight and remove) README Help file
mini.visits Track and reuse file system visits README Help file

General principles

  • Design. Each module is designed to solve a particular problem targeting balance between feature-richness (handling as many edge-cases as possible) and simplicity of implementation/support. Granted, not all of them ended up with the same balance, but it is the goal nevertheless.

  • Independence. Modules are independent of each other and can be run without external dependencies. Although some of them may need dependencies for full experience.

  • Structure. Each module is a submodule for a placeholder "mini" module. So, for example, "surround" module should be referred to as "mini.surround". As later will be explained, this plugin can also be referred to as "MiniSurround".

  • Setup:

    • Each module you want to use should be enabled separately with require(<name of module>).setup({}). Possibly replace {} with your config table or omit altogether to use defaults. You can supply only parts of config, the rest will be inferred from defaults.

    • Call to module's setup() always creates a global Lua object with coherent camel-case name: require('mini.surround').setup() creates _G.MiniSurround. This allows for a simpler usage of plugin functionality: instead of require('mini.surround') use MiniSurround (or manually :lua MiniSurround.* in command line); available from v:lua like v:lua.MiniSurround. Considering this, "module" and "Lua object" names can be used interchangeably: 'mini.surround' and 'MiniSurround' will mean the same thing.

    • Each supplied config table is stored in config field of global object. Like MiniSurround.config.

    • Values of config which affect runtime activity can be changed on the fly to have effect. For example, MiniSurround.config.n_lines can be changed during runtime; but changing MiniSurround.config.mappings won't have any effect (as mappings are created once during setup()).

  • Buffer local configuration. Each module can be additionally configured to use certain runtime config settings locally to buffer. See mini.nvim-buffer-local-config section in help file for more information.

  • Disabling. Each module's core functionality can be disabled globally or locally to buffer. See "Disabling" section in module's help page for more details. See mini.nvim-disabling-recipes section in main help file for common recipes.

  • Silencing. Each module providing non-error feedback can be configured to not do that by setting config.silent = true (either inside setup() call or on the fly).

  • Highlighting. Appearance of module's output is controlled by certain set of highlight groups (see :h highlight-groups). By default they usually link to some semantically close built-in highlight group and are ensured to be defined after any color scheme takes effect. Use :highlight command or vim.api.nvim_set_hl() Lua function to customize highlighting. To see a more calibrated look, use 'mini.hues', 'mini.base16', or plugin's color scheme.

  • Stability. Each module upon release is considered to be relatively stable: both in terms of setup and functionality. Any non-bugfix backward-incompatible change will be released gradually as much as possible.

  • Not filetype/language specific. Including functionality which needs several filetype/language specific implementations is an explicit no-goal of this project. This is mostly due to the potential increase in maintenance to keep implementation up to date. However, any part which might need filetype/language specific tuning should be designed to allow it by letting user set proper buffer options and/or local configuration.

Plugin colorschemes

This plugin comes with several color schemes (all have both dark and light variants):

  • randomhue - random background and foreground of the same hue with medium saturation.
  • minicyan - cyan and grey main colors with medium contrast and saturation palette.
  • minischeme - blue and yellow main colors with high contrast and saturation palette.

Activate them as regular colorscheme (for example, :colorscheme randomhue or :colorscheme minicyan). You can see how they look in demo of 'mini.hues' or demo of 'mini.base16'.

Planned modules

This is the list of modules I currently intend to implement eventually (as my free time and dedication will allow), in alphabetical order:

  • 'mini.cycle' - cycle through alternatives with pre-defined rules. Something like monaqa/dial.nvim and AndrewRadev/switch.vim
  • 'mini.keymap' - utilities to make non-trivial mappings (like max397574/better-escape.nvim and dot-repeatable mappings).
  • 'mini.snippets' - work with snippets. Something like L3MON4D3/LuaSnip but only with more straightforward functionality.
  • 'mini.statuscolumn' - customizable 'statuscolumn'.
  • 'mini.terminals' - coherently manage terminal windows and send text from buffers to terminal windows. Something like kassio/neoterm.
  • 'mini.quickfix' - fuzzy search and preview of quickfix entries. Possibly with some presets for populating quickfix list (like files, help tags, etc.). Similar to kevinhwang91/nvim-bqf.