aboutsummaryrefslogtreecommitdiff
path: root/lua/startup.lua
diff options
context:
space:
mode:
authormax397574 <[email protected]>2021-10-19 18:18:59 +0200
committermax397574 <[email protected]>2021-10-19 18:18:59 +0200
commit3bf7bf4a3cb0e67f2ea543a6920d91d8baf15c05 (patch)
tree5037275108407fbac005b20ba8e675a4ab7aac16 /lua/startup.lua
parentc54a96b4e45f45bd650467686aa28ff17924484d (diff)
feat(sections): ✨started adding sections
Diffstat (limited to 'lua/startup.lua')
-rw-r--r--lua/startup.lua171
1 files changed, 147 insertions, 24 deletions
diff --git a/lua/startup.lua b/lua/startup.lua
index 39cf408..b442684 100644
--- a/lua/startup.lua
+++ b/lua/startup.lua
@@ -3,6 +3,11 @@ local ns = vim.api.nvim_create_namespace "startup"
-- tables with tables: {line, align, cursor_should move on}
M.lines = {}
M.formatted_text = {}
+M.sections = {}
+M.open_sections = {}
+
+local section_types = {}
+local section_alignments = {}
local current_section = ""
@@ -12,6 +17,39 @@ local settings = require "startup.config"
local utils = require "startup.utils"
local spaces = utils.spaces
+function M.open_section()
+ vim.api.nvim_buf_set_option(0, "modifiable", true)
+ local line_nr = vim.api.nvim_win_get_cursor(0)[1]
+ local section_name = vim.trim(vim.api.nvim_get_current_line())
+ local section_type = section_types[section_name]
+ local section_align = section_alignments[section_name]
+ local section_entries = M.sections[section_name]
+ if section_name == "" then
+ return
+ end
+ if section_type == "mapping" then
+ section_entries = require("startup").mapping_names(section_entries)
+ end
+ section_entries = require("startup").align(section_entries, section_align)
+ for i, section in ipairs(M.open_sections) do
+ if section == section_name then
+ vim.api.nvim_buf_set_lines(
+ 0,
+ line_nr,
+ line_nr + #section_entries,
+ false,
+ {}
+ )
+ table.remove(M.open_sections, i)
+ return
+ end
+ end
+ vim.api.nvim_buf_set_lines(0, line_nr, line_nr, false, section_entries)
+ table.insert(M.open_sections, section_name)
+ vim.cmd [[silent! %s/\s\+$//]] -- clear trailing whitespace
+ vim.api.nvim_buf_set_option(0, "modifiable", false)
+end
+
local function create_mappings(mappings)
vim.api.nvim_buf_set_keymap(
0,
@@ -30,6 +68,13 @@ local function create_mappings(mappings)
vim.api.nvim_buf_set_keymap(
0,
"n",
+ "<tab>",
+ "<cmd>lua require'startup'.open_section()<CR>",
+ opts
+ )
+ vim.api.nvim_buf_set_keymap(
+ 0,
+ "n",
"<c-o>",
"<cmd>lua require('startup').open_file_vsplit()<CR>",
opts
@@ -78,7 +123,35 @@ function M.open_file_vsplit()
print(filename)
vim.cmd("vsplit " .. filename)
end
-
+function M.align(dict, alignment)
+ local margin_calculated = 0
+ if settings[current_section].margin < 1 then
+ margin_calculated = vim.o.columns * settings[current_section].margin
+ else
+ margin_calculated = settings[current_section].margin
+ end
+ local aligned = {}
+ local max_len = utils.longest_line(dict)
+ if alignment == "center" then
+ local space_left = vim.o.columns - max_len
+ for _, line in ipairs(dict) do
+ table.insert(aligned, spaces(space_left / 2) .. line)
+ end
+ elseif alignment == "left" then
+ for _, line in ipairs(dict) do
+ table.insert(aligned, spaces(margin_calculated) .. line)
+ end
+ elseif alignment == "right" then
+ for _, line in ipairs(dict) do
+ table.insert(
+ aligned,
+ spaces(vim.o.columns - max_len - margin_calculated - 10) .. line
+ )
+ end
+ end
+ margin_calculated = 0
+ return aligned
+end
local function align(dict, alignment)
local margin_calculated = 0
if settings[current_section].margin < 1 then
@@ -130,11 +203,24 @@ end
local function empty(amount)
for _ = 1, amount, 1 do
- set_lines(1, { " " }, "center", "StartupTools")
table.insert(M.lines, { " ", "center", false, "normal" })
end
end
+function M.mapping_names(mappings)
+ local mapnames = {}
+ for name, cmd in pairs(mappings) do
+ if settings.options.empty_lines_between_mappings then
+ table.insert(mapnames, " ")
+ end
+ if settings.options.mapping_keys then
+ table.insert(mapnames, name .. " " .. cmd[2])
+ else
+ table.insert(mapnames, name)
+ end
+ end
+ return mapnames
+end
local function mapping_names(mappings)
local mapnames = {}
for name, cmd in pairs(mappings) do
@@ -154,7 +240,7 @@ end
function M.display()
vim.schedule(function()
U.set_buf_options()
- local parts = { "header", "body", "footer" }
+ local parts = settings.parts
for _, part in ipairs(parts) do
current_section = part
local options = settings[part]
@@ -170,47 +256,84 @@ function M.display()
options.highlight = "Startup" .. part
end
if options.type == "text" then
- for _, line in ipairs(options.content) do
+ if options.section then
+ section_types[vim.trim(options.title)] = "text"
+ section_alignments[vim.trim(options.title)] = options.align
+ M.sections[vim.trim(options.title)] = options.content
table.insert(
M.lines,
- { line, options.align, false, options.highlight }
+ { options.title, options.align, true, options.highlight }
)
+ else
+ for _, line in ipairs(options.content) do
+ table.insert(
+ M.lines,
+ { line, options.align, false, options.highlight }
+ )
+ end
end
elseif options.type == "mapping" then
- for _, line in ipairs(mapping_names(options.content)) do
+ if options.section then
+ section_types[vim.trim(options.title)] = "mapping"
+ section_alignments[vim.trim(options.title)] = options.align
+ M.sections[vim.trim(options.title)] = options.content
table.insert(
M.lines,
- { line, options.align, true, options.highlight }
+ { options.title, options.align, true, options.highlight }
)
+ else
+ for _, line in ipairs(mapping_names(options.content)) do
+ table.insert(
+ M.lines,
+ { line, options.align, true, options.highlight }
+ )
+ end
end
table.insert(sections_with_mappings, part)
create_mappings(options.content)
elseif options.type == "oldfiles" then
- local old_files = utils.get_oldfiles(settings.options.oldfiles_amount)
- table.insert(M.lines, {
- "Use 'o' to open the file at the current line.",
- options.align,
- false,
- options.highlight,
- })
- table.insert(M.lines, {
- "ctrl+'o' to open the file in a split",
- options.align,
- false,
- options.highlight,
- })
- empty(1)
- for _, line in ipairs(old_files) do
+ local oldfiles = {}
+ if options.oldfiles_directory then
+ old_files = utils.get_oldfiles_directory(
+ settings.options.oldfiles_amount
+ )
+ else
+ old_files = utils.get_oldfiles(settings.options.oldfiles_amount)
+ end
+ if options.section then
+ section_types[vim.trim(options.title)] = "oldfiles"
+ section_alignments[vim.trim(options.title)] = options.align
+ M.sections[vim.trim(options.title)] = old_files
table.insert(
M.lines,
- { line, options.align, true, options.highlight }
+ { options.title, options.align, true, options.highlight }
)
+ else
+ table.insert(M.lines, {
+ "Use 'o' to open the file at the current line.",
+ options.align,
+ false,
+ options.highlight,
+ })
+ table.insert(M.lines, {
+ "ctrl+'o' to open the file in a split",
+ options.align,
+ false,
+ options.highlight,
+ })
+ empty(1)
+ for _, line in ipairs(old_files) do
+ table.insert(
+ M.lines,
+ { line, options.align, true, options.highlight }
+ )
+ end
end
end
if part == "header" then
empty(settings.options.padding.header_body)
elseif part == "body" then
- empty(settings.options.padding.body_footer + 1)
+ empty(settings.options.padding.body_footer)
end
create_mappings {}
vim.cmd(options.command)