diff options
Diffstat (limited to 'plugin')
| -rw-r--r-- | plugin/00-settings.lua | 140 | ||||
| -rw-r--r-- | plugin/10-remap.lua | 162 | ||||
| -rw-r--r-- | plugin/20-colors.lua | 27 | ||||
| -rw-r--r-- | plugin/30-lspconfig.lua | 58 | ||||
| -rw-r--r-- | plugin/40-completion.lua | 36 | ||||
| -rw-r--r-- | plugin/40-git.lua | 18 | ||||
| -rw-r--r-- | plugin/40-guard.lua | 14 | ||||
| -rw-r--r-- | plugin/40-lsp.lua | 61 | ||||
| -rw-r--r-- | plugin/40-misc.lua | 17 | ||||
| -rw-r--r-- | plugin/40-oil.lua | 24 | ||||
| -rw-r--r-- | plugin/40-treesitter.lua | 58 |
11 files changed, 615 insertions, 0 deletions
diff --git a/plugin/00-settings.lua b/plugin/00-settings.lua new file mode 100644 index 0000000..fba8771 --- /dev/null +++ b/plugin/00-settings.lua @@ -0,0 +1,140 @@ +vim.o.rnu = true +vim.o.nu = true + +vim.o.conceallevel = 2 + +vim.o.laststatus = 3 + +vim.o.winborder = "rounded" + +-- Plugin specific +vim.g.rustfmt_autosave = 1 +vim.g.vimtex_view_method = 'mupdf' +vim.g.guard_config = { + fmt_on_save = true, + lsp_as_default_formatter = true, +} + +vim.g.mason_path = vim.fn.stdpath("data") .. "/mason/bin" + +vim.diagnostic.config({ virtual_lines = true }) + +local function diagnostics() + local warns = vim.diagnostic.get(nil, { severity = vim.diagnostic.severity.WARN }) + local errors = vim.diagnostic.get(nil, { severity = vim.diagnostic.severity.ERROR }) + return string.format(" %d | %d", #warns, #errors) +end + +local function get_attached_clients() + local buf_clients = vim.lsp.get_clients({ bufnr = 0 }) + if #buf_clients == 0 then + return "LSP Inactive" + end + + local buf_client_names = {} + + for _, client in pairs(buf_clients) do + table.insert(buf_client_names, client.name) + end + + local unique_client_names = {} + for _, client_name_target in ipairs(buf_client_names) do + local is_duplicate = false + for _, client_name_compare in ipairs(unique_client_names) do + if client_name_target == client_name_compare then + is_duplicate = true + end + end + if not is_duplicate then + table.insert(unique_client_names, client_name_target) + end + end + + local client_names_str = table.concat(unique_client_names, ", ") + local language_servers = string.format("[%s]", client_names_str) + + return language_servers +end + +vim.api.nvim_create_user_command("LspLog", function(_) + vim.cmd("edit " .. vim.fn.stdpath("state") .. "/lsp.log") +end, { + desc = "Show LSP log", +}) + +vim.api.nvim_create_user_command("PackUpdate", function(_) + vim.pack.update() +end, { + desc = "Update vim.pack plugins", +}) + +vim.api.nvim_create_user_command("PackList", function(_) + vim.pack.update(nil, { offline = true }) +end, { + desc = "List vim.pack plugins", +}) + +require("vim._core.ui2").enable({ + enable = true, +}) + +local function branch_name() + local branch = vim.fn.system("git branch --show-current 2> /dev/null | tr -d '\n'") + if branch ~= "" then + return " " .. branch + else + return "" + end +end + +vim.api.nvim_create_autocmd({ "FileType", "BufEnter", "FocusGained" }, { + callback = function() + vim.b.branch_name = branch_name() + end +}) + +function Status_Line() + return " " + .. "%<" + .. " %f " + .. (vim.b.branch_name or "") + .. " %m" + .. " %= " + .. diagnostics() + .. " " + .. get_attached_clients() + .. " [%{&filetype}]" + .. " %l:%c " +end + +vim.opt.statusline = "%{%v:lua.Status_Line()%}" + +vim.o.shiftwidth = 2 +vim.o.tabstop = 2 +vim.o.softtabstop = 2 +vim.o.expandtab = true + +vim.o.mouse = "" + +vim.o.smartindent = true + +vim.o.swapfile = false +vim.o.backup = false + +vim.o.scrolloff = 10 +vim.o.cursorline = false + +vim.o.hlsearch = true +vim.o.incsearch = true +vim.o.splitbelow = true +vim.o.splitright = true + +vim.o.clipboard = "unnamedplus" + +vim.opt.whichwrap:append "<>[]hl" + +vim.o.foldmethod = "expr" +vim.o.foldenable = false +vim.o.foldexpr = "v:lua.vim.treesitter.foldexpr()" + +vim.env.PATH = vim.g.mason_path .. ":" .. vim.env.PATH diff --git a/plugin/10-remap.lua b/plugin/10-remap.lua new file mode 100644 index 0000000..a30d6a8 --- /dev/null +++ b/plugin/10-remap.lua @@ -0,0 +1,162 @@ +vim.g.mapleader = " " +vim.keymap.set("n", "<leader>e", "<cmd>Oil --float<CR>") +vim.keymap.set("n", "<leader>n", "<cmd>set nu!<CR>") +vim.keymap.set("n", "<leader>rn", "<cmd>set rnu!<CR>") +vim.keymap.set("n", "<CR>", "<cmd>nohl<CR>") +vim.keymap.set("n", "<leader>x", "<cmd>bw<CR>") +vim.keymap.set("n", "<leader>n", "<cmd>bn<CR>") +vim.keymap.set("n", "<leader>p", "<cmd>bp<CR>") +vim.keymap.set("n", "<leader>fb", "=ap") +vim.keymap.set("n", "<leader>m", "<cmd>make<CR>") +vim.keymap.set("n", "<leader><leader>", "<cmd>!chmod 755 %<CR>", { silent = true }) +vim.keymap.set("n", "<A-J>", ":m .+1<CR>==") +vim.keymap.set("n", "<A-K>", ":m .-2<CR>==") +vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv") +vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv") +vim.keymap.set("n", "<A-a>", "<C-a>") +vim.keymap.set("n", "<A-x>", "<C-x>") +vim.keymap.set("v", ">", ">gv") +vim.keymap.set("v", "<", "<gv") +vim.keymap.set("n", "<leader>sl", "<cmd>exec \"normal i\".nr2char(getchar()).\"\\e\"<CR>") +vim.keymap.set("n", "<leader>sc", "<cmd>exec \"normal a\".nr2char(getchar()).\"\\e\"<CR>") + +-- u/soer9459 +vim.keymap.set("n", "<leader>,", + function() + local cursor = vim.api.nvim_win_get_cursor(0) + vim.cmd("norm A;") + vim.api.nvim_win_set_cursor(0, cursor) + end, + { noremap = true, silent = true }) + +-- Switch between windows +vim.keymap.set("n", "<C-h>", "<C-w>h") +vim.keymap.set("n", "<C-l>", "<C-w>l") +vim.keymap.set("n", "<C-j>", "<C-w>j") +vim.keymap.set("n", "<C-k>", "<C-w>k") +vim.keymap.set("n", "<C-a>v", ":vsp<CR>") +vim.keymap.set("n", "<C-a>-", ":sp<CR>") + +-- Switch between panes +vim.keymap.set("n", "<C-h>", "<cmd>TmuxNavigateLeft<CR>") +vim.keymap.set("n", "<C-l>", "<cmd>TmuxNavigateRight<CR>") +vim.keymap.set("n", "<C-j>", "<cmd>TmuxNavigateDown<CR>") +vim.keymap.set("n", "<C-k>", "<cmd>TmuxNavigateUp<CR>") + +-- Color picker +vim.keymap.set("n", "<leader>cc", "<cmd>CccPick<CR>") + +-- VimTex +vim.keymap.set("n", "<leader>ll", "<cmd>VimtexCompile<CR>") +vim.keymap.set("n", "<leader>vl", "<cmd>VimtexView<CR>") + +-- Screenkey +vim.keymap.set("n", "<leader>sk", "<cmd>Screenkey<CR>") + +-- Undotree +vim.cmd("packadd nvim.undotree") +vim.keymap.set("n", "<leader>u", require("undotree").open) + +-- Telescope +local lazy_telescope = function() + vim.pack.add({ + "https://github.com/nvim-lua/plenary.nvim", + { + src = "https://github.com/nvim-telescope/telescope.nvim", + version = "v0.2.2" + }, + }) + + require("telescope").setup({ + pickers = { + find_files = { + hidden = true, + find_command = { "rg", "--files", "--hidden", "--glob", "!**/.git/**" }, + }, + }, + }) +end + +vim.keymap.set("n", "<leader>ff", function() + lazy_telescope() + vim.cmd("Telescope find_files") +end, {}) +vim.keymap.set("n", "<leader>fw", function() + lazy_telescope() + vim.cmd("Telescope live_grep") +end, {}) +vim.keymap.set("n", "<leader>fo", function() + lazy_telescope() + vim.cmd("Telescope buffers") +end, {}) +vim.keymap.set("n", "<leader>fh", function() + lazy_telescope() + vim.cmd("Telescope help_tags") +end, {}) +vim.keymap.set("n", "<leader>fz", function() + lazy_telescope() + vim.cmd("Telescope current_buffer_fuzzy_find") +end, {}) +vim.keymap.set("n", "<leader>fg", function() + lazy_telescope() + vim.cmd("Telescope git_files") +end, {}) +vim.keymap.set("n", "<leader>fd", function() + lazy_telescope() + vim.cmd("Telescope diagnostics") +end, {}) +vim.keymap.set("n", "<leader>ft", function() + lazy_telescope() + local telescope = require("telescope.builtin") + local handle = io.popen("rg 'TODO'") + if handle == nil then return end + local result = handle:read("*a") + handle:close() + + if result:match("[^\r\n]+") == nil then + local todo_files = {} + + local files_handle = io.popen("rg --files -g 'TODO.{md,txt}'") + if files_handle == nil then return end + local files_result = files_handle:read("*a") + files_handle:close() + + for file in files_result:gmatch("[^\r\n]+") do + table.insert(todo_files, file) + end + + if #todo_files > 0 then + telescope.find_files({ + prompt_title = "Choose TODO file", + cwd = vim.fn.getcwd(), + search_dirs = todo_files + }) + else + vim.api.nvim_echo({ { "Failed to find any to-dos", "WarningMsg" } }, true, {}) + end + else + telescope.grep_string({ search = "TODO" }) + end +end, { noremap = true, silent = true }) + +-- Diagnostics, LSP +vim.keymap.set("n", "gl", "<cmd>lua vim.diagnostic.open_float()<CR>") +vim.keymap.set("n", "gp", "<cmd>lua vim.diagnostic.jump({ count = -1 })<CR>") +vim.keymap.set("n", "gn", "<cmd>lua vim.diagnostic.jump({ count = 1 })<CR>") + +vim.api.nvim_create_autocmd("LspAttach", { + desc = "LSP actions", + callback = function(event) + local opts = { buffer = event.buf } + + vim.keymap.set("n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts) + vim.keymap.set("n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts) + vim.keymap.set("n", "go", "<cmd>lua vim.lsp.buf.type_definition()<CR>", opts) + vim.keymap.set("n", "gs", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts) + vim.keymap.set({ "n", "x" }, "<S-f>", "<cmd>lua vim.lsp.buf.format({async = true})<CR>", opts) + -- u/Blan_11 + vim.keymap.set("n", "<leader>lh", function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, { silent = true, buffer = event.buf }) + end +}) diff --git a/plugin/20-colors.lua b/plugin/20-colors.lua new file mode 100644 index 0000000..dcab6d5 --- /dev/null +++ b/plugin/20-colors.lua @@ -0,0 +1,27 @@ +vim.pack.add({ + "https://github.com/uga-rosa/ccc.nvim", + { + src = "https://github.com/pml68/rosepine-tmuxed", + name = "rose-pine", + }, +}) + +require("ccc").setup({ + highlighter = { + auto_enable = true, + lsp = true, + }, +}) + +require("rose-pine").setup({ + styles = { + transparency = true, + italic = false, + }, + highlight_groups = { + StatusLine = { fg = "iris", bg = "iris", blend = 25 }, + StatusLineNC = { fg = "subtle", bg = "surface" }, + }, +}) + +vim.cmd.colorscheme("rose-pine") diff --git a/plugin/30-lspconfig.lua b/plugin/30-lspconfig.lua new file mode 100644 index 0000000..d8a9cfc --- /dev/null +++ b/plugin/30-lspconfig.lua @@ -0,0 +1,58 @@ +local servers = { + -- "asm_lsp", + "html", + "ts_ls", + "cssls", + "svelte", + "bashls", + "clangd", + "pyright", + "emmet_language_server", + "jsonls", + "rust_analyzer", + "kotlin_lsp", + "lua_ls", + "glsl_analyzer", + "csharp_ls", + "unocss", +} + +vim.api.nvim_create_autocmd({ "BufEnter" }, { + pattern = { "build.sh", "*.subpackage.sh", "PKGBUILD", "*.install", + "makepkg.conf", "*.ebuild", "*.eclass", "color.map", "make.conf" }, + callback = function() + vim.lsp.start({ + name = "termux", + cmd = { "termux-language-server" } + }) + end, +}) + +vim.api.nvim_create_autocmd({ "BufEnter" }, { + once = true, + pattern = { "Cargo.toml" }, + callback = function() + vim.pack.add({ "https://github.com/saecki/crates.nvim" }) + require("crates").setup({ + lsp = { + enabled = true, + actions = true, + completion = true, + hover = true, + }, + }) + + vim.keymap.set("n", "<leader>rcu", function() + require("crates").upgrade_all_crates() + end) + end, +}) + +vim.lsp.config('*', { + on_attach = function(client, bufnr) + vim.pack.add({ "https://github.com/artemave/workspace-diagnostics.nvim" }) + require("workspace-diagnostics").populate_workspace_diagnostics(client, bufnr) + end +}) + +vim.lsp.enable(servers) diff --git a/plugin/40-completion.lua b/plugin/40-completion.lua new file mode 100644 index 0000000..597a426 --- /dev/null +++ b/plugin/40-completion.lua @@ -0,0 +1,36 @@ +vim.pack.add({ + { + src = "https://github.com/saghen/blink.compat", + version = vim.version.range("2.x"), + }, + { + src = "https://github.com/saghen/blink.cmp", + version = vim.version.range("1.x"), + }, +}) + +require("blink.compat").setup({}) + +require("blink.cmp").setup({ + keymap = { preset = "default" }, + appearance = { + nerd_font_variant = "normal", + }, + completion = { + documentation = { + auto_show = true, + auto_show_delay_ms = 150, + }, + }, + sources = { + default = { "lsp", "path", "vimtex", "buffer" }, + providers = { + vimtex = { + name = "vimtex", + module = "blink.compat.source", + }, + }, + }, + cmdline = { enabled = false }, + signature = { enabled = true }, +}) diff --git a/plugin/40-git.lua b/plugin/40-git.lua new file mode 100644 index 0000000..eaf67b4 --- /dev/null +++ b/plugin/40-git.lua @@ -0,0 +1,18 @@ +vim.pack.add({ "https://github.com/lewis6991/gitsigns.nvim" }) + +require("gitsigns").setup({ + signs = { + add = { text = "│" }, + change = { text = "│" }, + delete = { text = "" }, + topdelete = { text = "‾" }, + changedelete = { text = "~" }, + untracked = { text = "│" }, + }, + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + + vim.keymap.set("n", "<leader>gb", gs.blame_line, { buffer = bufnr }) + vim.keymap.set("n", "<leader>gr", gs.reset_hunk, { buffer = bufnr }) + end, +}) diff --git a/plugin/40-guard.lua b/plugin/40-guard.lua new file mode 100644 index 0000000..ffdd82a --- /dev/null +++ b/plugin/40-guard.lua @@ -0,0 +1,14 @@ +vim.api.nvim_create_autocmd({ "BufEnter" }, { + once = true, + pattern = { "*.c", "*.cpp", "*.cc", "*.h", "*.hpp", "*.toml", "*.json", "*.lua" }, + callback = function() + vim.pack.add({ "https://github.com/nvimdev/guard-collection" }) + vim.pack.add({ "https://github.com/nvimdev/guard.nvim" }) + + local ft = require("guard.filetype") + + ft("c,cpp,h"):fmt("clang-format") + ft("toml"):fmt("taplo") + ft("json"):fmt("jq") + end, +}) diff --git a/plugin/40-lsp.lua b/plugin/40-lsp.lua new file mode 100644 index 0000000..af95c47 --- /dev/null +++ b/plugin/40-lsp.lua @@ -0,0 +1,61 @@ +local opts = { + ensure_installed = { + "bash-language-server", + "termux-language-server", + "lua-language-server", + "clangd", + "clang-format", + "taplo", + "jq", + "json-lsp", + "svelte-language-server", + "emmet-language-server", + "html-lsp", + "css-lsp", + "typescript-language-server", + "pyright", + "glsl_analyzer", + "kotlin-lsp", + "jdtls", + "csharp-language-server", + "unocss-language-server", + }, + PATH = "skip", + ui = { + icons = { + package_pending = " ", + package_installed = " ", + package_uninstalled = " ", + }, + keymaps = { + toggle_server_expand = "<CR>", + install_server = "i", + update_server = "u", + check_server_version = "c", + update_all_servers = "U", + check_outdated_servers = "C", + uninstall_server = "X", + cancel_installation = "<C-c>", + }, + }, + max_concurrent_installers = 10, +} + +vim.api.nvim_create_user_command("MasonInstallAll", function () + if opts.ensure_installed and #opts.ensure_installed > 0 then + vim.cmd("MasonInstall " .. table.concat(opts.ensure_installed, " ")) + end +end, { + desc = "Install all required mason packages", +}) + +vim.pack.add({ + "https://github.com/neovim/nvim-lspconfig", + "https://github.com/mason-org/mason.nvim", +}) + +require("mason").setup(opts) + +if not (vim.uv or vim.loop).fs_stat(vim.g.mason_path) then + vim.cmd("MasonInstallAll") +end diff --git a/plugin/40-misc.lua b/plugin/40-misc.lua new file mode 100644 index 0000000..94e46e0 --- /dev/null +++ b/plugin/40-misc.lua @@ -0,0 +1,17 @@ +vim.schedule(function() + vim.pack.add({ + "https://github.com/andweeb/presence.nvim", + "https://github.com/NStefan002/screenkey.nvim", + "https://github.com/NStefan002/visual-surround.nvim", + "https://github.com/christoomey/vim-tmux-navigator", + "https://github.com/artemave/workspace-diagnostics.nvim", + "https://github.com/lukas-reineke/indent-blankline.nvim", + }) + + require("presence").setup({ + main_image = "file", + }) + require("screenkey").setup({}) + require("visual-surround").setup({}) + require("ibl").setup() +end) diff --git a/plugin/40-oil.lua b/plugin/40-oil.lua new file mode 100644 index 0000000..34b4a90 --- /dev/null +++ b/plugin/40-oil.lua @@ -0,0 +1,24 @@ +vim.pack.add({ "https://github.com/stevearc/oil.nvim" }) +require("oil").setup({ + keymaps = { + ["<C-h>"] = false, + }, + view_options = { + show_hidden = true, + natural_order = true, + is_always_hidden = function(name, _) + return name == "node_modules" or name == "target" + end + }, + float = { + padding = 2, + max_width = 50, + max_height = 0, + border = "single", + win_options = { + winblend = 0, + }, + }, + skip_confirm_for_simple_edits = true, + default_file_explorer = true, +}) diff --git a/plugin/40-treesitter.lua b/plugin/40-treesitter.lua new file mode 100644 index 0000000..a9ff45b --- /dev/null +++ b/plugin/40-treesitter.lua @@ -0,0 +1,58 @@ +vim.pack.add({ "https://github.com/nvim-treesitter/nvim-treesitter" }) + +local ts = require("nvim-treesitter") + +local ensure_installed = { + "asm", + "bash", + "c", + "c_sharp", + "cpp", + "css", + "git_config", + "gitattributes", + "gitcommit", + "gitignore", + "glsl", + "hare", + "html", + "java", + "javascript", + "json", + "kotlin", + "lua", + "make", + "markdown", + "markdown_inline", + "python", + "rust", + "scss", + "svelte", + "typescript", + "vim", + "vimdoc", + "yaml", +} + +ts.install(ensure_installed, { + max_jobs = 12, + summary = false, +}) + +local ignore = { + "checkhealth", + "lazy", + "mason", + "TelescopePrompt", +} + +vim.api.nvim_create_autocmd("FileType", { + group = vim.api.nvim_create_augroup("EnableTreesitterHighlighting", { clear = true }), + callback = function(event) + if vim.tbl_contains(ignore, event.match) then + return + end + + pcall(function() vim.treesitter.start(event.buf) end) + end +}) |
