Eandrju / cellular-automaton.nvim

A useless plugin that might help you cope with stubbornly broken tests or overall lack of sense in life. It lets you execute aesthetically pleasing, cellular automaton animations based on the content of neovim buffer.
MIT License
1.9k stars 36 forks source link
cellular-automaton neovim plugin

cellular-automaton.nvim

A useless plugin that might help you cope with stubbornly broken tests or overall lack of sense in life. It lets you execute aesthetically pleasing, cellular automaton animations based on the content of neovim buffer.

https://user-images.githubusercontent.com/37074839/204104990-6ebd7767-92e9-43b9-878a-3493a08a3308.mov

What is cellular automata

From the Wiki:

A cellular automaton is a model used in computer science and mathematics. The idea is to model a dynamic system by using a number of cells. Each cell has one of several possible states. With each "turn" or iteration the state of the current cell is determined by two things: its current state, and the states of the neighbouring cells.

But.. why?

There is no pragmatic use case whatsoever. However, there are some pseudo-scientifically proven "use-cases":

Requirements

Installation

use 'eandrju/cellular-automaton.nvim' 

Usage

You can trigger it using simple command:

:CellularAutomaton make_it_rain

or

:CellularAutomaton game_of_life

Or just create a mapping:

vim.keymap.set("n", "<leader>fml", "<cmd>CellularAutomaton make_it_rain<CR>")

You can close animation window with one of: q/<Esc>/<CR>

Known issues

Supported animations

Make it Rain

https://user-images.githubusercontent.com/37074839/204104990-6ebd7767-92e9-43b9-878a-3493a08a3308.mov

Game of Life

https://user-images.githubusercontent.com/37074839/204162517-35b429ad-4cef-45b1-b680-bc7a69a4e8c7.mov

Implementing your own cellular automaton logic

Using a simple interface you can implement your own cellular automaton animation. You need to provide a configuration table with an update function, which takes a 2D grid of cells and modifies it in place. Each cell by default consist of two fields:

Example sliding animation:

local config = {
    fps = 50,
    name = 'slide',
}

-- init function is invoked only once at the start
-- config.init = function (grid)
--
-- end

-- update function
config.update = function (grid)
    for i = 1, #grid do
        local prev = grid[i][#(grid[i])]
        for j = 1, #(grid[i]) do
            grid[i][j], prev = prev, grid[i][j]
        end
    end
    return true
end

require("cellular-automaton").register_animation(config)

Result:

https://user-images.githubusercontent.com/37074839/204161376-3b10aadd-90e1-4059-b701-ce318085622c.mov

Inspiration and references