commit c87c7e53b02e2b141cd3dafae2335bbe412dec91 Author: shnee Date: Fri May 17 16:50:10 2024 -0400 Just for Jer-Bear diff --git a/after/plugin/airline.lua b/after/plugin/airline.lua new file mode 100644 index 0000000..698a49f --- /dev/null +++ b/after/plugin/airline.lua @@ -0,0 +1,11 @@ +-- Add a buffer bar at the top. +vim.api.nvim_set_var('airline#extensions#tabline#enabled', true) + +-- Change the formatter for the tab/buffer bar. +-- Here's a full list of the different formatters: +-- - default +-- - jsformatter +-- - unique_tail +-- - unique_tail_improved +vim.api.nvim_set_var('airline#extensions#tabline#formatter', + 'unique_tail_improved') diff --git a/after/plugin/chatgpt.lua b/after/plugin/chatgpt.lua new file mode 100644 index 0000000..b59e375 --- /dev/null +++ b/after/plugin/chatgpt.lua @@ -0,0 +1,15 @@ +-- local chatgpt = require("chatgpt") +-- wk.register({ +-- p = { +-- name = "ChatGPT", +-- e = { +-- function() +-- chatgpt.edit_with_instructions() +-- end, +-- "Edit with instructions", +-- }, +-- }, +-- }, { +-- prefix = "", +-- mode = "v", +-- }) diff --git a/after/plugin/cmp.lua b/after/plugin/cmp.lua new file mode 100644 index 0000000..44722ae --- /dev/null +++ b/after/plugin/cmp.lua @@ -0,0 +1,156 @@ +local cmp_status_ok, cmp = pcall(require, "cmp") +if not cmp_status_ok then + return +end + +local snip_status_ok, luasnip = pcall(require, "luasnip") +if not snip_status_ok then + return +end + +-- Not sure if this just works or needs vscode to be installed. This came from +-- the same place as the snippet below. +require("luasnip/loaders/from_vscode").lazy_load() + +-- This function, along with most of the code in this file, was copied from +-- LunarVim/Neovim-from-scratch branch: 05-completion, commit: a0e07fc +-- I'm not 100% sure what it does, it has something to do with "supertab" for +-- snippets, autocomplete, and normal mode. +local check_backspace = function() + local col = vim.fn.col "." - 1 + return col == 0 or vim.fn.getline("."):sub(col, col):match "%s" +end + +--   פּ ﯟ   some other good icons +local kind_icons = { + Text = "", + Method = "m", + Function = "", + Constructor = "", + Field = "", + Variable = "", + Class = "", + Interface = "", + Module = "", + Property = "", + Unit = "", + Value = "", + Enum = "", + Keyword = "", + Snippet = "", + Color = "", + File = "", + Reference = "", + Folder = "", + EnumMember = "", + Constant = "", + Struct = "", + Event = "", + Operator = "", + TypeParameter = "", + Copilot = "", +} +-- find more here: https://www.nerdfonts.com/cheat-sheet + +cmp.setup { + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) -- For `luasnip` users. + end, + }, + mapping = { + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + [""] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), + -- Specify `cmp.config.disable` if you want to remove the default `` + -- mapping. + [""] = cmp.config.disable, + [""] = cmp.mapping { + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }, + [''] = cmp.mapping( + cmp.mapping.complete({ + config = { + sources = cmp.config.sources({ + { name = 'cmp_ai' }, + }), + }, + }), + { 'i' } + ), + -- Accept currently selected item. If none selected, `select` first item. + -- Set `select` to `false` to only confirm explicitly selected items. + [""] = cmp.mapping.confirm { select = true }, + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expandable() then + luasnip.expand() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif check_backspace() then + fallback() + else + fallback() + end + end, { + "i", + "s", + }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { + "i", + "s", + }), + }, + formatting = { + fields = { "kind", "abbr", "menu" }, + format = function(entry, vim_item) + -- Kind icons + -- TODO Need to make icons toggleable, + vim_item.kind = string.format("%s", kind_icons[vim_item.kind]) + -- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind + vim_item.menu = ({ + copilot = "[Copilot]", + cmp_ai = "[AI]", + nvim_lsp = "[LSP]", + nvim_lua = "[NVIM_LUA]", + luasnip = "[Snippet]", + buffer = "[Buffer]", + path = "[Path]", + })[entry.source.name] + return vim_item + end, + }, + sources = { + { name = "copilot" }, + -- Uncomment to run on every keystroke. + -- { name = "cmp_ai" }, + { name = "nvim_lsp" }, + { name = "nvim_lua" }, + { name = "buffer" }, + { name = "path" }, + { name = "luasnip" }, + }, + confirm_opts = { + behavior = cmp.ConfirmBehavior.Replace, + select = false, + }, + window = { + documentation = cmp.config.window.bordered() + }, + experimental = { + ghost_text = true, + native_menu = false, + }, +} diff --git a/after/plugin/colors.lua b/after/plugin/colors.lua new file mode 100644 index 0000000..94f3b14 --- /dev/null +++ b/after/plugin/colors.lua @@ -0,0 +1,58 @@ +function ColorMyPencils(color) + + color = color or "base16-gruvbox-dark-hard" + -- color = color or "default" + vim.cmd.colorscheme(color) + + vim.api.nvim_set_hl(0, "Normal", { ctermbg="none" }) + vim.api.nvim_set_hl(0, "NormalFloat", { link="Normal" }) + vim.api.nvim_set_hl(0, "NonText", { link="Normal" }) + vim.api.nvim_set_hl(0, "LineNr", { link="Normal" }) + vim.api.nvim_set_hl(0, "SignColumn", { link="Normal" }) + vim.api.nvim_set_hl(0, "Visual", { ctermfg=0, ctermbg=3 }) + vim.api.nvim_set_hl(0, "Search", { ctermfg=4, ctermbg=3 }) + vim.api.nvim_set_hl(0, "Folded", { ctermfg=2, ctermbg=0 }) + + -- diff colors + -- The one issue with this is you won't be as easy to tell where the diff + -- sections are if there is no transparency in the terminal. + vim.api.nvim_set_hl(0, "DiffAdd", { ctermfg=2, ctermbg=0 }) + vim.api.nvim_set_hl(0, "DiffDelete", { ctermfg=1, ctermbg=0 }) + vim.api.nvim_set_hl(0, "DiffChange", { ctermfg=8, ctermbg=0 }) + vim.api.nvim_set_hl(0, "DiffText", { ctermfg=3, ctermbg=0 }) + + -- Popup menu + vim.api.nvim_set_hl(0, "Pmenu", { ctermfg=7, ctermbg=0 }) + vim.api.nvim_set_hl(0, "PmenuSel", { ctermfg=0, ctermbg=8 }) + + -- Current line highlight and line wrap column. + vim.opt.colorcolumn = '-0' + vim.opt.cursorline = true + vim.api.nvim_set_hl(0, "ColorColumn", { ctermbg=0 }) + vim.api.nvim_set_hl(0, "CursorLine", + { ctermbg=0, underline=false }) + vim.api.nvim_set_hl(0, "CursorLineNr", + { ctermbg="none", underline=false }) + vim.api.nvim_set_hl(0, "CursorLineSign", + { ctermbg="none", underline=false }) + + -- Other stuff + vim.api.nvim_set_hl(0, "WinSeparator", + { ctermfg = 3, ctermbg = "none" }) + vim.api.nvim_set_hl(0, "SpellBad", + { cterm = { undercurl = true }, ctermfg = 1, ctermbg = 0 }) + + -- GitSigns colors + -- + -- TODO this should be moved to gitsigns.lua + -- It would have been nice to link these to 'DiffAdd', 'DiffChange', and + -- 'DiffDelete', but currently this has a transparent background, while the + -- others don't. This may change though so keep the possibility of linking + -- in mind. + vim.api.nvim_set_hl(0, "GitSignsAdd", { ctermfg=2, ctermbg="none" }) + vim.api.nvim_set_hl(0, "GitSignsChange", { ctermfg=3, ctermbg="none" }) + vim.api.nvim_set_hl(0, "GitSignsDelete", { ctermfg=1, ctermbg="none" }) + +end + +ColorMyPencils() diff --git a/after/plugin/easyalign.lua b/after/plugin/easyalign.lua new file mode 100644 index 0000000..95b45df --- /dev/null +++ b/after/plugin/easyalign.lua @@ -0,0 +1,2 @@ +vim.api.nvim_set_keymap('n', 'ga', "(EasyAlign)", { noremap = true, silent = true }); +vim.api.nvim_set_keymap('x', 'ga', "(EasyAlign)", { noremap = true, silent = true }); diff --git a/after/plugin/gitsigns.lua b/after/plugin/gitsigns.lua new file mode 100644 index 0000000..2c3606b --- /dev/null +++ b/after/plugin/gitsigns.lua @@ -0,0 +1,43 @@ +require('gitsigns').setup{ + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map('n', ']c', function() + if vim.wo.diff then return ']c' end + vim.schedule(function() gs.next_hunk() end) + return '' + end, {expr=true}) + + map('n', '[c', function() + if vim.wo.diff then return '[c' end + vim.schedule(function() gs.prev_hunk() end) + return '' + end, {expr=true}) + + -- Actions + map('n', 'hs', gs.stage_hunk) + map('n', 'hr', gs.reset_hunk) + map('v', 'hs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end) + map('v', 'hr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) + map('n', 'hS', gs.stage_buffer) + map('n', 'hu', gs.undo_stage_hunk) + map('n', 'hR', gs.reset_buffer) + map('n', 'hp', gs.preview_hunk) + map('n', 'hb', function() gs.blame_line{full=true} end) + map('n', 'tb', gs.toggle_current_line_blame) + map('n', 'hd', gs.diffthis) + map('n', 'hD', function() gs.diffthis('~') end) + -- Commented out because we use this binding for trouble. + -- map('n', 'td', gs.toggle_deleted) + + -- Text object + map({'o', 'x'}, 'ih', ':Gitsigns select_hunk') + end +} diff --git a/after/plugin/telescope.lua b/after/plugin/telescope.lua new file mode 100644 index 0000000..fed52a1 --- /dev/null +++ b/after/plugin/telescope.lua @@ -0,0 +1,6 @@ +local builtin = require('telescope.builtin') +vim.keymap.set('n', '', builtin.git_files, {}) +vim.keymap.set('n', 'ff', builtin.find_files, {}) +vim.keymap.set('n', 'fg', builtin.live_grep, {}) +vim.keymap.set('n', 'fb', builtin.buffers, {}) +vim.keymap.set('n', 'fs', builtin.lsp_document_symbols, {}) diff --git a/after/plugin/todos.lua b/after/plugin/todos.lua new file mode 100644 index 0000000..28b1646 --- /dev/null +++ b/after/plugin/todos.lua @@ -0,0 +1,80 @@ +-- TODO Here are some ways to run this plugin just on the current file. +-- :exe ":TodoQuickFix cwd=" .. fnameescape(expand("%:p")) +-- :exe ":TodoTrouble cwd=" .. fnameescape(expand("%:p")) + +-- TODO Add a way to add TODO REM. +-- TODO Remove unused keywords. + +-- TODO REM Most of this was copied from the default config. Instead we should +-- only override the settings we want to change. Maybe put the whole +-- default config in a comment. + +-- All settings in this config are the default values from commit 3094ead, +-- unless noted by CHANGE_FROM_DEFAULT. +require("todo-comments").setup { + signs = true, -- show icons in the signs column + sign_priority = 8, -- sign priority + -- keywords recognized as todo comments + keywords = { + FIX = { + icon = " ", -- icon used for the sign, and in search results + color = "error", -- can be a hex color, or a named color (see below) + alt = { "FIXME", "BUG", "FIXIT", "ISSUE" }, -- a set of other keywords that all map to this FIX keywords + -- signs = false, -- configure signs for some keywords individually + }, + TODO = { icon = " ", color = "info" }, + HACK = { icon = " ", color = "warning" }, + WARN = { icon = " ", color = "warning", alt = { "WARNING", "XXX" } }, + PERF = { icon = " ", alt = { "OPTIM", "PERFORMANCE", "OPTIMIZE" } }, + NOTE = { icon = " ", color = "hint", alt = { "INFO" } }, + TEST = { icon = "⏲ ", color = "test", alt = { "TESTING", "PASSED", "FAILED" } }, + }, + gui_style = { + fg = "NONE", -- The gui style to use for the fg highlight group. + bg = "BOLD", -- The gui style to use for the bg highlight group. + }, + merge_keywords = true, -- when true, custom keywords will be merged with the defaults + -- highlighting of the line containing the todo comment + -- * before: highlights before the keyword (typically comment characters) + -- * keyword: highlights of the keyword + -- * after: highlights after the keyword (todo text) + highlight = { + multiline = true, -- enable multine todo comments + multiline_pattern = "^.", -- lua pattern to match the next multiline from the start of the matched keyword + multiline_context = 10, -- extra lines that will be re-evaluated when changing a line + before = "", -- "fg" or "bg" or empty + keyword = "wide", -- "fg", "bg", "wide", "wide_bg", "wide_fg" or empty. (wide and wide_bg is the same as bg, but will also highlight surrounding characters, wide_fg acts accordingly but with fg) + after = "fg", -- "fg" or "bg" or empty + -- CHANGE_FROM_DEFAULT: Changed to make the ':' optional. + -- pattern = [[.*<(KEYWORDS)\s*:]], -- pattern or table of patterns, used for highlighting (vim regex) + pattern = [[.*<(KEYWORDS)(:| )]], -- pattern or table of patterns, used for highlighting (vim regex) + comments_only = true, -- uses treesitter to match keywords in comments only + max_line_len = 400, -- ignore lines longer than this + exclude = {}, -- list of file types to exclude highlighting + }, + -- list of named colors where we try to extract the guifg from the + -- list of highlight groups or use the hex color if hl not found as a fallback + colors = { + error = { "DiagnosticError", "ErrorMsg", "#DC2626" }, + warning = { "DiagnosticWarn", "WarningMsg", "#FBBF24" }, + info = { "DiagnosticInfo", "#2563EB" }, + hint = { "DiagnosticHint", "#10B981" }, + default = { "Identifier", "#7C3AED" }, + test = { "Identifier", "#FF00FF" } + }, + search = { + command = "rg", + args = { + "--color=never", + "--no-heading", + "--with-filename", + "--line-number", + "--column", + }, + -- regex that will be used to match keywords. + -- don't replace the (KEYWORDS) placeholder + -- CHANGE_FROM_DEFAULT: Changed to make the ':' optional. + -- pattern = [[\b(KEYWORDS):]], -- ripgrep regex + pattern = [[\b(KEYWORDS)( |:)]], + }, +} diff --git a/after/plugin/treesitter.lua b/after/plugin/treesitter.lua new file mode 100644 index 0000000..2cd5dbe --- /dev/null +++ b/after/plugin/treesitter.lua @@ -0,0 +1,41 @@ +require'nvim-treesitter.configs'.setup { + -- A list of parser names, or "all" (the five listed parsers should always be installed) + -- ensure_installed = { "bash", "lua", "vim", "vimdoc" }, + + -- Install parsers synchronously (only applied to `ensure_installed`) + -- sync_install = false, + + -- Automatically install missing parsers when entering buffer + -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally + -- auto_install = true, + + -- List of parsers to ignore installing (for "all") + -- ignore_install = { "javascript" }, + + ---- If you need to change the installation directory of the parsers (see -> Advanced Setup) + -- parser_install_dir = "/some/path/to/store/parsers", -- Remember to run vim.opt.runtimepath:append("/some/path/to/store/parsers")! + + highlight = { + enable = true, + + -- NOTE: these are the names of the parsers and not the filetype. (for example if you want to + -- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is + -- the name of the parser) + -- list of language that will be disabled + -- disable = { "c", "rust" }, + -- Or use a function for more flexibility, e.g. to disable slow treesitter highlight for large files + -- disable = function(lang, buf) + -- local max_filesize = 100 * 1024 -- 100 KB + -- local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) + -- if ok and stats and stats.size > max_filesize then + -- return true + -- end + -- end, + + -- Setting this to true will run `:h syntax` and tree-sitter at the same time. + -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). + -- Using this option may slow down your editor, and you may see some duplicate highlights. + -- Instead of true it can also be a list of languages + additional_vim_regex_highlighting = false, + }, +} diff --git a/after/plugin/trouble.lua b/after/plugin/trouble.lua new file mode 100644 index 0000000..452d64a --- /dev/null +++ b/after/plugin/trouble.lua @@ -0,0 +1,7 @@ +local opts = { noremap = true, silent = true } +local keymap = function(mode, key, command) + vim.api.nvim_set_keymap(mode, key, command, opts) +end + +keymap("n", "td", ":Trouble document_diagnostics") +keymap("n", "tt", ":TroubleToggle") diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..2049b30 --- /dev/null +++ b/init.lua @@ -0,0 +1 @@ +require("shnee") diff --git a/lua/shnee/init.lua b/lua/shnee/init.lua new file mode 100644 index 0000000..f980223 --- /dev/null +++ b/lua/shnee/init.lua @@ -0,0 +1,5 @@ +require("shnee.lsp") +require("shnee.packer") +require("shnee.remap") +require("shnee.set") +require("shnee.splits") diff --git a/lua/shnee/lsp/handlers.lua b/lua/shnee/lsp/handlers.lua new file mode 100644 index 0000000..64e94a7 --- /dev/null +++ b/lua/shnee/lsp/handlers.lua @@ -0,0 +1,109 @@ +local M = {} + +-- TODO Need to make icons toggleable, +-- TODO: backfill this to template +M.setup = function() + local signs = { + { name = "DiagnosticSignError", text = "" }, + { name = "DiagnosticSignWarn", text = "" }, + { name = "DiagnosticSignHint", text = "" }, + { name = "DiagnosticSignInfo", text = "" }, + } + + for _, sign in ipairs(signs) do + vim.fn.sign_define(sign.name, { texthl = sign.name, + text = sign.text, + numhl = "" }) + end + + local config = { + -- "ghost" text in the line where the error is. + virtual_text = true, + -- show signs + signs = { + active = signs, + }, + update_in_insert = true, + underline = true, + severity_sort = true, + float = { + focusable = false, + style = "minimal", + border = "rounded", + source = "always", + -- TODO REM LunarVim/Neovim-from-scratch had these set to empty, I want to + -- what happens when they are not cleared. + -- header = "", + -- prefix = "", + }, + } + + vim.diagnostic.config(config) + + vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, + { + border = "rounded", + }) + + vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with( + vim.lsp.handlers.signature_help, { + border = "rounded", + }) +end + +-- TODO REM I think this is for highlighting a symbol everywhere in a file while +-- your cursor is over it. +local function lsp_highlight_document(client) + -- Set autocommands conditional on server_capabilities + if client.server_capabilities.documentHighlight then + vim.api.nvim_exec( + [[ + augroup lsp_document_highlight + autocmd! * + autocmd CursorHold lua vim.lsp.buf.document_highlight() + autocmd CursorMoved lua vim.lsp.buf.clear_references() + augroup END + ]], + false + ) + end +end + +local function lsp_keymaps(bufnr) + local opts = { noremap = true, silent = true } + vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "lua vim.lsp.buf.definition()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "lua vim.lsp.buf.hover()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "lua vim.lsp.buf.implementation()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "", "lua vim.lsp.buf.signature_help()", opts) + -- vim.api.nvim_buf_set_keymap(bufnr, "n", "rn", "lua vim.lsp.buf.rename()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "lua vim.lsp.buf.references()", opts) + -- vim.api.nvim_buf_set_keymap(bufnr, "n", "ca", "lua vim.lsp.buf.code_action()", opts) + -- vim.api.nvim_buf_set_keymap(bufnr, "n", "f", "lua vim.diagnostic.open_float()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", 'lua vim.diagnostic.goto_prev({ border = "rounded" })', opts) + vim.api.nvim_buf_set_keymap( + bufnr, + "n", + "gl", + 'lua vim.diagnostic.open_float()', + opts + ) + vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", 'lua vim.diagnostic.goto_next({ border = "rounded" })', opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "q", "lua vim.diagnostic.setloclist()", opts) + vim.cmd [[ command! Format execute 'lua vim.lsp.buf.formatting()' ]] +end + +M.on_attach = function(client, bufnr) + if client.name == "tsserver" then + client.server_capabilities.documentFormattingProvider = false + end + lsp_keymaps(bufnr) + lsp_highlight_document(client) +end + +local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") +if status_ok then + M.capabilities = cmp_nvim_lsp.default_capabilities() +end + +return M diff --git a/lua/shnee/lsp/init.lua b/lua/shnee/lsp/init.lua new file mode 100644 index 0000000..db46eae --- /dev/null +++ b/lua/shnee/lsp/init.lua @@ -0,0 +1,8 @@ +local status_ok, _ = pcall(require, "lspconfig") +if not status_ok then + return +end + +require "shnee.lsp.mason" +require("shnee.lsp.handlers").setup() +require "shnee.lsp.null-ls" diff --git a/lua/shnee/lsp/mason.lua b/lua/shnee/lsp/mason.lua new file mode 100644 index 0000000..6c1a93e --- /dev/null +++ b/lua/shnee/lsp/mason.lua @@ -0,0 +1,51 @@ + +local servers = { + "bashls", + "lua_ls", + "pyright", + -- TODO Never got this to work + "marksman", + "jsonls", +} + +local settings = { + ui = { + border = "none", + icons = { + package_installed = "◍", + package_pending = "◍", + package_uninstalled = "◍", + }, + }, + log_level = vim.log.levels.INFO, + max_concurrent_installers = 4, +} + +require("mason").setup(settings) +require("mason-lspconfig").setup({ + ensure_installed = servers, + automatic_installation = true, +}) + +local lspconfig_status_ok, lspconfig = pcall(require, "lspconfig") +if not lspconfig_status_ok then + return +end + +local opts = {} + +for _, server in pairs(servers) do + opts = { + on_attach = require("shnee.lsp.handlers").on_attach, + capabilities = require("shnee.lsp.handlers").capabilities, + } + + server = vim.split(server, "@")[1] + + local require_ok, conf_opts = pcall(require, "shnee.lsp.settings." .. server) + if require_ok then + opts = vim.tbl_deep_extend("force", conf_opts, opts) + end + + lspconfig[server].setup(opts) +end diff --git a/lua/shnee/lsp/null-ls.lua b/lua/shnee/lsp/null-ls.lua new file mode 100644 index 0000000..270c79f --- /dev/null +++ b/lua/shnee/lsp/null-ls.lua @@ -0,0 +1,24 @@ +local null_ls_status_ok, null_ls = pcall(require, "null-ls") +if not null_ls_status_ok then + print("null-ls not found") + return +end + +-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/formatting +local formatting = null_ls.builtins.formatting +-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics +local diagnostics = null_ls.builtins.diagnostics + +null_ls.setup({ + debug = false, + sources = { + formatting.prettier.with({ + extra_args = { "--prose-wrap", "always", + "--print-width", "80", + }}), + formatting.black.with({ extra_args = { "--fast" } }), + formatting.stylua, + diagnostics.proselint.with({ filetypes = {} }), + diagnostics.hadolint, + }, +}) diff --git a/lua/shnee/lsp/settings/jsonls.lua b/lua/shnee/lsp/settings/jsonls.lua new file mode 100644 index 0000000..dd4fc3f --- /dev/null +++ b/lua/shnee/lsp/settings/jsonls.lua @@ -0,0 +1,192 @@ +-- Find more schemas here: https://www.schemastore.org/json/ +local schemas = { + { + description = "TypeScript compiler configuration file", + fileMatch = { + "tsconfig.json", + "tsconfig.*.json", + }, + url = "https://json.schemastore.org/tsconfig.json", + }, + { + description = "Lerna config", + fileMatch = { "lerna.json" }, + url = "https://json.schemastore.org/lerna.json", + }, + { + description = "Babel configuration", + fileMatch = { + ".babelrc.json", + ".babelrc", + "babel.config.json", + }, + url = "https://json.schemastore.org/babelrc.json", + }, + { + description = "ESLint config", + fileMatch = { + ".eslintrc.json", + ".eslintrc", + }, + url = "https://json.schemastore.org/eslintrc.json", + }, + { + description = "Bucklescript config", + fileMatch = { "bsconfig.json" }, + url = "https://raw.githubusercontent.com/rescript-lang/rescript-compiler/8.2.0/docs/docson/build-schema.json", + }, + { + description = "Prettier config", + fileMatch = { + ".prettierrc", + ".prettierrc.json", + "prettier.config.json", + }, + url = "https://json.schemastore.org/prettierrc", + }, + { + description = "Vercel Now config", + fileMatch = { "now.json" }, + url = "https://json.schemastore.org/now", + }, + { + description = "Stylelint config", + fileMatch = { + ".stylelintrc", + ".stylelintrc.json", + "stylelint.config.json", + }, + url = "https://json.schemastore.org/stylelintrc", + }, + { + description = "A JSON schema for the ASP.NET LaunchSettings.json files", + fileMatch = { "launchsettings.json" }, + url = "https://json.schemastore.org/launchsettings.json", + }, + { + description = "Schema for CMake Presets", + fileMatch = { + "CMakePresets.json", + "CMakeUserPresets.json", + }, + url = "https://raw.githubusercontent.com/Kitware/CMake/master/Help/manual/presets/schema.json", + }, + { + description = "Configuration file as an alternative for configuring your repository in the settings page.", + fileMatch = { + ".codeclimate.json", + }, + url = "https://json.schemastore.org/codeclimate.json", + }, + { + description = "LLVM compilation database", + fileMatch = { + "compile_commands.json", + }, + url = "https://json.schemastore.org/compile-commands.json", + }, + { + description = "Config file for Command Task Runner", + fileMatch = { + "commands.json", + }, + url = "https://json.schemastore.org/commands.json", + }, + { + description = "AWS CloudFormation provides a common language for you to describe and provision all the infrastructure resources in your cloud environment.", + fileMatch = { + "*.cf.json", + "cloudformation.json", + }, + url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/cloudformation.schema.json", + }, + { + description = "The AWS Serverless Application Model (AWS SAM, previously known as Project Flourish) extends AWS CloudFormation to provide a simplified way of defining the Amazon API Gateway APIs, AWS Lambda functions, and Amazon DynamoDB tables needed by your serverless application.", + fileMatch = { + "serverless.template", + "*.sam.json", + "sam.json", + }, + url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/sam.schema.json", + }, + { + description = "Json schema for properties json file for a GitHub Workflow template", + fileMatch = { + ".github/workflow-templates/**.properties.json", + }, + url = "https://json.schemastore.org/github-workflow-template-properties.json", + }, + { + description = "golangci-lint configuration file", + fileMatch = { + ".golangci.toml", + ".golangci.json", + }, + url = "https://json.schemastore.org/golangci-lint.json", + }, + { + description = "JSON schema for the JSON Feed format", + fileMatch = { + "feed.json", + }, + url = "https://json.schemastore.org/feed.json", + versions = { + ["1"] = "https://json.schemastore.org/feed-1.json", + ["1.1"] = "https://json.schemastore.org/feed.json", + }, + }, + { + description = "Packer template JSON configuration", + fileMatch = { + "packer.json", + }, + url = "https://json.schemastore.org/packer.json", + }, + { + description = "NPM configuration file", + fileMatch = { + "package.json", + }, + url = "https://json.schemastore.org/package.json", + }, + { + description = "JSON schema for Visual Studio component configuration files", + fileMatch = { + "*.vsconfig", + }, + url = "https://json.schemastore.org/vsconfig.json", + }, + { + description = "Resume json", + fileMatch = { "resume.json" }, + url = "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json", + }, +} + +-- local function extend(tab1, tab2) +-- for _, value in ipairs(tab2 or {}) do +-- table.insert(tab1, value) +-- end +-- return tab1 +-- end + +local extended_schemas = extend(schemas, default_schemas) + +local opts = { + settings = { + json = { + schemas = schemas, + }, + }, + setup = { + commands = { + Format = { + function() + vim.lsp.buf.range_formatting({}, { 0, 0 }, { vim.fn.line "$", 0 }) + end, + }, + }, + }, +} + +return opts diff --git a/lua/shnee/lsp/settings/lua_ls.lua b/lua/shnee/lsp/settings/lua_ls.lua new file mode 100644 index 0000000..9848bdd --- /dev/null +++ b/lua/shnee/lsp/settings/lua_ls.lua @@ -0,0 +1,15 @@ +return { + settings = { + Lua = { + diagnostics = { + globals = { "vim" }, + }, + workspace = { + library = { + [vim.fn.expand("$VIMRUNTIME/lua")] = true, + [vim.fn.stdpath("config") .. "/lua"] = true, + }, + }, + }, + }, +} diff --git a/lua/shnee/packer.lua b/lua/shnee/packer.lua new file mode 100644 index 0000000..74f4a7b --- /dev/null +++ b/lua/shnee/packer.lua @@ -0,0 +1,170 @@ +-- This file can be loaded by calling `lua require('plugins')` from your init.vim + +-- Only required if you have packer configured as `opt` +vim.cmd [[packadd packer.nvim]] + +return require('packer').startup(function(use) + -- Packer can manage itself + use 'wbthomason/packer.nvim' + + use 'chriskempson/base16-vim' + use({ + "jackMort/ChatGPT.nvim", + config = function() + require("chatgpt").setup() + end, + requires = { + "MunifTanjim/nui.nvim", + "nvim-lua/plenary.nvim", + "nvim-telescope/telescope.nvim" + } + }) + + -- ansible + -- TODO This didnt work. Commented out and trying the Ansible LSP installed + -- via Mason instead. + -- use 'mfussenegger/nvim-ansible' + + -- copilot stuff + use { + "zbirenbaum/copilot.lua", + --cmd = "Copilot", + --event = "InsertEnter", + config = function() + require("copilot").setup({ + suggestion = { enabled = false }, + panel = { enabled = false }, + }) + end, + } + use { + "zbirenbaum/copilot-cmp", + after = { "copilot.lua" }, + config = function () + require("copilot_cmp").setup() + end + } + use { + "tzachar/cmp-ai", + config = function () + require("cmp_ai.config"):setup({ + max_lines = 1000, + provider = 'Ollama', + provider_options = { + base_url = 'http://192.168.1.100:11434/api/generate', + model = 'codellama:13b', + prompt = function(lines_before, lines_after) + -- require('notify').notify('lines_before: ' .. lines_before, vim.log.levels.INFO, { + -- title = 'lines_before', + -- }) + -- require('notify').notify('lines_after: ' .. lines_after, vim.log.levels.INFO, { + -- title = 'lines_after', + -- }) + return '
 ' .. lines_before .. ' ' .. lines_after .. ' ' -- for codellama
