diff options
Diffstat (limited to '.config/nvim/lua/utils')
-rw-r--r-- | .config/nvim/lua/utils/init.lua | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/.config/nvim/lua/utils/init.lua b/.config/nvim/lua/utils/init.lua new file mode 100644 index 0000000..bad55ce --- /dev/null +++ b/.config/nvim/lua/utils/init.lua @@ -0,0 +1,232 @@ +local utils = {} + +-- recursive Print (structure, limit, separator) +local function r_inspect_settings(structure, limit, separator) + limit = limit or 100 -- default item limit + separator = separator or "." -- indent string + if limit < 1 then + print "ERROR: Item limit reached." + return limit - 1 + end + if structure == nil then + io.write("-- O", separator:sub(2), " = nil\n") + return limit - 1 + end + local ts = type(structure) + + if ts == "table" then + for k, v in pairs(structure) do + -- replace non alpha keys wih ["key"] + if tostring(k):match "[^%a_]" then + k = '["' .. tostring(k) .. '"]' + end + limit = r_inspect_settings(v, limit, separator .. "." .. tostring(k)) + if limit < 0 then + break + end + end + return limit + end + + if ts == "string" then + -- escape sequences + structure = string.format("%q", structure) + end + separator = separator:gsub("%.%[", "%[") + if type(structure) == "function" then + -- don't print functions + io.write("-- O", separator:sub(2), " = function ()\n") + else + io.write("O", separator:sub(2), " = ", tostring(structure), "\n") + end + return limit - 1 +end + +function utils.generate_settings() + -- Opens a file in append mode + local file = io.open("settings.lua", "w") + + -- sets the default output file as test.lua + io.output(file) + + -- write all `O` related settings to `settings.lua` file + r_inspect_settings(O, 10000, ".") + + -- closes the open file + io.close(file) +end + +function utils.reload_config() + vim.cmd "source ~/.config/nvim/config.lua" + vim.cmd "source ~/.config/nvim/lua/plugins.lua" + local plugins = require "plugins" + local plugin_loader = require("plugin-loader").init() + plugin_loader:load { plugins, O.user_plugins } + vim.cmd "source ~/.config/nvim/lua/settings.lua" + vim.cmd "source ~/.config/nvim/lua/core/formatter.lua" + vim.cmd ":PackerCompile" + vim.cmd ":PackerInstall" + -- vim.cmd ":PackerClean" +end + +function utils.check_lsp_client_active(name) + local clients = vim.lsp.get_active_clients() + for _, client in pairs(clients) do + if client.name == name then + return true + end + end + return false +end + +function utils.add_keymap(mode, opts, keymaps) + for _, keymap in ipairs(keymaps) do + vim.api.nvim_set_keymap(mode, keymap[1], keymap[2], opts) + end +end + +function utils.add_keymap_normal_mode(opts, keymaps) + utils.add_keymap("n", opts, keymaps) +end + +function utils.add_keymap_visual_mode(opts, keymaps) + utils.add_keymap("v", opts, keymaps) +end + +function utils.add_keymap_visual_block_mode(opts, keymaps) + utils.add_keymap("x", opts, keymaps) +end + +function utils.add_keymap_insert_mode(opts, keymaps) + utils.add_keymap("i", opts, keymaps) +end + +function utils.add_keymap_term_mode(opts, keymaps) + utils.add_keymap("t", opts, keymaps) +end + +function utils.define_augroups(definitions) -- {{{1 + -- Create autocommand groups based on the passed definitions + -- + -- The key will be the name of the group, and each definition + -- within the group should have: + -- 1. Trigger + -- 2. Pattern + -- 3. Text + -- just like how they would normally be defined from Vim itself + for group_name, definition in pairs(definitions) do + vim.cmd("augroup " .. group_name) + vim.cmd "autocmd!" + + for _, def in pairs(definition) do + local command = table.concat(vim.tbl_flatten { "autocmd", def }, " ") + vim.cmd(command) + end + + vim.cmd "augroup END" + end +end + +function utils.unrequire(m) + package.loaded[m] = nil + _G[m] = nil +end + +utils.define_augroups { + + _general_settings = { + { + "TextYankPost", + "*", + "lua require('vim.highlight').on_yank({higroup = 'Search', timeout = 200})", + }, + { + "BufWinEnter", + "*", + "setlocal formatoptions-=c formatoptions-=r formatoptions-=o", + }, + { + "BufWinEnter", + "dashboard", + "setlocal cursorline signcolumn=yes cursorcolumn number", + }, + { + "BufRead", + "*", + "setlocal formatoptions-=c formatoptions-=r formatoptions-=o", + }, + { + "BufNewFile", + "*", + "setlocal formatoptions-=c formatoptions-=r formatoptions-=o", + }, + { "BufWritePost", "config.lua", "lua require('utils').reload_config()" }, + -- { "VimLeavePre", "*", "set title set titleold=" }, + }, + _solidity = { + { "BufWinEnter", ".tf", "setlocal filetype=hcl" }, + { "BufRead", "*.tf", "setlocal filetype=hcl" }, + { "BufNewFile", "*.tf", "setlocal filetype=hcl" }, + }, + -- _solidity = { + -- {'BufWinEnter', '.sol', 'setlocal filetype=solidity'}, {'BufRead', '*.sol', 'setlocal filetype=solidity'}, + -- {'BufNewFile', '*.sol', 'setlocal filetype=solidity'} + -- }, + -- _gemini = { + -- {'BufWinEnter', '.gmi', 'setlocal filetype=markdown'}, {'BufRead', '*.gmi', 'setlocal filetype=markdown'}, + -- {'BufNewFile', '*.gmi', 'setlocal filetype=markdown'} + -- }, + _markdown = { + { "FileType", "markdown", "setlocal wrap" }, + { "FileType", "markdown", "setlocal spell" }, + }, + _buffer_bindings = { + { "FileType", "floaterm", "nnoremap <silent> <buffer> q :q<CR>" }, + }, + _auto_resize = { + -- will cause split windows to be resized evenly if main window is resized + { "VimResized", "*", "wincmd =" }, + }, + _packer_compile = { + -- will cause split windows to be resized evenly if main window is resized + { "BufWritePost", "plugins.lua", "PackerCompile" }, + }, + + -- _fterm_lazygit = { + -- -- will cause esc key to exit lazy git + -- {"TermEnter", "*", "call LazyGitNativation()"} + -- }, + -- _mode_switching = { + -- -- will switch between absolute and relative line numbers depending on mode + -- {'InsertEnter', '*', 'if &relativenumber | let g:ms_relativenumberoff = 1 | setlocal number norelativenumber | endif'}, + -- {'InsertLeave', '*', 'if exists("g:ms_relativenumberoff") | setlocal relativenumber | endif'}, + -- {'InsertEnter', '*', 'if &cursorline | let g:ms_cursorlineoff = 1 | setlocal nocursorline | endif'}, + -- {'InsertLeave', '*', 'if exists("g:ms_cursorlineoff") | setlocal cursorline | endif'}, + -- }, + _user_autocommands = O.user_autocommands, +} + +function utils.gsub_args(args) + if args == nil or type(args) ~= "table" then + return args + end + local buffer_filepath = vim.fn.fnameescape(vim.api.nvim_buf_get_name(0)) + for i = 1, #args do + args[i] = string.gsub(args[i], "${FILEPATH}", buffer_filepath) + end + return args +end + +vim.cmd [[ + function! QuickFixToggle() + if empty(filter(getwininfo(), 'v:val.quickfix')) + copen + else + cclose + endif +endfunction +]] + +return utils + +-- TODO: find a new home for these autocommands" |