Skip to content

Neovim Lua plugin to animate common Neovim actions. Part of 'mini.nvim' library.

License

Notifications You must be signed in to change notification settings

echasnovski/mini.animate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 

Repository files navigation

GitHub license

Animate common Neovim actions

See more details in Features and help file.


⦿ This is a part of mini.nvim library. Please use this link if you want to mention this module.

⦿ All contributions (issues, pull requests, discussions, etc.) are done inside of 'mini.nvim'.

⦿ See the repository page to learn about common design principles and configuration recipes.


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

Demo

demo-animate.mp4

Features

  • Works out of the box with a single require('mini.animate').setup(). No extra mappings or commands needed.
  • Animate cursor movement inside same buffer by showing customizable path.
  • Animate scrolling with a series of subscrolls ("smooth scrolling").
  • Animate window resize by gradually changing sizes of all windows.
  • Animate window open/close with visually updating floating window.
  • Timings for all actions can be customized independently.
  • Action animations can be enabled/disabled independently.
  • All animations are asynchronous/non-blocking and trigger a targeted event which can be used to perform actions after animation is done.
  • MiniAnimate.animate() function which can be used to perform own animations.

Notes:

  • Although all animations work in all supported versions of Neovim, scroll and resize animations have best experience with Neovim>=0.9.
  • Scroll and resize animations actually change Neovim state to achieve their effects and are asynchronous. This can cause following issues:
    • If you have remapped any movement operation to center after it is done (like with nzvzz or <C-d>zz), you need to change those mappings. Either remove them or update to use MiniAnimate.execute_after() (see :h MiniAnimate.config.scroll)
    • Using mouse wheel to scroll can appear slower or can have visual jitter. This usually happens due to high number of wheel turns per second: each turn is taking over previous one to start new animation. To mitigate this, you can either modify 'mousescroll' option (set vertical scroll to 1 and use high turn speed or set to high value and use one turn at a time) or config.scroll to fine tune when/how scroll animation is done.

Installation

This plugin can be installed as part of 'mini.nvim' library (recommended) or as a standalone Git repository.

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 (use only one):

With mini.deps
Github repo Branch Code snippet
'mini.nvim' library Main Follow recommended 'mini.deps' installation
Stable
Standalone plugin Main add('echasnovski/mini.animate')
Stable add({ source = 'echasnovski/mini.animate', checkout = 'stable' })
With folke/lazy.nvim
Github repo Branch Code snippet
'mini.nvim' library Main { 'echasnovski/mini.nvim', version = false },
Stable { 'echasnovski/mini.nvim', version = '*' },
Standalone plugin Main { 'echasnovski/mini.animate', version = false },
Stable { 'echasnovski/mini.animate', version = '*' },
With junegunn/vim-plug
Github repo Branch Code snippet
'mini.nvim' library Main Plug 'echasnovski/mini.nvim'
Stable Plug 'echasnovski/mini.nvim', { 'branch': 'stable' }
Standalone plugin Main Plug 'echasnovski/mini.animate'
Stable Plug 'echasnovski/mini.animate', { 'branch': 'stable' }

Important: don't forget to call require('mini.animate').setup() 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.

Default config

-- No need to copy this inside `setup()`. Will be used automatically.
{
  -- Cursor path
  cursor = {
    -- Whether to enable this animation
    enable = true,

    -- Timing of animation (how steps will progress in time)
    timing = --<function: implements linear total 250ms animation duration>,

    -- Path generator for visualized cursor movement
    path = --<function: implements shortest line path>,
  },

  -- Vertical scroll
  scroll = {
    -- Whether to enable this animation
    enable = true,

    -- Timing of animation (how steps will progress in time)
    timing = --<function: implements linear total 250ms animation duration>,

    -- Subscroll generator based on total scroll
    subscroll = --<function: implements equal scroll with at most 60 steps>,
  },

  -- Window resize
  resize = {
    -- Whether to enable this animation
    enable = true,

    -- Timing of animation (how steps will progress in time)
    timing = --<function: implements linear total 250ms animation duration>,

    -- Subresize generator for all steps of resize animations
    subresize = --<function: implements equal linear steps>,
  },

  -- Window open
  open = {
    -- Whether to enable this animation
    enable = true,

    -- Timing of animation (how steps will progress in time)
    timing = --<function: implements linear total 250ms animation duration>,

    -- Floating window config generator visualizing specific window
    winconfig = --<function: implements static window for 25 steps>,

    -- 'winblend' (window transparency) generator for floating window
    winblend = --<function: implements equal linear steps from 80 to 100>,
  },

  -- Window close
  close = {
    -- Whether to enable this animation
    enable = true,

    -- Timing of animation (how steps will progress in time)
    timing = --<function: implements linear total 250ms animation duration>,

    -- Floating window config generator visualizing specific window
    winconfig = --<function: implements static window for 25 steps>,

    -- 'winblend' (window transparency) generator for floating window
    winblend = --<function: implements equal linear steps from 80 to 100>,
  },
}

Similar plugins