From e39011a95c857edf259553a1dfcb6589d6015edd Mon Sep 17 00:00:00 2001 From: John-WE1DER Date: Sat, 17 May 2025 03:32:43 -0500 Subject: [PATCH] First push of files to repository --- init.lua | 2 + lazy-lock.json | 31 +++++++ lua/options.lua | 25 ++++++ lua/plugins.desktop.bak | 2 + lua/plugins.lua | 36 ++++++++ lua/plugins/cmp.lua | 88 +++++++++++++++++++ lua/plugins/colorizer.lua | 14 ++++ lua/plugins/html-liveview.lua | 6 ++ lua/plugins/kanagawa.lua | 7 ++ lua/plugins/lsp/init.lua | 130 +++++++++++++++++++++++++++++ lua/plugins/lsp/servers/bashls.lua | 20 +++++ lua/plugins/lsp/servers/cssls.lua | 32 +++++++ lua/plugins/lsp/servers/luals.lua | 33 ++++++++ lua/plugins/lsp/servers/phpls.lua | 40 +++++++++ lua/plugins/lsp/servers/pylsp.lua | 40 +++++++++ lua/plugins/lsp/servers/yamlls.lua | 3 + lua/plugins/lualine.lua | 51 +++++++++++ lua/plugins/luasnip.lua | 35 ++++++++ lua/plugins/mason.lua | 53 ++++++++++++ lua/plugins/nvim-treesitter.lua | 70 ++++++++++++++++ lua/utils/duplicates.lua | 73 ++++++++++++++++ lua/utils/functions.lua | 126 ++++++++++++++++++++++++++++ lua/utils/icons.lua | 109 ++++++++++++++++++++++++ lua/utils/remaps.lua | 44 ++++++++++ 24 files changed, 1070 insertions(+) create mode 100644 init.lua create mode 100644 lazy-lock.json create mode 100644 lua/options.lua create mode 100644 lua/plugins.desktop.bak create mode 100644 lua/plugins.lua create mode 100644 lua/plugins/cmp.lua create mode 100644 lua/plugins/colorizer.lua create mode 100644 lua/plugins/html-liveview.lua create mode 100644 lua/plugins/kanagawa.lua create mode 100644 lua/plugins/lsp/init.lua create mode 100644 lua/plugins/lsp/servers/bashls.lua create mode 100644 lua/plugins/lsp/servers/cssls.lua create mode 100644 lua/plugins/lsp/servers/luals.lua create mode 100644 lua/plugins/lsp/servers/phpls.lua create mode 100644 lua/plugins/lsp/servers/pylsp.lua create mode 100644 lua/plugins/lsp/servers/yamlls.lua create mode 100644 lua/plugins/lualine.lua create mode 100644 lua/plugins/luasnip.lua create mode 100644 lua/plugins/mason.lua create mode 100644 lua/plugins/nvim-treesitter.lua create mode 100644 lua/utils/duplicates.lua create mode 100644 lua/utils/functions.lua create mode 100644 lua/utils/icons.lua create mode 100644 lua/utils/remaps.lua diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..48b203f --- /dev/null +++ b/init.lua @@ -0,0 +1,2 @@ +require("options") +require("plugins") diff --git a/lazy-lock.json b/lazy-lock.json new file mode 100644 index 0000000..5b15ae0 --- /dev/null +++ b/lazy-lock.json @@ -0,0 +1,31 @@ +{ + "LuaSnip": { "branch": "master", "commit": "c9b9a22904c97d0eb69ccb9bab76037838326817" }, + "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" }, + "cmp-nvim-lsp-signature-help": { "branch": "main", "commit": "031e6ba70b0ad5eee49fd2120ff7a2e325b17fa7" }, + "cmp-nvim-lua": { "branch": "main", "commit": "f12408bdb54c39c23e67cab726264c10db33ada8" }, + "cmp-path": { "branch": "main", "commit": "c6635aae33a50d6010bf1aa756ac2398a2d54c32" }, + "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, + "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, + "kanagawa.nvim": { "branch": "master", "commit": "cc3b68b08e6a0cb6e6bf9944932940091e49bb83" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "live-preview.nvim": { "branch": "main", "commit": "598672eaf91b38946626677f8e80426e6e7ceccc" }, + "lsp_lines.nvim": { "branch": "main", "commit": "a92c755f182b89ea91bd8a6a2227208026f27b4d" }, + "lspkind-nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" }, + "lualine.nvim": { "branch": "master", "commit": "0ea56f91b7f51a37b749c050a5e5dfdd56b302b3" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" }, + "mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" }, + "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, + "nvim-autopairs": { "branch": "master", "commit": "2a406cdd8c373ae7fe378a9e062a5424472bd8d8" }, + "nvim-cmp": { "branch": "main", "commit": "059e89495b3ec09395262f16b1ad441a38081d04" }, + "nvim-colorizer.lua": { "branch": "master", "commit": "517df88cf2afb36652830df2c655df2da416a0ae" }, + "nvim-lspconfig": { "branch": "master", "commit": "4ea9083b6d3dff4ddc6da17c51334c3255b7eba5" }, + "nvim-treesitter": { "branch": "master", "commit": "0e21ee8df6235511c02bab4a5b391d18e165a58d" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "698b5f805722254bca3c509591c1806d268b6c2f" }, + "nvim-web-devicons": { "branch": "master", "commit": "57dfa947cc88cdf1baa2c7e13ed31edddd8fb1d1" }, + "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, + "schemastore.nvim": { "branch": "main", "commit": "992285058ce208825eb1b9ac82fa6be7d76ffcc1" }, + "spellwarn.nvim": { "branch": "main", "commit": "12734b47b008d912b4925c0bc2c1248eb534409d" }, + "tailwindcss-colorizer-cmp.nvim": { "branch": "main", "commit": "3d3cd95e4a4135c250faf83dd5ed61b8e5502b86" }, + "telescope.nvim": { "branch": "master", "commit": "a4ed82509cecc56df1c7138920a1aeaf246c0ac5" } +} diff --git a/lua/options.lua b/lua/options.lua new file mode 100644 index 0000000..1d9834d --- /dev/null +++ b/lua/options.lua @@ -0,0 +1,25 @@ +--Vim Commands +vim.opt.termguicolors = true + +vim.opt.clipboard = "unnamedplus" + +vim.opt.tabstop = 4 +vim.opt.shiftwidth = 4 +vim.opt.softtabstop = 4 +vim.opt.expandtab = true + +vim.opt.number = true +vim.opt.relativenumber = true + +vim.opt.scrolloff = 999 + +vim.opt.splitbelow = true +vim.opt.splitright = true + +vim.opt.virtualedit = "block" + +vim.opt.inccommand = "split" + +vim.opt.ignorecase = true + +vim.g.mapleader = " " diff --git a/lua/plugins.desktop.bak b/lua/plugins.desktop.bak new file mode 100644 index 0000000..ce14a24 --- /dev/null +++ b/lua/plugins.desktop.bak @@ -0,0 +1,2 @@ +return require('packer').startup(function(use) + use 'wbthomason/packer.nvim' diff --git a/lua/plugins.lua b/lua/plugins.lua new file mode 100644 index 0000000..2c891fe --- /dev/null +++ b/lua/plugins.lua @@ -0,0 +1,36 @@ + +-- Lazy.nvim Setup + +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end + +vim.opt.rtp:prepend(lazypath) + +local status_ok, lazy = pcall(require, "lazy") +if not status_ok then + print("lazy just installed, please restart neovim") + return +end + +lazy.setup({ + spec = { + require("plugins.kanagawa"), + require("plugins.lualine"), + require("plugins.nvim-treesitter"), + require("plugins.colorizer"), + require("plugins.cmp"), + require("plugins.luasnip"), + require("plugins.mason"), + require("plugins.lsp"), + require("plugins.html-liveview") + }, +}) diff --git a/lua/plugins/cmp.lua b/lua/plugins/cmp.lua new file mode 100644 index 0000000..09c37a6 --- /dev/null +++ b/lua/plugins/cmp.lua @@ -0,0 +1,88 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "hrsh7th/cmp-nvim-lsp-signature-help", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "saadparwaiz1/cmp_luasnip", + "hrsh7th/cmp-nvim-lua", + "windwp/nvim-autopairs", + "onsails/lspkind-nvim", + { "roobert/tailwindcss-colorizer-cmp.nvim", config = true } + }, + config = function() + local cmp = require("cmp") + local lsp_kind = require("lspkind") + local cmp_next = function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif require("luasnip").expand_or_jumpable() then + vim.fn.feedkeys(vim.api.nvim_replace_termcodes("luasnip-expand-or-jump", true, true, true), "") + else + fallback() + end + end + local cmp_prev = function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif require("luasnip").jumpable(-1) then + vim.fn.feedkeys(vim.api.nvim_replace_termcodes("luasnip-jump-prev", true, true, true), "") + else + fallback() + end + end + + lsp_kind.init() + ---@diagnostic disable-next-line + cmp.setup({ + enabled = true, + preselect = cmp.PreselectMode.None, + window = { + completion = cmp.config.window.bordered({ + winhighlight = "Normal:Normal,FloatBorder:LspBorderBG,CursorLine:PmenuSel,Search:None", + }), + documentation = cmp.config.window.bordered({ + winhighlight = "Normal:Normal,FloatBorder:LspBorderBG,CursorLine:PmenuSel,Search:None", + }), + }, + ---@diagnostic disable-next-line + view = { + entries = "bordered", + }, + snippet = { + expand = function(args) + require("luasnip").lsp_expand(args.body) + end, + }, + mapping = { + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.close(), + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }), + [""] = cmp_next, + [""] = cmp_next, + [""] = cmp_prev, + [""] = cmp_prev, + }, + sources = { + { name = "nvim_lsp_signature_help", group_index = 1 }, + { name = "luasnip", max_item_count = 5, group_index = 1 }, + { name = "nvim_lsp", max_item_count = 20, group_index = 1 }, + { name = "nvim_lua", group_index = 1 }, + { name = "vim-dadbod-completion", group_index = 1 }, + { name = "path", group_index = 2 }, + { name = "buffer", keyword_length = 2, max_item_count = 5, group_index = 2 }, + }, + }) + local presentAutopairs, cmp_autopairs = pcall(require, "nvim-autopairs.completion.cmp") + if not presentAutopairs then + return + end + cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done({ map_char = { tex = "" } })) + end, +} diff --git a/lua/plugins/colorizer.lua b/lua/plugins/colorizer.lua new file mode 100644 index 0000000..30281b8 --- /dev/null +++ b/lua/plugins/colorizer.lua @@ -0,0 +1,14 @@ + +-- Nvim-Colorizer Plugin +return { + "catgoose/nvim-colorizer.lua", + config = function() + require("colorizer").setup({ + filetypes = { + "*", -- Highlight all filetypes + css = { rgb_fn = true }, -- Enable parsing of RGB functions in CSS + html = { names = false }, -- Disable parsing of "names" like blue, red, green, etc in HTML + }, + }) + end, +} diff --git a/lua/plugins/html-liveview.lua b/lua/plugins/html-liveview.lua new file mode 100644 index 0000000..b45ac77 --- /dev/null +++ b/lua/plugins/html-liveview.lua @@ -0,0 +1,6 @@ +return { + "brianhuster/live-preview.nvim", + dependencies = { + "nvim-telescope/telescope.nvim" + }, +} diff --git a/lua/plugins/kanagawa.lua b/lua/plugins/kanagawa.lua new file mode 100644 index 0000000..705a80b --- /dev/null +++ b/lua/plugins/kanagawa.lua @@ -0,0 +1,7 @@ +-- Colorscheme +return { + "rebelot/kanagawa.nvim", + config = function() + vim.cmd.colorscheme("kanagawa-wave") + end, +} diff --git a/lua/plugins/lsp/init.lua b/lua/plugins/lsp/init.lua new file mode 100644 index 0000000..51eaf16 --- /dev/null +++ b/lua/plugins/lsp/init.lua @@ -0,0 +1,130 @@ +return { + "neovim/nvim-lspconfig", + dependencies = { + "folke/neodev.nvim", + "b0o/schemastore.nvim", + "ravibrock/spellwarn.nvim", + "williamboman/mason-lspconfig.nvim", + "https://git.sr.ht/~whynothugo/lsp_lines.nvim", + }, + event = { "BufReadPre", "BufNewFile" }, + config = function() + require("neodev").setup({}) + require("lsp_lines").setup() + require("spellwarn").setup() + local lspconfig = require("lspconfig") + -- local remaps = require("plugins.lsp.remaps") + local icons = require("utils.icons") + + local presentCmpNvimLsp, cmp_lsp = pcall(require, "cmp_nvim_lsp") + local presentLspSignature, lsp_signature = pcall(require, "lsp_signature") + + vim.lsp.set_log_level("error") + + local function on_attach(client, bufnr) + remaps.set_default_on_buffer(client, bufnr) + if presentLspSignature then + lsp_signature.on_attach({ floating_window = false, timer_interval = 500 }) + end + end + + local signs = { + { name = "DiagnosticSignError", text = icons.diagnostics.error }, + { name = "DiagnosticSignWarn", text = icons.diagnostics.warning }, + { name = "DiagnosticSignHint", text = icons.diagnostics.hint }, + { name = "DiagnosticSignInfo", text = icons.diagnostics.information }, + } + for _, sign in ipairs(signs) do + vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" }) + end + + local config = { + virtual_text = false, -- appears after the line + virtual_lines = false, -- appears under the line + signs = { + active = signs, + }, + flags = { + debounce_text_changes = 200, + }, + update_in_insert = true, + underline = true, + severity_sort = true, + float = { + focus = false, + focusable = false, + style = "minimal", + border = "shadow", + source = "always", + header = "", + prefix = "", + }, + } + lspconfig.util.default_config = vim.tbl_deep_extend("force", lspconfig.util.default_config, config) + vim.diagnostic.config(config) + + local border = { + border = "shadow", + } + vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.hover, border) + vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, border) + + local capabilities + if presentCmpNvimLsp then + capabilities = cmp_lsp.default_capabilities(vim.lsp.protocol.make_client_capabilities()) + else + capabilities = vim.lsp.protocol.make_client_capabilities() + end + + local servers = { + bashls = require("plugins.lsp.servers.bashls")(on_attach), + cssls = require("plugins.lsp.servers.cssls")(on_attach), + dockerls = {}, + html = {}, + jsonls = {}, + lua_ls = require("plugins.lsp.servers.luals")(on_attach), + intelephense = require("plugins.lsp.servers.phpls")(on_attach), + pylsp = require("plugins.lsp.servers.pylsp")(on_attach), + rust_analyzer = {}, + tailwindcss = require("plugins.lsp.servers.tailwindcss")(on_attach), + terraformls = {}, + tflint = {}, + ts_ls = require("plugins.lsp.servers.ts_ls")(on_attach), + yamlls = {}, + } + + local default_lsp_config = { + on_attach = on_attach, + capabilities = capabilities, + flags = { + debounce_text_changes = 200, + allow_incremental_sync = true, + }, + } + + local server_names = {} + local server_configs = {} + for server_name, server_config in pairs(servers) do + table.insert(server_names, server_name) + server_configs[server_name] = server_config + end + + local present_mason, mason = pcall(require, "mason-lspconfig") + if present_mason then + mason.setup({ ensure_installed = server_names }) + mason.setup_handlers({ + function(server) + local merged_config = vim.tbl_deep_extend("force", default_lsp_config, server_configs[server] or {}) + lspconfig[server].setup(merged_config) + if server == "rust_analyzer" then + local present_rust_tools, rust_tools = pcall(require, "rust-tools") + if present_rust_tools then + rust_tools.setup({ server = merged_config }) + end + end + end, + }) + end + end, +} + diff --git a/lua/plugins/lsp/servers/bashls.lua b/lua/plugins/lsp/servers/bashls.lua new file mode 100644 index 0000000..5caa506 --- /dev/null +++ b/lua/plugins/lsp/servers/bashls.lua @@ -0,0 +1,20 @@ +local util = require 'lspconfig.util' +return function(on_attach) + return { + on_attach = function(client, bufnr) + on_attach(client, bufnr) + end, + cmd = { 'bash-language-server', 'start' }, + cmd_env = { + GLOB_PATTERN = "*@(.sh|.inc|.bash|.command|.zsh)", + }, + settings = { + bashIde = { + globPattern = vim.env.GLOB_PATTERN or '*@(.sh|.inc|.bash|.command|.zsh)', + }, + }, + filetypes = { "sh", "zsh" }, + root_dir = util.find_git_ancestor, + single_file_support = true, + } +end diff --git a/lua/plugins/lsp/servers/cssls.lua b/lua/plugins/lsp/servers/cssls.lua new file mode 100644 index 0000000..c9b15f9 --- /dev/null +++ b/lua/plugins/lsp/servers/cssls.lua @@ -0,0 +1,32 @@ +local util = require 'lspconfig.util' +return function(on_attach) + return { + on_attach = function(client, bufnr) + on_attach(client, bufnr) + end, + settings = { + css = { + validate = true, + lint = { + unknownAtRules = "ignore" + } + }, + scss = { + validate = true, + lint = { + unknownAtRules = "ignore" + } + }, + less = { + validate = true, + lint = { + unknownAtRules = "ignore" + } + }, + }, + cmd = { "vscode-css-language-server", "--stdio" }, + filetypes = { "css", "scss" }, + root_dir = util.find_git_ancestor, + single_file_support = true, + } +end diff --git a/lua/plugins/lsp/servers/luals.lua b/lua/plugins/lsp/servers/luals.lua new file mode 100644 index 0000000..04bce5c --- /dev/null +++ b/lua/plugins/lsp/servers/luals.lua @@ -0,0 +1,33 @@ +return function(on_attach) + return { + on_attach = function(client, bufnr) + on_attach(client, bufnr) + client.server_capabilities.document_formatting = false + client.server_capabilities.document_range_formatting = false + end, + settings = { + Lua = { + hint = { + enable = true + }, + runtime = { + version = "LuaJIT", + }, + diagnostics = { + globals = { "vim" }, + }, + workspace = { + -- make the server aware of Neovim runtime files + -- library = { + -- [vim.fn.expand('$VIMRUNTIME/lua')] = true, + -- [vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true + -- }, + checkThirdParty = false + }, + -- do not send telemetry data containing a randomized but unique identifier + telemetry = { enable = false }, + }, + }, + } +end + diff --git a/lua/plugins/lsp/servers/phpls.lua b/lua/plugins/lsp/servers/phpls.lua new file mode 100644 index 0000000..aad6365 --- /dev/null +++ b/lua/plugins/lsp/servers/phpls.lua @@ -0,0 +1,40 @@ +---@brief +--- +--- https://intelephense.com/ +--- +--- `intelephense` can be installed via `npm`: +--- ```sh +--- npm install -g intelephense +--- ``` +--- +--- ```lua +--- -- See https://github.com/bmewburn/intelephense-docs/blob/master/installation.md#initialisation-options +--- init_options = { +--- storagePath = …, -- Optional absolute path to storage dir. Defaults to os.tmpdir(). +--- globalStoragePath = …, -- Optional absolute path to a global storage dir. Defaults to os.homedir(). +--- licenceKey = …, -- Optional licence key or absolute path to a text file containing the licence key. +--- clearCache = …, -- Optional flag to clear server state. State can also be cleared by deleting {storagePath}/intelephense +--- } +--- -- See https://github.com/bmewburn/intelephense-docs +--- settings = { +--- intelephense = { +--- files = { +--- maxSize = 1000000; +--- }; +--- }; +--- } +--- ``` + +return { + cmd = { 'intelephense', '--stdio' }, + filetypes = { 'php' }, + root_dir = function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + local cwd = assert(vim.uv.cwd()) + local root = vim.fs.root(fname, { 'composer.json', '.git' }) + + -- prefer cwd if root is a descendant + on_dir(root and vim.fs.relpath(cwd, root) and cwd) + end, +} + diff --git a/lua/plugins/lsp/servers/pylsp.lua b/lua/plugins/lsp/servers/pylsp.lua new file mode 100644 index 0000000..5078b31 --- /dev/null +++ b/lua/plugins/lsp/servers/pylsp.lua @@ -0,0 +1,40 @@ +---@brief +--- +--- https://github.com/python-lsp/python-lsp-server +--- +--- A Python 3.6+ implementation of the Language Server Protocol. +--- +--- See the [project's README](https://github.com/python-lsp/python-lsp-server) for installation instructions. +--- +--- Configuration options are documented [here](https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md). +--- In order to configure an option, it must be translated to a nested Lua table and included in the `settings` argument to the `config('pylsp', {})` function. +--- For example, in order to set the `pylsp.plugins.pycodestyle.ignore` option: +--- ```lua +--- vim.lsp.config('pylsp', { +--- settings = { +--- pylsp = { +--- plugins = { +--- pycodestyle = { +--- ignore = {'W391'}, +--- maxLineLength = 100 +--- } +--- } +--- } +--- } +--- }) +--- ``` +--- +--- Note: This is a community fork of `pyls`. +return { + cmd = { 'pylsp' }, + filetypes = { 'python' }, + root_markers = { + 'pyproject.toml', + 'setup.py', + 'setup.cfg', + 'requirements.txt', + 'Pipfile', + '.git', + }, +} + diff --git a/lua/plugins/lsp/servers/yamlls.lua b/lua/plugins/lsp/servers/yamlls.lua new file mode 100644 index 0000000..8fc5c13 --- /dev/null +++ b/lua/plugins/lsp/servers/yamlls.lua @@ -0,0 +1,3 @@ +return function(capabilities) + capabilities.textDocument.completion.completionItem.snippetSupport = true +end diff --git a/lua/plugins/lualine.lua b/lua/plugins/lualine.lua new file mode 100644 index 0000000..a04df6c --- /dev/null +++ b/lua/plugins/lualine.lua @@ -0,0 +1,51 @@ +-- Lualine Plugin +return { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + config = function () + require("lualine").setup({ + options = { + icons_enabled = true, + theme = 'auto', + component_separators = { left = '', right = ''}, + section_separators = { left = '', right = ''}, + disabled_filetypes = { + statusline = {}, + winbar = {}, + }, + ignore_focus = {}, + always_divide_middle = true, + always_show_tabline = true, + globalstatus = false, + refresh = { + statusline = 100, + tabline = 100, + winbar = 100, + }, + }, + + sections = { + lualine_a = {'mode'}, + lualine_b = {'branch', 'diff', 'diagnostics'}, + lualine_c = {'filename'}, + lualine_x = {'encoding', 'fileformat', 'filetype'}, + lualine_y = {'progress'}, + lualine_z = {'location'} + }, + + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = {'filename'}, + lualine_x = {'location'}, + lualine_y = {}, + lualine_z = {} + }, + + tabline = {}, + winbar = {}, + inactive_winbar = {}, + extensions = {} + }) + end, +} diff --git a/lua/plugins/luasnip.lua b/lua/plugins/luasnip.lua new file mode 100644 index 0000000..e59162f --- /dev/null +++ b/lua/plugins/luasnip.lua @@ -0,0 +1,35 @@ +return { + "L3MON4D3/LuaSnip", + dependencies = { "rafamadriz/friendly-snippets" }, + postinstall = "make install_jsregexp", + config = function() + local luasnip = require("luasnip") + luasnip.config.setup({ + history = true, + updateevents = "TextChanged,TextChangedI", + enable_autosnippets = true, + }) + -- add vscode exported completions + require("luasnip.loaders.from_vscode").lazy_load() + local r = require("utils.remaps") + + r.map({ "i", "s" }, "", function() + if luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + end + end, "Expand current snippet or jump to next", { silent = true }) + + r.map({ "i", "s" }, "", function() + if luasnip.jumpable(-1) then + luasnip.jump(-1) + end + end, "Go to previous snippet", { silent = true }) + + r.map("i", "", function() + if luasnip.choice_active() then + luasnip.change_choice(1) + end + end, "Show list of options") + + end, +} diff --git a/lua/plugins/mason.lua b/lua/plugins/mason.lua new file mode 100644 index 0000000..27974d8 --- /dev/null +++ b/lua/plugins/mason.lua @@ -0,0 +1,53 @@ +return { + "williamboman/mason.nvim", + build = ":MasonInstallAll", + config = function() + local f = require("utils.functions") + require("mason").setup({ + ui = { + border = "shadow", + icons = require("utils.icons").mason, + zindex = 99, + }, + }) + f.cmd("MasonInstallAll", function() + vim.cmd('MasonUpdate') + local ensure_installed = { + "bash-language-server", + "black", + "clang-format", + "clangd", + "css-lsp", + "dockerfile-language-server", + "eslint-lsp", + "html-lsp", + "intelephense", + "isort", + "jq", + "json-lsp", + "jsonlint", + "lua-language-server", + "php-cs-fixer", + "prettier", + "prettierd", + "python-lsp-server", + "rust-analyzer", + "shellcheck", + "shellharden", + "shfmt", + "standardjs", + "stylelint", + "stylelint-lsp", + "stylua", + "tailwindcss-language-server", + "terraform-ls", + "tflint", + "typescript-language-server", + "yaml-language-server", + "yamlfmt", + "yamllint", + } + vim.cmd('MasonInstall ' .. table.concat(ensure_installed, ' ')) + end, { desc = "install all lsp tools" }) + end, +} diff --git a/lua/plugins/nvim-treesitter.lua b/lua/plugins/nvim-treesitter.lua new file mode 100644 index 0000000..fa8ad54 --- /dev/null +++ b/lua/plugins/nvim-treesitter.lua @@ -0,0 +1,70 @@ + +-- Treesitter Plugin +return { + "nvim-treesitter/nvim-treesitter", + dependencies = { "nvim-treesitter/nvim-treesitter-textobjects" }, + config = function() + require("nvim-treesitter.configs").setup({ + ensure_installed = { "c", "lua", "vim", "vimdoc", "query" }, + + auto_install = true, + + highlight = { + enable = true, + }, + + incremental_selection = { + enable = true, + keymaps = { + init_selection = "ss", + node_incremental = "si", + scope_incremental = "sc", + node_decremental = "sd", + }, + }, + + textobjects = { + select = { + enable = true, + + -- Automatically jump forward to textobj, similar to targets.vim + lookahead = true, + + keymaps = { + -- You can use the capture groups defined in textobjects.scm + ["af"] = "@function.outer", + ["if"] = "@function.inner", + ["ac"] = "@class.outer", + -- You can optionally set descriptions to the mappings (used in the desc parameter of + -- nvim_buf_set_keymap) which plugins like which-key display + ["ic"] = { query = "@class.inner", desc = "Select inner part of a class region" }, + -- You can also use captures from other query groups like `locals.scm` + ["as"] = { query = "@local.scope", query_group = "locals", desc = "Select language scope" }, + }, + -- You can choose the select mode (default is charwise 'v') + -- + -- Can also be a function which gets passed a table with the keys + -- * query_string: eg '@function.inner' + -- * method: eg 'v' or 'o' + -- and should return the mode ('v', 'V', or '') or a table + -- mapping query_strings to modes. + selection_modes = { + ['@parameter.outer'] = 'v', -- charwise + ['@function.outer'] = 'V', -- linewise + ['@class.outer'] = '', -- blockwise + }, + -- If you set this to `true` (default is `false`) then any textobject is + -- extended to include preceding or succeeding whitespace. Succeeding + -- whitespace has priority in order to act similarly to eg the built-in + -- `ap`. + -- + -- Can also be a function which gets passed a table with the keys + -- * query_string: eg '@function.inner' + -- * selection_mode: eg 'v' + -- and should return true or false + include_surrounding_whitespace = true, + }, + }, + }) + end, +} diff --git a/lua/utils/duplicates.lua b/lua/utils/duplicates.lua new file mode 100644 index 0000000..29888be --- /dev/null +++ b/lua/utils/duplicates.lua @@ -0,0 +1,73 @@ +local functions = require("utils.functions") + +local X = {} + +local duplicates_n = {} +local duplicates_v = {} +local duplicates_i = {} +local duplicates_s = {} +local duplicates_x = {} + +local function check_and_set_duplicates(input, description, check, table) + if check then + local found = table[input] + + if found ~= nil then + if found ~= description then + print(input .. " already mapped (" .. found .. " so we cannot re-map (" .. description .. ")") + end + end + + table[input] = description + end +end + +X.check_duplicates = function(type, input, description) + local check_n = false + local check_v = false + local check_i = false + local check_s = false + local check_x = false + + if functions.is_table(type) then + if type["n"] then + check_n = true + end + if type["v"] then + check_v = true + end + if type["i"] then + check_i = true + end + if type["s"] then + check_s = true + end + if type["x"] then + check_x = true + end + else + if type == "n" then + check_n = true + end + if type == "v" then + check_v = true + end + if type == "i" then + check_i = true + end + if type == "s" then + check_s = true + end + if type == "x" then + check_x = true + end + end + + check_and_set_duplicates(input, description, check_n, duplicates_n) + check_and_set_duplicates(input, description, check_v, duplicates_v) + check_and_set_duplicates(input, description, check_i, duplicates_i) + check_and_set_duplicates(input, description, check_s, duplicates_s) + check_and_set_duplicates(input, description, check_x, duplicates_x) +end + +return X diff --git a/lua/utils/functions.lua b/lua/utils/functions.lua new file mode 100644 index 0000000..3114b4c --- /dev/null +++ b/lua/utils/functions.lua @@ -0,0 +1,126 @@ +local vim = vim + +local X = {} + +---@param on_attach fun(client, buffer) +function X.on_attach(on_attach) + vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local buffer = args.buf + local client = vim.lsp.get_client_by_id(args.data.client_id) + on_attach(client, buffer) + end, + }) +end + +function X.starts_with(str, start) + return str:sub(1, #start) == start +end + +function X.is_table(to_check) + return type(to_check) == "table" +end + +function X.has_key(t, key) + for t_key, _ in pairs(t) do + if t_key == key then + return true + end + end + return false +end + +function X.has_value(t, val) + for _, value in ipairs(t) do + if value == val then + return true + end + end + return false +end + +function X.tprint(table) + print(vim.inspect(table)) +end + +function X.tprint_keys(table) + for k in pairs(table) do + print(k) + end +end + +X.reload = function() + local presentReload, reload = pcall(require, "plenary.reload") + if presentReload then + local counter = 0 + + for moduleName in pairs(package.loaded) do + if X.starts_with(moduleName, "lt.") then + reload.reload_module(moduleName) + counter = counter + 1 + end + end + -- clear nvim-mapper keys + vim.g.mapper_records = nil + vim.notify("Reloaded " .. counter .. " modules!") + end +end + +function X.is_macunix() + return vim.fn.has("macunix") +end + +function X.link_highlight(from, to, override) + local hl_exists, _ = pcall(vim.api.nvim_get_hl_by_name, from, false) + if override or not hl_exists then + -- vim.cmd(("highlight link %s %s"):format(from, to)) + vim.api.nvim_set_hl(0, from, { link = to }) + end +end + +X.highlight = function(group, opts) + vim.api.nvim_set_hl(0, group, opts) +end + +X.highlight_bg = function(group, col) + vim.api.nvim_set_hl(0, group, { bg = col }) +end + +-- Define fg color +-- @param group Group +-- @param color Color +X.highlight_fg = function(group, col) + vim.api.nvim_set_hl(0, group, { fg = col }) +end + +-- Define bg and fg color +-- @param group Group +-- @param fgcol Fg Color +-- @param bgcol Bg Color +X.highlight_fg_bg = function(group, fgcol, bgcol) + vim.api.nvim_set_hl(0, group, { bg = bgcol, fg = fgcol }) +end + +X.from_highlight = function(hl) + local result = {} + local list = vim.api.nvim_get_hl_by_name(hl, true) + for k, v in pairs(list) do + local name = k == "background" and "bg" or "fg" + result[name] = string.format("#%06x", v) + end + return result +end + +X.get_color_from_terminal = function(num, default) + local key = "terminal_color_" .. num + return vim.g[key] and vim.g[key] or default +end + +X.cmd = function(name, command, desc) + vim.api.nvim_create_user_command(name, command, desc) +end + +X.autocmd = function(evt, opts) + vim.api.nvim_create_autocmd(evt, opts) +end +return X diff --git a/lua/utils/icons.lua b/lua/utils/icons.lua new file mode 100644 index 0000000..615773f --- /dev/null +++ b/lua/utils/icons.lua @@ -0,0 +1,109 @@ +return { + diagnostics = { + error = " ", + hint = " ", + information = " ", + other = " ", + warning = " ", + }, + git = { + Added = " ", + Modified = " ", + Removed = " ", + }, + dap = { + breakpoint = " ", + breakpoint_condition = " ", + log_point = " ", + stopped = " ", + breakpoint_rejected = " ", + pause = " ", + play = " ", + step_into = " ", + step_over = " ", + step_out = " ", + step_back = " ", + run_last = " ", + terminate = " ", + }, + lazy = { + cmd = " ", + config = "", + event = "", + ft = " ", + init = " ", + import = " ", + keys = " ", + lazy = "󰒲 ", + loaded = "󱄲", + not_loaded = "󱄯", + plugin = " ", + runtime = " ", + source = " ", + start = "", + task = "✔ ", + list = { + "󱄰", + "➜", + "★", + "‒", + }, + }, + mason = { + package_installed = "󱄲", + package_pending = "󱄰", + package_uninstalled = "󱄯", + }, + trouble = { + indent = { + top = "┊ ", + middle = "├╴", + last = "└╴", + fold_open = " ", + fold_closed = " ", + ws = " ", + }, + folder_closed = " ", + folder_open = " ", + kinds = { + Array = " ", + Boolean = "󰨙 ", + Class = " ", + Constant = "󰏿 ", + Constructor = " ", + Enum = " ", + EnumMember = " ", + Event = " ", + Field = " ", + File = " ", + Function = "󰊕 ", + Interface = " ", + Key = " ", + Method = "󰊕 ", + Module = " ", + Namespace = "󰦮 ", + Null = " ", + Number = "󰎠 ", + Object = " ", + Operator = " ", + Package = " ", + Property = " ", + String = " ", + Struct = "󰆼 ", + TypeParameter = " ", + Variable = "󰀫 ", + } + }, + borders = { + dashed = { "┄", "┊", "┄", "┊", "╭", "╮", "╯", "╰", }, + double = { "═", "║", "═", "║", "╔", "╗", "╝", "╚", }, + single = { "─", "│", "─", "│", "╭", "╮", "╯", "╰", }, + blocks = { "▀", "▐", "▄", "▌", "▛", "▜", "▟", "▙", }, + blocky = { "▀", "▐", "▄", "▌", "▄", "▄", "▓", "▀", }, + }, + telescope = { + prompt = { "─", "│", "─", "│", "╭", "╮", "╯", "╰", }, + results = { "─", " ", "─", "│", "╭", "─", "─", "╰", }, + preview = { "─", "│", "─", "│", "─", "╮", "╯", "╰", }, + }, +} diff --git a/lua/utils/remaps.lua b/lua/utils/remaps.lua new file mode 100644 index 0000000..d95377e --- /dev/null +++ b/lua/utils/remaps.lua @@ -0,0 +1,44 @@ +local keymap = vim.keymap +local check_duplicates = require("utils.duplicates").check_duplicates +local X = {} +local wk_lazy = {} + +local function lazy_register_wk(input) + table.insert(wk_lazy, input) +end + +local function add_wk(input) + local wk_ready, wk = pcall(require, "which-key") + if wk_ready and wk.did_setup then + if wk_lazy ~= {} then + lazy_register_wk(input) + wk.add(wk_lazy) + wk_lazy = {} + end + else + lazy_register_wk(input) + end +end + +function X.map(type, input, output, description, additional_options) + local options = { remap = true, desc = description } + if additional_options then + options = vim.tbl_deep_extend("force", options, additional_options) + end + keymap.set(type, input, output, options) + check_duplicates(type, input, description) +end + +function X.noremap(type, input, output, description, additional_options) + local options = { remap = false } + if additional_options then + options = vim.tbl_deep_extend("force", options, additional_options) + end + X.map(type, input, output, description, options) +end + +function X.map_virtual(input) + add_wk(input) +end + +return X