+          end,
+        },
+        notify = true,
+        notify_callback = function(msg)
+          -- vim.notify(msg)
+          require('notify').notify(msg, vim.log.levels.INFO, {
+            title = 'ollama',
+            render = 'compact',
+          })
+        end,
+        run_on_every_keystroke = true,
+      })
+    end,
+  }
+  use 'rcarriga/nvim-notify'
+
+  use 'junegunn/vim-easy-align'
+
+  -- indent guides
+  -- TODO Consider using lukas-reineke/indent-blankline.nvim for this.
+  --
+  -- It would be nice to have these lines toggleable.
+
+  -- This is a generic and configurable sidebar, it's lacking some features that
+  -- I'm looking for. For now I think we're going to use specific plugins for
+  -- tags and file exploring, etc.
+  -- use 'sidebar-nvim/sidebar.nvim'
+
+  use {
+      'nvim-telescope/telescope.nvim', tag = '0.1.2',
+      -- or                          , branch = '0.1.x',
+      requires = { {'nvim-lua/plenary.nvim'} }
+  }
+  use('nvim-treesitter/nvim-treesitter', { tag = 'v.0.9.0', run = ':TSUpdate' })
+  use 'vim-airline/vim-airline'
+  use 'vim-airline/vim-airline-themes'
+
+  -- git
+  use 'tpope/vim-fugitive'
+  use 'lewis6991/gitsigns.nvim'
+
+  -- tagbar
+  --
+  -- I'm not in love with either of these. Symbols-outline has a ton of info but
+  -- there isn't any kind of sorting or filtering. Aerial is only showing
+  -- functions for me although it's supposed to show variables too.
+  use {
+      'simrat39/symbols-outline.nvim',
+      config = function() require'symbols-outline'.setup{} end,
+  }
+  use {
+      'stevearc/aerial.nvim',
+      config = function()
+          require('aerial').setup({
+              -- filter_kind = false,
+            filter_kind = { "Class", "Function", "Method, Variable" },
+          }) end
+  }
+
+  use {
+      'folke/todo-comments.nvim',
+      requires = "nvim-lua/plenary.nvim",
+  }
+  use 'folke/trouble.nvim'
+  -- TODO REM have to make icons optional.
+  use {
+      'nvim-tree/nvim-web-devicons',
+      config = function()
+          require'nvim-web-devicons'.setup {
+              color_icons = true;
+              default = true;
+          }
+      end
+  }
+  use {
+      "folke/which-key.nvim",
+      config = function()
+            vim.o.timeout = true
+            vim.o.timeoutlen = 300
+            require("which-key").setup {
+              -- your configuration comes here
+              -- or leave it empty to use the default settings
+              -- refer to the configuration section below
+            }
+      end
+  }
+
+  -- cmp plugins
+  use "hrsh7th/nvim-cmp" -- The completion plugin
+  use "hrsh7th/cmp-buffer" -- buffer completions
+  use "hrsh7th/cmp-path" -- path completions
+  use "hrsh7th/cmp-cmdline" -- cmdline completions
+  use "saadparwaiz1/cmp_luasnip" -- snippet completions
+  use "hrsh7th/cmp-nvim-lsp"
+  use "hrsh7th/cmp-nvim-lua"
+
+  -- snippets
+  use "L3MON4D3/LuaSnip" --snippet engine
+  use "rafamadriz/friendly-snippets" -- a bunch of snippets to use
+
+  -- lsp
+  use "neovim/nvim-lspconfig"
+  use "williamboman/mason.nvim"
+  use "williamboman/mason-lspconfig.nvim"
+  use 'jose-elias-alvarez/null-ls.nvim'
+
+end)
diff --git a/lua/shnee/remap.lua b/lua/shnee/remap.lua
new file mode 100644
index 0000000..f80d524
--- /dev/null
+++ b/lua/shnee/remap.lua
@@ -0,0 +1,33 @@
+local opts = { noremap = true, silent = true }
+
+-- vim.g.mapleader = ','
+
+--remap space as leader key
+vim.api.nvim_set_keymap("", "", "", opts)
+vim.g.mapleader = " "
+vim.g.maplocalleader = " "
+
+-- navigate buffers
+vim.api.nvim_set_keymap("n", "", ":bnext", opts)
+vim.api.nvim_set_keymap("n", "", ":bprevious", opts)
+
+-- visual --
+-- stay in indent mode
+vim.api.nvim_set_keymap("v", "<", "", ">gv", opts)
+
+-- move text up and down
+vim.api.nvim_set_keymap("v", "", ":m .+1==", opts)
+vim.api.nvim_set_keymap("v", "", ":m .-2==", opts)
+-- keep yanked text in the register even after you paste in visual mode.
+vim.api.nvim_set_keymap("v", "p", '"_dP', opts)
+
+-- visual block --
+-- move text up and down
+-- TODO not super sure what the difference between these are... Got these from
+--      https://github.com/LunarVim/Neovim-from-scratch
+--      branch: 02-keymaps, commit: e1ac274
+vim.api.nvim_set_keymap("x", "J", ":move '>+1gv-gv", opts)
+vim.api.nvim_set_keymap("x", "K", ":move '<-2gv-gv", opts)
+vim.api.nvim_set_keymap("x", "", ":move '>+1gv-gv", opts)
+vim.api.nvim_set_keymap("x", "", ":move '<-2gv-gv", opts)
diff --git a/lua/shnee/set.lua b/lua/shnee/set.lua
new file mode 100644
index 0000000..0d41c0b
--- /dev/null
+++ b/lua/shnee/set.lua
@@ -0,0 +1,58 @@
+vim.opt.nu = true
+vim.opt.relativenumber = true
+
+vim.opt.tabstop = 4
+vim.opt.softtabstop = 4
+vim.opt.shiftwidth = 4
+vim.opt.expandtab = true
+
+vim.opt.smartindent = true
+
+vim.opt.textwidth = 80
+vim.opt.wrap = false
+
+vim.opt.spell = true
+
+-- search highlighting
+vim.opt.hlsearch = false
+vim.opt.incsearch = true
+
+vim.opt.mouse = "a"
+
+-- Adds '-' to the list of characters that are considered part of a word.
+vim.opt.iskeyword:append("-")
+
+-- This should allow seamless copy/paste between vim and the system clipboard
+-- with both ctrl-c/ctrl-v and middle mouse button.
+vim.opt.clipboard = { "unnamedplus", "unnamed" }
+
+vim.opt.swapfile = false
+
+-- time to wait for a mapped sequence to complete (in milliseconds)
+vim.opt.timeoutlen = 1000
+
+-- enable persistent undo
+vim.opt.undofile = true
+
+-- faster completion (4000ms default)
+vim.opt.updatetime = 300
+
+vim.opt.scrolloff = 8
+-- I don't think we want the sidescroll option. This causes the view to shift to
+-- the right when the cursor is near the right edge of the screen, even if there
+-- is no text to the right of the cursor. So as long as we obey good line
+-- lengths this should not be needed.
+-- vim.opt.sidescrolloff = 8
+
+-- spellfiles
+--
+-- TODO Currently the default 'add' spellfile is in source control. It would
+-- probably be better to put those words in a different file and add it in this
+-- config.
+--
+-- In vimscript this would maybe look like:
+--   set spellfile+=shnee.utf-8.add
+--   or
+--   set spelllang+=shnee
+--
+-- Not sure hot do this in lua yet.
diff --git a/lua/shnee/splits.lua b/lua/shnee/splits.lua
new file mode 100644
index 0000000..bcbfba0
--- /dev/null
+++ b/lua/shnee/splits.lua
@@ -0,0 +1,19 @@
+local opts = { noremap = true, silent = true }
+
+-- splits
+vim.opt.splitbelow = true
+vim.opt.splitright = true
+vim.api.nvim_set_keymap('n', '', ':split', opts);
+vim.api.nvim_set_keymap('n', '', ':vsplit', opts);
+
+-- window navigation
+vim.api.nvim_set_keymap('n', '', '', opts);
+vim.api.nvim_set_keymap('n', '', '', opts);
+vim.api.nvim_set_keymap('n', '', '', opts);
+vim.api.nvim_set_keymap('n', '', '', opts);
+
+-- resize with arrows
+vim.api.nvim_set_keymap("n", "", ":resize +2", opts)
+vim.api.nvim_set_keymap("n", "", ":resize -2", opts)
+vim.api.nvim_set_keymap("n", "", ":vertical resize -2", opts)
+vim.api.nvim_set_keymap("n", "", ":vertical resize +2", opts)
diff --git a/plugin/packer_compiled.lua b/plugin/packer_compiled.lua
new file mode 100644
index 0000000..bd69021
--- /dev/null
+++ b/plugin/packer_compiled.lua
@@ -0,0 +1,317 @@
+-- Automatically generated packer.nvim plugin loader code
+
+if vim.api.nvim_call_function('has', {'nvim-0.5'}) ~= 1 then
+  vim.api.nvim_command('echohl WarningMsg | echom "Invalid Neovim version for packer.nvim! | echohl None"')
+  return
+end
+
+vim.api.nvim_command('packadd packer.nvim')
+
+local no_errors, error_msg = pcall(function()
+
+_G._packer = _G._packer or {}
+_G._packer.inside_compile = true
+
+local time
+local profile_info
+local should_profile = false
+if should_profile then
+  local hrtime = vim.loop.hrtime
+  profile_info = {}
+  time = function(chunk, start)
+    if start then
+      profile_info[chunk] = hrtime()
+    else
+      profile_info[chunk] = (hrtime() - profile_info[chunk]) / 1e6
+    end
+  end
+else
+  time = function(chunk, start) end
+end
+
+local function save_profiles(threshold)
+  local sorted_times = {}
+  for chunk_name, time_taken in pairs(profile_info) do
+    sorted_times[#sorted_times + 1] = {chunk_name, time_taken}
+  end
+  table.sort(sorted_times, function(a, b) return a[2] > b[2] end)
+  local results = {}
+  for i, elem in ipairs(sorted_times) do
+    if not threshold or threshold and elem[2] > threshold then
+      results[i] = elem[1] .. ' took ' .. elem[2] .. 'ms'
+    end
+  end
+  if threshold then
+    table.insert(results, '(Only showing plugins that took longer than ' .. threshold .. ' ms ' .. 'to load)')
+  end
+
+  _G._packer.profile_output = results
+end
+
+time([[Luarocks path setup]], true)
+local package_path_str = "/home/shnee/.cache/nvim/packer_hererocks/2.1.1702233742/share/lua/5.1/?.lua;/home/shnee/.cache/nvim/packer_hererocks/2.1.1702233742/share/lua/5.1/?/init.lua;/home/shnee/.cache/nvim/packer_hererocks/2.1.1702233742/lib/luarocks/rocks-5.1/?.lua;/home/shnee/.cache/nvim/packer_hererocks/2.1.1702233742/lib/luarocks/rocks-5.1/?/init.lua"
+local install_cpath_pattern = "/home/shnee/.cache/nvim/packer_hererocks/2.1.1702233742/lib/lua/5.1/?.so"
+if not string.find(package.path, package_path_str, 1, true) then
+  package.path = package.path .. ';' .. package_path_str
+end
+
+if not string.find(package.cpath, install_cpath_pattern, 1, true) then
+  package.cpath = package.cpath .. ';' .. install_cpath_pattern
+end
+
+time([[Luarocks path setup]], false)
+time([[try_loadstring definition]], true)
+local function try_loadstring(s, component, name)
+  local success, result = pcall(loadstring(s), name, _G.packer_plugins[name])
+  if not success then
+    vim.schedule(function()
+      vim.api.nvim_notify('packer.nvim: Error running ' .. component .. ' for ' .. name .. ': ' .. result, vim.log.levels.ERROR, {})
+    end)
+  end
+  return result
+end
+
+time([[try_loadstring definition]], false)
+time([[Defining packer_plugins]], true)
+_G.packer_plugins = {
+  ["ChatGPT.nvim"] = {
+    config = { "\27LJ\2\n5\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\fchatgpt\frequire\0" },
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/ChatGPT.nvim",
+    url = "https://github.com/jackMort/ChatGPT.nvim"
+  },
+  LuaSnip = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/LuaSnip",
+    url = "https://github.com/L3MON4D3/LuaSnip"
+  },
+  ["aerial.nvim"] = {
+    config = { "\27LJ\2\ns\0\0\4\0\6\0\t6\0\0\0'\2\1\0B\0\2\0029\0\2\0005\2\4\0005\3\3\0=\3\5\2B\0\2\1K\0\1\0\16filter_kind\1\0\0\1\4\0\0\nClass\rFunction\21Method, Variable\nsetup\vaerial\frequire\0" },
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/aerial.nvim",
+    url = "https://github.com/stevearc/aerial.nvim"
+  },
+  ["base16-vim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/base16-vim",
+    url = "https://github.com/chriskempson/base16-vim"
+  },
+  ["cmp-ai"] = {
+    config = { "\27LJ\2\n8\0\2\a\0\3\0\a'\2\0\0\18\3\0\0'\4\1\0\18\5\1\0'\6\2\0&\2\6\2L\2\2\0\v \v \v
 y\0\1\6\0\a\0\f6\1\0\0'\3\1\0B\1\2\0029\1\1\1\18\3\0\0006\4\2\0009\4\3\0049\4\4\0049\4\5\0045\5\6\0B\1\4\1K\0\1\0\1\0\2\ntitle\vollama\vrender\fcompact\tINFO\vlevels\blog\bvim\vnotify\frequire\2\1\0\6\0\n\0\0146\0\0\0'\2\1\0B\0\2\2\18\2\0\0009\0\2\0005\3\3\0005\4\4\0003\5\5\0=\5\6\4=\4\a\0033\4\b\0=\4\t\3B\0\3\1K\0\1\0\20notify_callback\0\21provider_options\vprompt\0\1\0\2\rbase_url,http://192.168.1.100:11434/api/generate\nmodel\18codellama:13b\1\0\4\14max_lines\3\a\vnotify\2\rprovider\vOllama\27run_on_every_keystroke\2\nsetup\18cmp_ai.config\frequire\0" },
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp-ai",
+    url = "https://github.com/tzachar/cmp-ai"
+  },
+  ["cmp-buffer"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp-buffer",
+    url = "https://github.com/hrsh7th/cmp-buffer"
+  },
+  ["cmp-cmdline"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp-cmdline",
+    url = "https://github.com/hrsh7th/cmp-cmdline"
+  },
+  ["cmp-nvim-lsp"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp-nvim-lsp",
+    url = "https://github.com/hrsh7th/cmp-nvim-lsp"
+  },
+  ["cmp-nvim-lua"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp-nvim-lua",
+    url = "https://github.com/hrsh7th/cmp-nvim-lua"
+  },
+  ["cmp-path"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp-path",
+    url = "https://github.com/hrsh7th/cmp-path"
+  },
+  cmp_luasnip = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/cmp_luasnip",
+    url = "https://github.com/saadparwaiz1/cmp_luasnip"
+  },
+  ["copilot-cmp"] = {
+    config = { "\27LJ\2\n9\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\16copilot_cmp\frequire\0" },
+    load_after = {},
+    loaded = true,
+    needs_bufread = false,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/opt/copilot-cmp",
+    url = "https://github.com/zbirenbaum/copilot-cmp"
+  },
+  ["copilot.lua"] = {
+    after = { "copilot-cmp" },
+    config = { "\27LJ\2\nu\0\0\4\0\b\0\v6\0\0\0'\2\1\0B\0\2\0029\0\2\0005\2\4\0005\3\3\0=\3\5\0025\3\6\0=\3\a\2B\0\2\1K\0\1\0\npanel\1\0\1\fenabled\1\15suggestion\1\0\0\1\0\1\fenabled\1\nsetup\fcopilot\frequire\0" },
+    loaded = true,
+    only_config = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/copilot.lua",
+    url = "https://github.com/zbirenbaum/copilot.lua"
+  },
+  ["friendly-snippets"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/friendly-snippets",
+    url = "https://github.com/rafamadriz/friendly-snippets"
+  },
+  ["gitsigns.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/gitsigns.nvim",
+    url = "https://github.com/lewis6991/gitsigns.nvim"
+  },
+  ["mason-lspconfig.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/mason-lspconfig.nvim",
+    url = "https://github.com/williamboman/mason-lspconfig.nvim"
+  },
+  ["mason.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/mason.nvim",
+    url = "https://github.com/williamboman/mason.nvim"
+  },
+  ["nui.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/nui.nvim",
+    url = "https://github.com/MunifTanjim/nui.nvim"
+  },
+  ["null-ls.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/null-ls.nvim",
+    url = "https://github.com/jose-elias-alvarez/null-ls.nvim"
+  },
+  ["nvim-cmp"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/nvim-cmp",
+    url = "https://github.com/hrsh7th/nvim-cmp"
+  },
+  ["nvim-lspconfig"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/nvim-lspconfig",
+    url = "https://github.com/neovim/nvim-lspconfig"
+  },
+  ["nvim-notify"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/nvim-notify",
+    url = "https://github.com/rcarriga/nvim-notify"
+  },
+  ["nvim-treesitter"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/nvim-treesitter",
+    url = "https://github.com/nvim-treesitter/nvim-treesitter"
+  },
+  ["nvim-web-devicons"] = {
+    config = { "\27LJ\2\n\\\0\0\3\0\4\0\a6\0\0\0'\2\1\0B\0\2\0029\0\2\0005\2\3\0B\0\2\1K\0\1\0\1\0\2\fdefault\2\16color_icons\2\nsetup\22nvim-web-devicons\frequire\0" },
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/nvim-web-devicons",
+    url = "https://github.com/nvim-tree/nvim-web-devicons"
+  },
+  ["packer.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/packer.nvim",
+    url = "https://github.com/wbthomason/packer.nvim"
+  },
+  ["plenary.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/plenary.nvim",
+    url = "https://github.com/nvim-lua/plenary.nvim"
+  },
+  ["symbols-outline.nvim"] = {
+    config = { "\27LJ\2\nA\0\0\3\0\3\0\a6\0\0\0'\2\1\0B\0\2\0029\0\2\0004\2\0\0B\0\2\1K\0\1\0\nsetup\20symbols-outline\frequire\0" },
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/symbols-outline.nvim",
+    url = "https://github.com/simrat39/symbols-outline.nvim"
+  },
+  ["telescope.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/telescope.nvim",
+    url = "https://github.com/nvim-telescope/telescope.nvim"
+  },
+  ["todo-comments.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/todo-comments.nvim",
+    url = "https://github.com/folke/todo-comments.nvim"
+  },
+  ["trouble.nvim"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/trouble.nvim",
+    url = "https://github.com/folke/trouble.nvim"
+  },
+  ["vim-airline"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/vim-airline",
+    url = "https://github.com/vim-airline/vim-airline"
+  },
+  ["vim-airline-themes"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/vim-airline-themes",
+    url = "https://github.com/vim-airline/vim-airline-themes"
+  },
+  ["vim-easy-align"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/vim-easy-align",
+    url = "https://github.com/junegunn/vim-easy-align"
+  },
+  ["vim-fugitive"] = {
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/vim-fugitive",
+    url = "https://github.com/tpope/vim-fugitive"
+  },
+  ["which-key.nvim"] = {
+    config = { "\27LJ\2\nt\0\0\3\0\a\0\0156\0\0\0009\0\1\0+\1\2\0=\1\2\0006\0\0\0009\0\1\0)\1,\1=\1\3\0006\0\4\0'\2\5\0B\0\2\0029\0\6\0004\2\0\0B\0\2\1K\0\1\0\nsetup\14which-key\frequire\15timeoutlen\ftimeout\6o\bvim\0" },
+    loaded = true,
+    path = "/home/shnee/.local/share/nvim/site/pack/packer/start/which-key.nvim",
+    url = "https://github.com/folke/which-key.nvim"
+  }
+}
+
+time([[Defining packer_plugins]], false)
+-- Config for: cmp-ai
+time([[Config for cmp-ai]], true)
+try_loadstring("\27LJ\2\n8\0\2\a\0\3\0\a'\2\0\0\18\3\0\0'\4\1\0\18\5\1\0'\6\2\0&\2\6\2L\2\2\0\v \v \v
 y\0\1\6\0\a\0\f6\1\0\0'\3\1\0B\1\2\0029\1\1\1\18\3\0\0006\4\2\0009\4\3\0049\4\4\0049\4\5\0045\5\6\0B\1\4\1K\0\1\0\1\0\2\ntitle\vollama\vrender\fcompact\tINFO\vlevels\blog\bvim\vnotify\frequire\2\1\0\6\0\n\0\0146\0\0\0'\2\1\0B\0\2\2\18\2\0\0009\0\2\0005\3\3\0005\4\4\0003\5\5\0=\5\6\4=\4\a\0033\4\b\0=\4\t\3B\0\3\1K\0\1\0\20notify_callback\0\21provider_options\vprompt\0\1\0\2\rbase_url,http://192.168.1.100:11434/api/generate\nmodel\18codellama:13b\1\0\4\14max_lines\3\a\vnotify\2\rprovider\vOllama\27run_on_every_keystroke\2\nsetup\18cmp_ai.config\frequire\0", "config", "cmp-ai")
+time([[Config for cmp-ai]], false)
+-- Config for: symbols-outline.nvim
+time([[Config for symbols-outline.nvim]], true)
+try_loadstring("\27LJ\2\nA\0\0\3\0\3\0\a6\0\0\0'\2\1\0B\0\2\0029\0\2\0004\2\0\0B\0\2\1K\0\1\0\nsetup\20symbols-outline\frequire\0", "config", "symbols-outline.nvim")
+time([[Config for symbols-outline.nvim]], false)
+-- Config for: which-key.nvim
+time([[Config for which-key.nvim]], true)
+try_loadstring("\27LJ\2\nt\0\0\3\0\a\0\0156\0\0\0009\0\1\0+\1\2\0=\1\2\0006\0\0\0009\0\1\0)\1,\1=\1\3\0006\0\4\0'\2\5\0B\0\2\0029\0\6\0004\2\0\0B\0\2\1K\0\1\0\nsetup\14which-key\frequire\15timeoutlen\ftimeout\6o\bvim\0", "config", "which-key.nvim")
+time([[Config for which-key.nvim]], false)
+-- Config for: copilot.lua
+time([[Config for copilot.lua]], true)
+try_loadstring("\27LJ\2\nu\0\0\4\0\b\0\v6\0\0\0'\2\1\0B\0\2\0029\0\2\0005\2\4\0005\3\3\0=\3\5\0025\3\6\0=\3\a\2B\0\2\1K\0\1\0\npanel\1\0\1\fenabled\1\15suggestion\1\0\0\1\0\1\fenabled\1\nsetup\fcopilot\frequire\0", "config", "copilot.lua")
+time([[Config for copilot.lua]], false)
+-- Config for: nvim-web-devicons
+time([[Config for nvim-web-devicons]], true)
+try_loadstring("\27LJ\2\n\\\0\0\3\0\4\0\a6\0\0\0'\2\1\0B\0\2\0029\0\2\0005\2\3\0B\0\2\1K\0\1\0\1\0\2\fdefault\2\16color_icons\2\nsetup\22nvim-web-devicons\frequire\0", "config", "nvim-web-devicons")
+time([[Config for nvim-web-devicons]], false)
+-- Config for: aerial.nvim
+time([[Config for aerial.nvim]], true)
+try_loadstring("\27LJ\2\ns\0\0\4\0\6\0\t6\0\0\0'\2\1\0B\0\2\0029\0\2\0005\2\4\0005\3\3\0=\3\5\2B\0\2\1K\0\1\0\16filter_kind\1\0\0\1\4\0\0\nClass\rFunction\21Method, Variable\nsetup\vaerial\frequire\0", "config", "aerial.nvim")
+time([[Config for aerial.nvim]], false)
+-- Config for: ChatGPT.nvim
+time([[Config for ChatGPT.nvim]], true)
+try_loadstring("\27LJ\2\n5\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\fchatgpt\frequire\0", "config", "ChatGPT.nvim")
+time([[Config for ChatGPT.nvim]], false)
+-- Load plugins in order defined by `after`
+time([[Sequenced loading]], true)
+vim.cmd [[ packadd copilot-cmp ]]
+
+-- Config for: copilot-cmp
+try_loadstring("\27LJ\2\n9\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\16copilot_cmp\frequire\0", "config", "copilot-cmp")
+
+time([[Sequenced loading]], false)
+
+_G._packer.inside_compile = false
+if _G._packer.needs_bufread == true then
+  vim.cmd("doautocmd BufRead")
+end
+_G._packer.needs_bufread = false
+
+if should_profile then save_profiles() end
+
+end)
+
+if not no_errors then
+  error_msg = error_msg:gsub('"', '\\"')
+  vim.api.nvim_command('echohl ErrorMsg | echom "Error in packer_compiled: '..error_msg..'" | echom "Please check your config for correctness" | echohl None')
+end
diff --git a/spell/en.utf-8.add b/spell/en.utf-8.add
new file mode 100644
index 0000000..649c7c8
--- /dev/null
+++ b/spell/en.utf-8.add
@@ -0,0 +1,23 @@
+AWS
+Artifactory
+EC2
+GitLab
+MSS
+Peraton
+RHEL
+VPCs
+args
+config
+gitlab
+json
+off
+popup
+stdout
+tmp
+url
+api
+auth
+params
+Dockerfile
+Dockerfiles
+ANDSAS
diff --git a/spell/en.utf-8.add.spl b/spell/en.utf-8.add.spl
new file mode 100644
index 0000000..71040ba
Binary files /dev/null and b/spell/en.utf-8.add.spl differ