Myzel394
easytables.nvim
Lua

Easily insert and edit markdown tables using Neovim with a live preview and useful helpers

Last updated Jul 6, 2026
146
Stars
4
Forks
2
Issues
+1
Stars/day
Attention Score
43
Language breakdown
Lua 100.0%
โ–ธ Files click to expand
README

Easytables

Make Markdown tables great again!

Preview of usage of easytables

Please note that this is a work in progress.

Features

  • Preview tables in real time
  • Add and remove rows and columns
  • Move rows and columns
  • Move cells

Usage

Installation

Using packer:

use "Myzel394/easytables.nvim"

Tutorial

Inserting a new table

Go to the place where you want to insert your table and either call:

  • :EasyTablesCreateNew <width>x<height> - Creates a new table with <width> columns and <height> rows
  • :EasyTablesCreateNew <width> - Creates a square table with the size of <width> (eg. :EasyTablesCreateNew 5 -> Creates a 5x5 table)
  • :EasyTablesCreateNew <width>x - Creates a table with <width> columns and one row
  • :EasyTablesCreateNew x<height> - Creates a table with one column and <height> rows

Editing an existing table

Go to your table (doesn't matter where, can be at a border or inside a cell) and type:

:EasyTablesImportThisTable

Custom Setup

Make sure to call the setup function!

after/plugin/easytables.lua

require("easytables").setup {
  -- Your configuration comes here
}

Default configuration

By default, easytables configures default characters for the table and registers the following keymaps:

  • <Left>: Move cell left (in normal mode, applies to all other directions)
  • <S-Left>: Swaps cell with cell to the left (in normal mode, applies to all other directions)
  • <C-Left>: Swaps column with column to the left (in normal mode, applies to all other directions)
  • <Tab>: Move cell to the next cell (in normal mode, either to the right or to the beginning of the next line)
  • <S-Tab>: Move cell to the previous cell (in normal mode, either to the left or to the end of the previous line)
This is the default configuration:
{
    table = {
        -- Whether to enable the header by default
        headerenabledby_default = true,
        window = {
            preview_title = "Table Preview",
            prompt_title = "Cell content",
            -- Either "auto" to automatically size the window, or a string
            -- in the format of "<width>x<height>" (e.g. "20x10")
            size = "auto"
        },
        cell = {
            -- Min width of a cell (excluding padding)
            min_width = 3,
            -- Filler character for empty cells
            filler = " ",
            align = "left",
        },
        -- Characters used to draw the table
        -- Do not worry about multibyte characters, they are handled correctly
        border = {
            top_left = "โ”Œ",
            top_right = "โ”",
            bottom_left = "โ””",
            bottom_right = "โ”˜",
            horizontal = "โ”€",
            vertical = "โ”‚",
            left_t = "โ”œ",
            right_t = "โ”ค",
            top_t = "โ”ฌ",
            bottom_t = "โ”ด",
            cross = "โ”ผ",
            headerleftt = "โ•ž",
            headerrightt = "โ•ก",
            headerbottomt = "โ•ง",
            header_cross = "โ•ช",
            header_horizontal = "โ•",
        }
    },
    export = {
        markdown = {
            -- Padding around the cell content, applied BOTH left AND right
            -- E.g: padding = 1, content = "foo" -> " foo "
            padding = 1,
            -- What markdown characters are used for the export, you probably
            -- don't want to change these
            characters = {
                horizontal = "-",
                vertical = "|",
                -- Filler for padding
                filler = " "
            }
        }
    },
    set_mappings = function(buf)
        vim.api.nvimbufset_keymap(
            buf,
            "n",
            "<Left>",
            ":JumpLeft<CR>",
            {}
        )
        vim.api.nvimbufset_keymap(
            buf,
            "n",
            "<S-Left>",
            ":SwapWithLeftCell<CR>",
            {}
        )

vim.api.nvimbufset_keymap( buf, "n", "<Right>", ":JumpRight<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<S-Right>", ":SwapWithRightCell<CR>", {} )

vim.api.nvimbufset_keymap( buf, "n", "<Up>", ":JumpUp<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<S-Up>", ":SwapWithUpperCell<CR>", {} )

vim.api.nvimbufset_keymap( buf, "n", "<Down>", ":JumpDown<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<S-Down>", ":SwapWithLowerCell<CR>", {} )

vim.api.nvimbufset_keymap( buf, "n", "<Tab>", ":JumpToNextCell<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<S-Tab>", ":JumpToPreviousCell<CR>", {} )

vim.api.nvimbufset_keymap( buf, "n", "<C-Left>", ":SwapWithLeftColumn<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<C-Right>", ":SwapWithRightColumn<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<C-Up>", ":SwapWithUpperRow<CR>", {} ) vim.api.nvimbufset_keymap( buf, "n", "<C-Down>", ":SwapWithLowerRow<CR>", {} ) end

}

Limitations

  • This plugin currently does not work well with big tables

This project is stupid, the code is awful, go away

I know that the code is probably not the best, it's my first ever written neovim plugin. You are more than welcome to contribute to this project, I will gladly accept any help.

Donate

It might sound crazy, but if you would just donate 1$, it would totally mean to world to me, since it's a really small amount and if everyone did that, I can totally focus on easytables and my other open source projects. :)

You can donate via:

  • GitHub Sponsors
  • Bitcoin: bc1qw054829yj8e2u8glxnfcg3w22dkek577mjt5x6
  • Monero: 83dm5wyuckG4aPbuMREHCEgLNwVn5i7963SKBhECaA7Ueb7DKBTy639R3QfMtb3DsFHMp8u6WGiCFgbdRDBBcz5sLduUtm8
๐Ÿ”— More in this category

ยฉ 2026 GitRepoTrend ยท Myzel394/easytables.nvim ยท Updated daily from GitHub