Myzel394/easytables.nvim

github github
programming-languages-supportmarkdown-and-latex
stars 68
issues 2
subscribers 3
forks 2
CREATED

2023-10-04

UPDATED

3 months ago


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
        header_enabled_by_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 = "┼",
            header_left_t = "╞",
            header_right_t = "╡",
            header_bottom_t = "╧",
            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.nvim_buf_set_keymap(
            buf,
            "n",
            "<Left>",
            ":JumpLeft<CR>",
            {}
        )
        vim.api.nvim_buf_set_keymap(
            buf,
            "n",
            "<S-Left>",
            ":SwapWithLeftCell<CR>",
            {}
        )

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

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

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

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

        vim.api.nvim_buf_set_keymap(
            buf,
            "n",
            "<C-Left>",
            ":SwapWithLeftColumn<CR>",
            {}
        )
        vim.api.nvim_buf_set_keymap(
            buf,
            "n",
            "<C-Right>",
            ":SwapWithRightColumn<CR>",
            {}
        )
        vim.api.nvim_buf_set_keymap(
            buf,
            "n",
            "<C-Up>",
            ":SwapWithUpperRow<CR>",
            {}
        )
        vim.api.nvim_buf_set_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