aboutsummaryrefslogtreecommitdiff
path: root/lua/startuptools.lua
blob: 32abb124f0246e124b929530428fc868d28308a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
local M = {}
local ns = vim.api.nvim_create_namespace "startuptools"

local opts = { noremap = true, silent = true }

local settings = {
  -- every line should be same width without escaped \
  header = {
    "                                          /$$              ",
    "                                         |__/              ",
    " /$$$$$$$   /$$$$$$   /$$$$$$  /$$    /$$ /$$ /$$$$$$/$$$$ ",
    "| $$__  $$ /$$__  $$ /$$__  $$|  $$  /$$/| $$| $$_  $$_  $$",
    "| $$  \\ $$| $$$$$$$$| $$  \\ $$ \\  $$/$$/ | $$| $$ \\ $$ \\ $$",
    "| $$  | $$| $$_____/| $$  | $$  \\  $$$/  | $$| $$ | $$ | $$",
    "| $$  | $$|  $$$$$$$|  $$$$$$/   \\  $/   | $$| $$ | $$ | $$",
    "|__/  |__/ \\_______/ \\______/     \\_/    |__/|__/ |__/ |__/",
  },
  -- name which will be displayed and command
  tools = {
    [" Find File"] = {"Telescope find_files", "<leader>ff"},
    [" Find Word"] = {"Telescope live_grep", "<leader>lg"},
    [" Recent Files"] = {"Telescope oldfiles", "<leader>of"},
    [" File Browser"] = {"Telescope file_browser", "<leader>fb"},
    [" Config Files"] = {'lua require("telescope.builtin").find_files({cwd="~/.config"})', "<leader>cf"},
    [" Colorschemes"] = {"Telescope colorscheme", "<leader>cs"},
    [" New File"] = {"lua require'startuptools'.new_file()", "<leader>nf"},
  },
  options = {
    align = "center", -- center or padding
    mapping_names = true,
    padding = 5, -- only used if align padding
  }
}

local function spaces(amount)
  return string.rep(" ", amount)
end

local function longest_line(lines)
  local longest = 0
  for _, line in ipairs(lines) do
    if line:len() > longest then
      longest = line:len()
    end
  end
  return longest
end

local function create_mappings()
  vim.api.nvim_buf_set_keymap(
    0,
    "n",
    "<CR>",
    ":lua require'startuptools'.check_line()<CR>",
    opts
  )
  for _, cmd in pairs(settings.tools) do
    vim.api.nvim_buf_set_keymap(0, "n", cmd[2], "<cmd>"..cmd[1].."<CR>", opts)
  end
end

function M.new_file()
  local name = vim.fn.input "Filename: > "
  vim.cmd("e " .. name)
end

function M.check_line()
  local line = vim.api.nvim_get_current_line()
  for name, command in pairs(settings.tools) do
    if line:match(name) then
      vim.cmd(command[1])
    end
  end
end

local function align(dict)
  local aligned = {}
  if settings.options.align == "center" then
    local max_len = longest_line(dict)
    local space_left = vim.o.columns - max_len
    for _, line in ipairs(dict) do
      table.insert(aligned, spaces(space_left/2).. line)
    end
  elseif settings.options.align == "padding" then
    for _, line in ipairs(dict) do
      table.insert(aligned, spaces(settings.options.padding).. line)
    end
  end
  return aligned
end

local count = 1
local function set_lines(len, text, hi, pass)
  vim.api.nvim_buf_set_lines(0, count, count + len, false, align(text))
  vim.api.nvim_win_set_cursor(0, { count, 0 })
  if pass then
    vim.g.section_length = count
  end
  for i = count, count + len do
    vim.api.nvim_buf_add_highlight(0, ns, hi, i, 1, -1)
  end
  count = count + len
end

local function empty()
  set_lines(1, { " " }, "TSString")
end

local function set_options()
  vim.api.nvim_buf_set_option(0, "bufhidden", "wipe")
  vim.api.nvim_buf_set_option(0, "buftype", "nofile")
  vim.api.nvim_buf_set_option(0, "swapfile", false)
  vim.cmd [[set nonumber
  set norelativenumber
  ]]
end

function M.display()
  create_mappings()
  vim.api.nvim_buf_set_keymap(0, "n", "j", "2j", opts)
  vim.api.nvim_buf_set_keymap(0, "n", "k", "2k", opts)
  empty()
  set_lines(#settings.header, settings.header, "TSString")
  local toolnames = {}
  for name, cmd in pairs(settings.tools) do
    table.insert(toolnames, " ")
    if settings.options.mapping_names then
      table.insert(toolnames, name .. "  " .. cmd[2])
    else
      table.insert(toolnames, name)
    end
  end
  empty()
  set_lines(#toolnames, toolnames, "TSString")
  vim.cmd [[silent! %s/\s\+$//]] -- clear trailing whitespace
  set_options()
  vim.api.nvim_win_set_cursor(0, { #settings.header + 5, vim.o.columns / 2 })
end

function M.setup(update)
  settings = vim.tbl_deep_extend("force", settings, update or {})
  vim.cmd [[
  autocmd StdinReadPre * let s:std_in=1
  autocmd VimEnter * lua if vim.fn.argc() == 0 and vim.fn.exists('std_in') then require"startuptools".display() end
  ]]
end

return M