HTMLify

scheme-switcher.lua
Views: 30 | Author: abh
--[[ color scheme switcher ]]--

local set_colorscheme_file_path = os.getenv("HOME") .. "/.local/share/nvim/.set_colorscheme"

local M = {};

function M.get_current_colorscheme()
    local file = io.open(set_colorscheme_file_path, "r")
    if not file then
        M.save_current_colorscheem("default")
    else
        local ccs = file:read("*l")
        file:close()
        return ccs
    end
    return M.get_current_colorscheme()
end

function M.save_current_colorscheem(colorscheme)
    local file = io.open(set_colorscheme_file_path, "w")
    file:write(colorscheme)
    file:close()
end

function M.get_colorschemes()
    return vim.fn.getcompletion("", "color")
end

function M.set_colorscheme(colorscheme)
    vim.cmd.colorscheme(colorscheme)
end

function M.colorscheme_menu()
    local schemes = M.get_colorschemes()
    local current_scheme = M.get_current_colorscheme()
    local buf = vim.api.nvim_create_buf(false, true)
    local win_w, win_h = vim.api.nvim_win_get_width(0), vim.api.nvim_win_get_height(0)
    local pane_w, pane_h = 30, win_h - 2
    if win_w < pane_w then
        pane_w = win_w
    end

    local metalines = {
        "Available colorschemes",
        "Press enter to set",
        "current colorscheme:",
        current_scheme,
        "",
    }
    vim.api.nvim_buf_set_lines(buf, 0, -1, false, metalines)
    for i, s in pairs(schemes) do
        vim.api.nvim_buf_set_lines(buf, #metalines + i, -1, false, { s })
    end

    local win = vim.api.nvim_open_win(buf, true, {
        relative="editor",
        row=0,
        col=win_w-pane_w,
        width=pane_w,
        height=pane_h,
        border="double",
    })

    vim.bo[buf].modifiable = false
    vim.wo[win].number = false
    vim.wo[win].relativenumber = false
    vim.wo[win].cursorline = true

    local function on_enter()
        local scheme_index, _ = unpack(vim.api.nvim_win_get_cursor(win))
        scheme_index = scheme_index - #metalines
        if scheme_index < 1 then
            print("invalid scheme selection")
            return
        end
        M.set_colorscheme(schemes[scheme_index])
        M.save_current_colorscheem(schemes[scheme_index])
        print("colorscheme set: ", schemes[scheme_index])
    end

    local function on_line_change()
        local scheme_index, _ = unpack(vim.api.nvim_win_get_cursor(win))
        scheme_index = scheme_index - #metalines
        if scheme_index >= 1 then
            M.set_colorscheme(schemes[scheme_index])
        end
    end

    local function on_esc()
        vim.api.nvim_buf_delete(buf, { force = true })

        vim.api.nvim_feedkeys(
            vim.api.nvim_replace_termcodes(
                "<Esc>", true, false, true
            ),
            "n", false
        )
    end

    vim.api.nvim_create_autocmd("CursorMoved", { buffer=buf, callback=on_line_change })

    vim.keymap.set("n", "<CR>", on_enter, { buffer=buf })
    vim.keymap.set("n", "<Esc>", on_esc, { buffer=buf })
    vim.keymap.set("n", "q", on_esc, { buffer=buf })
end


vim.api.nvim_create_user_command("SwitchColorScheme", M.colorscheme_menu, {})
vim.api.nvim_create_user_command("SwitchColor", M.colorscheme_menu, {})

return M;

Comments