aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/home/.config/nvim/lua/custom
diff options
context:
space:
mode:
authorLibravatar Arnold Sommerfeld <sommerfeld@strisemarx.com>2023-05-17 18:44:48 +0100
committerLibravatar Arnold Sommerfeld <sommerfeld@strisemarx.com>2023-10-18 11:16:43 +0100
commitb487984ecc61c6229cf92550030745c192fd3d0b (patch)
tree937e598c941fc1172467aeeed8ef51cbfceaca62 /home/.config/nvim/lua/custom
downloaddotfiles-b487984ecc61c6229cf92550030745c192fd3d0b.tar.gz
dotfiles-b487984ecc61c6229cf92550030745c192fd3d0b.tar.bz2
dotfiles-b487984ecc61c6229cf92550030745c192fd3d0b.zip
first commit
Diffstat (limited to 'home/.config/nvim/lua/custom')
-rw-r--r--home/.config/nvim/lua/custom/plugins/init.lua1117
1 files changed, 1117 insertions, 0 deletions
diff --git a/home/.config/nvim/lua/custom/plugins/init.lua b/home/.config/nvim/lua/custom/plugins/init.lua
new file mode 100644
index 0000000..eb720e6
--- /dev/null
+++ b/home/.config/nvim/lua/custom/plugins/init.lua
@@ -0,0 +1,1117 @@
+local map = require("mapper")
+
+return {
+ { "nvim-lua/plenary.nvim", lazy = true },
+ { "tpope/vim-repeat", event = "VeryLazy" },
+ 'tpope/vim-sleuth',
+ {
+ "numToStr/Comment.nvim",
+ config = true,
+ },
+ {
+ "tpope/vim-unimpaired",
+ keys = { "]", "[", "yo" },
+ },
+ { "folke/which-key.nvim", lazy = true },
+ { "kylechui/nvim-surround", config = true },
+ {
+ "dstein64/vim-startuptime",
+ cmd = "StartupTime",
+ },
+ {
+ "folke/persistence.nvim",
+ config = true,
+ event = "BufReadPre",
+ keys = {
+ {
+ "<leader>qs",
+ require("persistence").load,
+ desc =
+ "Restore Session"
+ },
+ {
+ "<leader>ql",
+ function() require("persistence").load({ last = true }) end,
+ desc =
+ "Restore Last Session"
+ },
+ {
+ "<leader>qd",
+ require("persistence").stop,
+ desc =
+ "Don't Save Current Session"
+ },
+ },
+ },
+ "xiyaowong/nvim-cursorword",
+ {
+ "sainnhe/gruvbox-material",
+ priority = 1000,
+ config = function()
+ vim.g.gruvbox_material_background = "hard"
+ vim.g.gruvbox_material_enable_bold = 1
+ vim.g.gruvbox_material_enable_italic = 1
+ vim.g.gruvbox_material_better_performance = 1
+ vim.g.gruvbox_material_palette = "original"
+
+ vim.cmd([[ colorscheme gruvbox-material]])
+ end
+ },
+ {
+ "aserowy/tmux.nvim",
+ config = true,
+ },
+ {
+ "Julian/vim-textobj-variable-segment",
+ dependencies = { "kana/vim-textobj-user" },
+ },
+ { "mzlogin/vim-markdown-toc", ft = "markdown" },
+ {
+ "norcalli/nvim-colorizer.lua",
+ event = "BufRead",
+ config = true
+ },
+ {
+ "lewis6991/hover.nvim",
+ keys = { { "K", require "hover".hover }, { "gK", require "hover"
+ .hover_select }, { "gh", require "hover".hover },
+ { "gH", require "hover".hover_select } },
+ opts = {
+ init = function()
+ require("hover.providers.lsp")
+ require('hover.providers.gh')
+ require('hover.providers.man')
+ -- require('hover.providers.dictionary')
+ end,
+ },
+ },
+ { 'akinsho/git-conflict.nvim', config = true },
+ {
+ "lukas-reineke/indent-blankline.nvim",
+ config = function()
+ local highlight = {
+ "RainbowRed",
+ "RainbowYellow",
+ "RainbowBlue",
+ "RainbowOrange",
+ "RainbowGreen",
+ "RainbowViolet",
+ "RainbowCyan",
+ }
+ local hooks = require "ibl.hooks"
+ -- create the highlight groups in the highlight setup hook, so they are reset
+ -- every time the colorscheme changes
+ hooks.register(hooks.type.HIGHLIGHT_SETUP, function()
+ vim.api.nvim_set_hl(0, "RainbowRed", { fg = "#E06C75" })
+ vim.api.nvim_set_hl(0, "RainbowYellow", { fg = "#E5C07B" })
+ vim.api.nvim_set_hl(0, "RainbowBlue", { fg = "#61AFEF" })
+ vim.api.nvim_set_hl(0, "RainbowOrange", { fg = "#D19A66" })
+ vim.api.nvim_set_hl(0, "RainbowGreen", { fg = "#98C379" })
+ vim.api.nvim_set_hl(0, "RainbowViolet", { fg = "#C678DD" })
+ vim.api.nvim_set_hl(0, "RainbowCyan", { fg = "#56B6C2" })
+ end)
+
+ vim.g.rainbow_delimiters = { highlight = highlight }
+ require("ibl").setup { scope = { highlight = highlight } }
+
+ hooks.register(hooks.type.SCOPE_HIGHLIGHT,
+ hooks.builtin.scope_highlight_from_extmark)
+ end
+ },
+ {
+ "monaqa/dial.nvim",
+ config = function()
+ map.n("]i", require("dial.map").inc_normal())
+ map.n("[i", require("dial.map").dec_normal())
+ map.v("]i", require("dial.map").inc_visual())
+ map.v("[i", require("dial.map").dec_visual())
+ end
+ },
+ {
+ "iamcco/markdown-preview.nvim",
+ build = "cd app && yarn install",
+ ft = "markdown",
+ config = function()
+ vim.api.nvim_command([[
+ function! g:OpenNewWindow(url)
+ silent exec "Start! librewolf --new-window " . a:url
+ endfunction
+ ]])
+ vim.g.mkdp_browserfunc = "g:OpenNewWindow"
+ end,
+ },
+ "gpanders/editorconfig.nvim",
+ {
+ "kwkarlwang/bufresize.nvim",
+ config = true
+ },
+ "kovetskiy/sxhkd-vim",
+ "tmux-plugins/vim-tmux",
+ "chrisbra/csv.vim",
+ "martinda/Jenkinsfile-vim-syntax",
+ "rhysd/vim-llvm",
+ "MTDL9/vim-log-highlighting",
+ "raimon49/requirements.txt.vim",
+ "wgwoods/vim-systemd-syntax",
+ {
+ "NeogitOrg/neogit",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ },
+ config = function()
+ require("neogit").setup({
+ disable_commit_confirmation = true,
+ kind = "split",
+ console_timeout = 5000,
+ auto_show_console = false,
+ })
+ map.n("<leader>ng", require "neogit".open)
+ end,
+ },
+ {
+ "ruifm/gitlinker.nvim",
+ keys = {
+ { "<leader>gy", function() require 'gitlinker'.get_buf_range_url("n") end },
+ {
+ "<leader>gy",
+ function()
+ require 'gitlinker'.get_buf_range_url("v")
+ end,
+ mode = "v"
+ },
+ },
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ },
+ config = function()
+ require "gitlinker".setup({
+ callbacks = {
+ ["personal"] = function(url_data)
+ url_data.host = "github.com"
+ return require "gitlinker.hosts".get_github_type_url(url_data)
+ end,
+ ["work"] = function(url_data)
+ url_data.host = "github.com"
+ return require "gitlinker.hosts".get_github_type_url(url_data)
+ end,
+ ["git.strisemarx.com"] = function(url_data)
+ local url = require "gitlinker.hosts".get_base_https_url(url_data)
+ url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev
+ if url_data.lstart then
+ url = url .. "#n" .. url_data.lstart
+ end
+ return url
+ end
+ },
+ })
+ end,
+ },
+ {
+ "lewis6991/gitsigns.nvim",
+ event = "BufRead",
+ opts = {
+ signs = {
+ change = { show_count = true },
+ delete = { show_count = true },
+ topdelete = { show_count = true },
+ changedelete = { show_count = true },
+ },
+ numhl = true,
+ _extmark_signs = true,
+ _threaded_diff = true,
+ _signs_staged_enable = true,
+ on_attach = function(bufnr)
+ local gs = package.loaded.gitsigns
+
+ -- Navigation
+ map.n(']c', function()
+ if vim.wo.diff then return ']c' end
+ vim.schedule(function() gs.next_hunk() end)
+ return '<Ignore>'
+ end, { expr = true }, bufnr)
+
+ map.n('[c', function()
+ if vim.wo.diff then return '[c' end
+ vim.schedule(function() gs.prev_hunk() end)
+ return '<Ignore>'
+ end, { expr = true }, bufnr)
+
+ -- Actions
+ map.nvcmd('<leader>hs', "Gitsigns stage_hunk", nil, bufnr)
+ map.nvcmd('<leader>hr', "Gitsigns reset_hunk", nil, bufnr)
+ map.n('<leader>hS', gs.stage_buffer, nil, bufnr)
+ map.n('<leader>hu', gs.undo_stage_hunk, nil, bufnr)
+ map.n('<leader>hR', gs.reset_buffer, nil, bufnr)
+ map.n('<leader>hp', gs.preview_hunk, nil, bufnr)
+ map.n('<leader>hb', function() gs.blame_line { full = true } end, nil,
+ bufnr)
+ map.n('<leader>tb', gs.toggle_current_line_blame, nil, bufnr)
+ map.n('<leader>hd', gs.diffthis, nil, bufnr)
+ map.n('<leader>hD', function() gs.diffthis('~') end, nil, bufnr)
+ map.n('<leader>hc', gs.change_base, nil, bufnr)
+ map.n('<leader>hC', function() gs.change_base('~') end, nil, bufnr)
+ map.n('<leader>td', gs.toggle_deleted, nil, bufnr)
+ map.n('<leader>tw', gs.toggle_word_diff, nil, bufnr)
+ map.n('<leader>tl', gs.toggle_linehl, nil, bufnr)
+
+ -- Text object
+ map.map({ 'o', 'x' }, 'ih', ':<C-U>Gitsigns select_hunk<CR>', nil, bufnr)
+ end
+ },
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ },
+ },
+ {
+ "nvim-telescope/telescope.nvim",
+ config = function()
+ local actions = require("telescope.actions")
+ require("telescope").setup({
+ defaults = {
+ sorting_strategy = "ascending",
+ layout_config = {
+ prompt_position = "top",
+ },
+ scroll_strategy = "cycle",
+ selection_strategy = "follow",
+ color_devicons = false,
+ mappings = {
+ i = {
+ ["<c-j>"] = actions.move_selection_next,
+ ["<c-k>"] = actions.move_selection_previous,
+ },
+ },
+ extensions = {
+ fzf = {
+ fuzzy = true, -- false will only do exact matching
+ override_generic_sorter = true, -- override the generic sorter
+ override_file_sorter = true, -- override the file sorter
+ case_mode = "smart_case", -- or "ignore_case" or "respect_case"
+ },
+ ["ui-select"] = {
+ require("telescope.themes").get_dropdown({
+ -- even more opts
+ }),
+ },
+ },
+ },
+ })
+ require("telescope").load_extension("fzf")
+ require("telescope").load_extension("ui-select")
+
+ local b = require("telescope.builtin")
+
+ map.n("<localleader>p", b.planets)
+ map.n("<localleader>B", b.builtin)
+ map.n("<localleader>/", b.live_grep)
+ map.n("<localleader>?", b.grep_string)
+ map.n("<localleader>f", function()
+ b.find_files({
+ find_command = {
+ "fd",
+ "--type",
+ "file",
+ "--follow",
+ "--hidden",
+ "--exclude",
+ ".git",
+ },
+ })
+ end)
+ map.n("<localleader>b", function()
+ b.buffers({ sort_lastused = true, initial_mode = "normal" })
+ end)
+
+ map.n("<localleader>t", b.treesitter)
+
+ map.n("<localleader>c", b.commands)
+ map.n("<localleader>h", b.help_tags)
+ map.n("<localleader>m", b.man_pages)
+ map.n("<localleader>k", b.keymaps)
+ map.n("<localleader>Q", function()
+ b.quickfix({ initial_mode = "normal" })
+ end)
+ map.n("<localleader>L", function()
+ b.loclist({ initial_mode = "normal" })
+ end)
+ map.n("<localleader>R", function()
+ b.registers({ initial_mode = "normal" })
+ end)
+ map.n("<localleader>A", b.autocommands)
+
+ map.n("gd", function()
+ b.lsp_definitions({ initial_mode = "normal" })
+ end)
+ map.n("gvd", function()
+ b.lsp_definitions({ initial_mode = "normal", jump_type = "vsplit" })
+ end)
+ map.n("gxd", function()
+ b.lsp_definitions({ initial_mode = "normal", jump_type = "split" })
+ end)
+ map.n("gtd", function()
+ b.lsp_definitions({ initial_mode = "normal", jump_type = "tab" })
+ end)
+ map.n("gi", function()
+ b.lsp_implementations({ initial_mode = "normal" })
+ end)
+ map.n("gvi", function()
+ b.lsp_implementations({ initial_mode = "normal", jump_type = "vsplit" })
+ end)
+ map.n("gxi", function()
+ b.lsp_implementations({ initial_mode = "normal", jump_type = "split" })
+ end)
+ map.n("gti", function()
+ b.lsp_implementations({ initial_mode = "normal", jump_type = "tab" })
+ end)
+ map.n("go", b.lsp_document_symbols)
+ map.n("gS", b.lsp_dynamic_workspace_symbols)
+ map.n("ge", function()
+ b.lsp_document_diagnostics({ initial_mode = "normal" })
+ end)
+ map.n("gE", function()
+ b.lsp_workspace_diagnostics({ initial_mode = "normal" })
+ end)
+ map.n("gr", function()
+ b.lsp_references({ initial_mode = "normal" })
+ end)
+ map.n("gic", function()
+ b.lsp_incoming_calls({ initial_mode = "normal" })
+ end)
+ map.n("goc", function()
+ b.lsp_outgoing_calls({ initial_mode = "normal" })
+ end)
+ end,
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ {
+ "nvim-telescope/telescope-fzf-native.nvim",
+ build = "make",
+ },
+ "nvim-telescope/telescope-ui-select.nvim",
+ },
+ },
+ {
+ "mfussenegger/nvim-dap",
+ config = function()
+ local dap = require("dap")
+
+ dap.defaults.fallback.force_external_terminal = true
+ dap.defaults.fallback.external_terminal = {
+ command = "/usr/bin/st",
+ args = { "-e" },
+ }
+
+ dap.defaults.fallback.terminal_win_cmd = "50vsplit new"
+
+ local function get_env_vars()
+ local variables = {}
+ for k, v in pairs(vim.fn.environ()) do
+ table.insert(variables, string.format("%s=%s", k, v))
+ end
+ return variables
+ end
+
+ dap.adapters.lldb = {
+ type = "executable",
+ command = "/usr/bin/lldb-vscode",
+ name = "lldb",
+ }
+
+ local function str_split(inputstr, sep)
+ sep = sep or "%s"
+ local t = {}
+ for str in inputstr:gmatch("([^" .. sep .. "]+)") do
+ table.insert(t, str)
+ end
+ return t
+ end
+
+ local _cmd = nil
+
+ local function get_cmd()
+ if _cmd then
+ return _cmd
+ end
+ local clipboard_cmd = vim.fn.getreg("+")
+ _cmd = vim.fn.input({
+ prompt = "Command to execute: ",
+ default = clipboard_cmd
+ })
+ return _cmd
+ end
+
+ local function get_program()
+ return str_split(get_cmd())[1]
+ end
+
+ local function get_args()
+ local argv = str_split(get_cmd())
+ local args = {}
+
+ if #argv < 2 then
+ return {}
+ end
+
+ for i = 2, #argv do
+ args[#args + 1] = argv[i]
+ end
+
+ return args
+ end
+
+ dap.configurations.cpp = {
+ {
+ name = "Launch",
+ type = "lldb",
+ request = "launch",
+ cwd = "${workspaceFolder}",
+ program = get_program,
+ stopOnEntry = true,
+ args = get_args,
+ env = get_env_vars,
+ runInTerminal = true,
+ },
+ {
+ -- If you get an "Operation not permitted" error using this, try disabling YAMA:
+ -- echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
+ name = "Attach to process",
+ type = "lldb",
+ request = "attach",
+ pid = require('dap.utils').pick_process,
+ },
+ }
+
+ dap.configurations.c = dap.configurations.cpp
+ dap.configurations.rust = dap.configurations.cpp
+
+ local get_python_path = function()
+ local venv_path = os.getenv("VIRTUAL_ENV")
+ if venv_path then
+ return venv_path .. "/bin/python"
+ end
+ return "/usr/bin/python"
+ end
+
+ require("dap-python").setup(get_python_path())
+
+ dap.adapters.nlua = function(callback, config)
+ callback({ type = "server", host = config.host, port = config.port })
+ end
+
+ dap.configurations.lua = {
+ {
+ type = "nlua",
+ request = "attach",
+ name = "Attach to running Neovim instance",
+ host = function()
+ local value = vim.fn.input("Host [127.0.0.1]: ")
+ if value ~= "" then
+ return value
+ end
+ return "127.0.0.1"
+ end,
+ port = function()
+ local val = tonumber(vim.fn.input("Port: "))
+ assert(val, "Please provide a port number")
+ return val
+ end,
+ },
+ }
+
+ dap.repl.commands = vim.tbl_extend("force", dap.repl.commands, {
+ continue = { "continue", "c" },
+ next_ = { "next", "n" },
+ back = { "back", "b" },
+ reverse_continue = { "reverse-continue", "rc" },
+ into = { "into" },
+ into_target = { "into_target" },
+ out = { "out" },
+ scopes = { "scopes" },
+ threads = { "threads" },
+ frames = { "frames" },
+ exit = { "exit", "quit", "q" },
+ up = { "up" },
+ down = { "down" },
+ goto_ = { "goto" },
+ capabilities = { "capabilities", "cap" },
+ -- add your own commands
+ custom_commands = {
+ ["echo"] = function(text)
+ dap.repl.append(text)
+ end,
+ },
+ })
+
+ map.n("<F4>", dap.close)
+ map.n("<F5>", dap.continue)
+ map.n("<F10>", dap.step_over)
+ map.n("<F11>", dap.step_into)
+ map.n("<F12>", dap.step_out)
+ map.n("<leader>b", dap.toggle_breakpoint)
+ map.n("<leader>B", function()
+ dap.set_breakpoint(vim.fn.input("Breakpoint condition: "))
+ end)
+ map.n("<leader>lp", function()
+ dap.set_breakpoint(nil, nil, vim.fn.input("Log point message: "))
+ end)
+ map.n("<leader>dr", dap.repl.open)
+ map.n("<leader>dl", dap.run_last)
+ map.n("<F2>", dap.list_breakpoints)
+
+ local dapui = require("dapui")
+ dap.listeners.after.event_initialized["dapui_config"] = function()
+ dapui.open()
+ end
+ dap.listeners.before.event_terminated["dapui_config"] = function()
+ dapui.close()
+ end
+ dap.listeners.before.event_exited["dapui_config"] = function()
+ dapui.close()
+ end
+ map.n("<leader>du", dapui.toggle)
+ map.v("<leader>de", dapui.eval)
+ end,
+ dependencies = {
+ {
+ "rcarriga/nvim-dap-ui",
+ opts = {
+ icons = { expanded = "-", collapsed = "+", current_frame = "*" },
+ controls = { enabled = false },
+ layouts = {
+ {
+ elements = {
+ -- Elements can be strings or table with id and size keys.
+ "scopes",
+ "breakpoints",
+ "stacks",
+ "watches",
+ },
+ size = 40,
+ position = "left",
+ },
+ {
+ elements = {
+ "repl",
+ },
+ size = 0.25, -- 25% of total lines
+ position = "bottom",
+ },
+ },
+ },
+ },
+ {
+ "mfussenegger/nvim-dap-python",
+ keys = {
+ { "gm", function()
+ require("dap-python").test_method()
+ end },
+ {
+ "g<cr>",
+ function()
+ require("dap-python").debug_selection()
+ end,
+ mode = "v"
+ },
+ },
+ },
+ "jbyuki/one-small-step-for-vimkind",
+ {
+ "theHamsta/nvim-dap-virtual-text",
+ config = true,
+ dependencies = { "nvim-treesitter/nvim-treesitter" }
+ }
+ },
+ },
+ {
+ 'nvim-treesitter/nvim-treesitter',
+ dependencies = {
+ 'nvim-treesitter/nvim-treesitter-textobjects',
+ "nvim-treesitter/nvim-treesitter-refactor",
+ "RRethy/nvim-treesitter-textsubjects",
+ "theHamsta/nvim-treesitter-pairs",
+ "RRethy/nvim-treesitter-endwise",
+ },
+ build = ":TSUpdate",
+ config = function()
+ require("nvim-treesitter.configs").setup({
+ ensure_installed = {
+ "bash",
+ "c",
+ "cmake",
+ "comment",
+ "cpp",
+ "css",
+ "cuda",
+ "diff",
+ "dockerfile",
+ "fortran",
+ "git_rebase",
+ "gitattributes",
+ "gitcommit",
+ "gitignore",
+ "go",
+ "html",
+ "javascript",
+ "jsdoc",
+ "json",
+ "llvm",
+ "lua",
+ "make",
+ "markdown",
+ "markdown_inline",
+ "ninja",
+ "python",
+ "regex",
+ "rust",
+ "sql",
+ "todotxt",
+ "toml",
+ "typescript",
+ "vim",
+ "vimdoc",
+ "yaml"
+ },
+ -- ignore_install = { "phpdoc" },
+ highlight = {
+ enable = true, -- false will disable the whole extension
+ additional_vim_regex_highlighting = false,
+ },
+ incremental_selection = {
+ enable = true,
+ keymaps = {
+ init_selection = "gnn",
+ node_incremental = "grn",
+ scope_incremental = "grc",
+ node_decremental = "grm",
+ },
+ },
+ indent = { enable = true },
+ refactor = {
+ highlight_definitions = { enable = true },
+ highlight_current_scope = { enable = true },
+ smart_rename = { enable = true, keymaps = { smart_rename = "grr" } },
+ navigation = {
+ enable = true,
+ keymaps = {
+ goto_definition = "gnd",
+ list_definitions = "gnD",
+ list_definitions_toc = "gO",
+ goto_next_usage = "<a-*>",
+ goto_previous_usage = "<a-#>",
+ },
+ },
+ },
+ 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",
+ ["ic"] = "@class.inner",
+ },
+ },
+ swap = {
+ enable = true,
+ swap_next = { ["<leader>a"] = "@parameter.inner" },
+ swap_previous = { ["<leader>A"] = "@parameter.inner" },
+ },
+ move = {
+ enable = true,
+ set_jumps = true, -- whether to set jumps in the jumplist
+ goto_next_start = {
+ ["]m"] = "@function.outer",
+ ["]]"] = "@class.outer",
+ },
+ goto_next_end = {
+ ["]M"] = "@function.outer",
+ ["]["] = "@class.outer",
+ },
+ goto_previous_start = {
+ ["[m"] = "@function.outer",
+ ["[["] = "@class.outer",
+ },
+ goto_previous_end = {
+ ["[M"] = "@function.outer",
+ ["[]"] = "@class.outer",
+ },
+ },
+ lsp_interop = {
+ enable = true,
+ peek_definition_code = {
+ ["df"] = "@function.outer",
+ ["dF"] = "@class.outer",
+ },
+ },
+ },
+ matchup = {
+ enable = true,
+ },
+ pairs = {
+ enable = true,
+ goto_right_end = false,
+ keymaps = { goto_partner = "%" },
+ },
+ textsubjects = {
+ enable = true,
+ keymaps = { ["."] = "textsubjects-smart", [";"] = "textsubjects-big" },
+ },
+ tree_docs = {
+ enable = true,
+ },
+ endwise = {
+ enable = true,
+ },
+ })
+ end
+ },
+ {
+ "hrsh7th/nvim-cmp",
+ event = "InsertEnter",
+ config = function()
+ local cmp = require("cmp")
+
+ local has_words_before = function()
+ local line, col = unpack(vim.api.nvim_win_get_cursor(0))
+ return col ~= 0
+ and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]
+ :sub(col, col)
+ :match("%s")
+ == nil
+ end
+
+ local luasnip = require("luasnip")
+
+ cmp.setup({
+ snippet = {
+ expand = function(args)
+ require("luasnip").lsp_expand(args.body)
+ end,
+ },
+ mapping = {
+ ["<Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ elseif luasnip.expand_or_jumpable() then
+ luasnip.expand_or_jump()
+ elseif has_words_before() then
+ cmp.complete()
+ else
+ fallback()
+ end
+ end, {
+ "i",
+ "s",
+ }),
+ ["<S-Tab>"] = 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",
+ }),
+ ["<CR>"] = cmp.mapping.confirm({
+ behavior = cmp.ConfirmBehavior.Replace,
+ select = true,
+ }),
+ },
+ formatting = {
+ format = function(entry, vim_item)
+ -- set a name for each source
+ vim_item.menu = ({
+ path = "[Path]",
+ nvim_lsp = "[LSP]",
+ luasnip = "[LuaSnip]",
+ dap = "[dap]",
+ })[entry.source.name]
+ return vim_item
+ end,
+ },
+ sources = {
+ { name = "nvim_lsp" },
+ { name = "luasnip" },
+ { name = "path" },
+ { name = "nvim_lsp_signature_help" },
+ },
+ })
+
+ require "cmp".setup.filetype(
+ { "dap-repl", "dapui_watches", "dapui_hover" }, {
+ sources = {
+ { name = "dap" },
+ },
+ })
+ end,
+ dependencies = {
+ "hrsh7th/cmp-nvim-lsp",
+ "hrsh7th/cmp-path",
+ "hrsh7th/cmp-nvim-lsp-signature-help",
+ "rcarriga/cmp-dap",
+ {
+ "saadparwaiz1/cmp_luasnip",
+ dependencies = {
+ {
+ "L3MON4D3/LuaSnip",
+ event = "InsertCharPre",
+ keys = {
+ { "<c-j>", function() require "luasnip".jump(1) end, mode = "i" },
+ { "<c-k>", function() require "luasnip".jump(-1) end, mode = "i" },
+ },
+ config = function()
+ require("luasnip/loaders/from_vscode").lazy_load()
+ end,
+ dependencies = {
+ "kitagry/vs-snippets",
+ "rafamadriz/friendly-snippets",
+ "kkonghao/snippet-dog",
+ },
+ }
+ },
+ },
+ },
+ },
+ {
+ 'neovim/nvim-lspconfig',
+ config = function()
+ local lspconfig = require("lspconfig")
+ -- Enable (broadcasting) snippet capability for completion
+ local capabilities = vim.lsp.protocol.make_client_capabilities()
+ capabilities.textDocument.completion.completionItem.snippetSupport = true
+ capabilities.workspace.didChangeWatchedFiles.dynamicRegistration = true
+ capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities)
+
+ lspconfig.util.default_config = vim.tbl_extend(
+ "force",
+ lspconfig.util.default_config,
+ {
+ on_attach = require "cfg.lsp".on_attach_wrapper,
+ capabilities = capabilities,
+ flags = {
+ debounce_text_changes = 150,
+ },
+ }
+ )
+
+ local function switch_source_header_splitcmd(bufnr, splitcmd)
+ bufnr = lspconfig.util.validate_bufnr(bufnr)
+ local clangd_client = lspconfig.util.get_active_client_by_name(
+ bufnr,
+ "clangd"
+ )
+ local params = { uri = vim.uri_from_bufnr(bufnr) }
+ if clangd_client then
+ clangd_client.request(
+ "textDocument/switchSourceHeader",
+ params,
+ function(err, result)
+ if err then
+ error(tostring(err))
+ end
+ if not result then
+ print("Corresponding file cannot be determined")
+ return
+ end
+ vim.api.nvim_command(splitcmd .. " " .. vim.uri_to_fname(result))
+ end,
+ bufnr
+ )
+ else
+ print(
+ "method textDocument/switchSourceHeader is not supported by any servers active on the current buffer"
+ )
+ end
+ end
+
+ local servers = {
+ bashls = {},
+ fortls = {},
+ lua_ls = {
+ on_attach = function(client, bufnr)
+ require("cfg.lsp").on_attach_wrapper(
+ client,
+ bufnr,
+ { auto_format = true }
+ )
+ end,
+ settings = {
+ Lua = {
+ completion = {
+ callSnippet = "Both",
+ displayContext = 1,
+ },
+ hint = {
+ enable = true,
+ }
+ }
+ },
+ },
+ ruff_lsp = {},
+ pyright = {},
+ clangd = {
+ cmd = {
+ "clangd",
+ "--enable-config",
+ "--completion-parse=auto",
+ "--completion-style=bundled",
+ "--header-insertion=iwyu",
+ "--header-insertion-decorators",
+ "--inlay-hints",
+ "--suggest-missing-includes",
+ "--folding-ranges",
+ "--function-arg-placeholders",
+ "--pch-storage=memory",
+ },
+ commands = {
+ ClangdSwitchSourceHeader = {
+ function()
+ switch_source_header_splitcmd(0, "edit")
+ end,
+ description = "Open source/header in current buffer",
+ },
+ ClangdSwitchSourceHeaderVSplit = {
+ function()
+ switch_source_header_splitcmd(0, "vsplit")
+ end,
+ description = "Open source/header in a new vsplit",
+ },
+ ClangdSwitchSourceHeaderSplit = {
+ function()
+ switch_source_header_splitcmd(0, "split")
+ end,
+ description = "Open source/header in a new split",
+ },
+ ClangdSwitchSourceHeaderTab = {
+ function()
+ switch_source_header_splitcmd(0, "tabedit")
+ end,
+ description = "Open source/header in a new tab",
+ },
+ },
+ on_attach = function(client, bufnr)
+ require("cfg.lsp").on_attach_wrapper(client, bufnr)
+ local cmpconfig = require("cmp.config")
+ local compare = require("cmp.config.compare")
+ cmpconfig.set_buffer({
+ sorting = {
+ comparators = {
+ compare.offset,
+ compare.exact,
+ -- compare.scopes,
+ require("clangd_extensions.cmp_scores"),
+ compare.recently_used,
+ compare.locality,
+ compare.kind,
+ compare.sort_text,
+ compare.length,
+ compare.order,
+ },
+ },
+ }, bufnr)
+ vim.api.nvim_create_augroup("clang-format", {})
+ vim.api.nvim_create_autocmd("BufWritePre", {
+ group = "clang-format",
+ buffer = bufnr,
+ callback = function()
+ if vim.fn.expand('%:p:h'):find("test") then
+ return
+ end
+ require("cfg.utils").format_hunks({
+ bufnr = bufnr,
+ async = false,
+ id = client.id
+ })
+ end,
+ })
+ map.ncmd("gH", "ClangdSwitchSourceHeader")
+ map.ncmd("gvH", "ClangdSwitchSourceHeaderVSplit")
+ map.ncmd("gxH", "ClangdSwitchSourceHeaderSplit")
+ map.ncmd("gtH", "ClangdSwitchSourceHeaderSplit")
+
+ require("clangd_extensions.inlay_hints").setup_autocmd()
+ require("clangd_extensions.inlay_hints").set_inlay_hints()
+ end,
+ init_options = {
+ usePlaceholders = true,
+ completeUnimported = true,
+ clangdFileStatus = true,
+ },
+ },
+ }
+
+ for server, config in pairs(servers) do
+ local default_config = lspconfig[server].default_config or
+ lspconfig[server].document_config.default_config
+ local cmd = config.cmd or default_config.cmd
+ if vim.fn.executable(cmd[1]) == 1 then lspconfig[server].setup(config) end
+ end
+ end,
+ dependencies = {
+ "hrsh7th/cmp-nvim-lsp",
+ "ray-x/lsp_signature.nvim",
+ "jubnzv/virtual-types.nvim",
+ { 'folke/neodev.nvim', opts = {} },
+ { "lvimuser/lsp-inlayhints.nvim", config = true },
+ {
+ "p00f/clangd_extensions.nvim",
+ config = function()
+ require("clangd_extensions").setup({
+ })
+ end
+ },
+ },
+ },
+ {
+ 'nvim-lualine/lualine.nvim',
+ opts = {
+ options = {
+ icons_enabled = false,
+ theme = 'gruvbox_dark',
+ component_separators = '',
+ section_separators = '|',
+ },
+ sections = {
+ lualine_a = { 'filetype', { 'filename', path = 1 } },
+ lualine_b = { '%l/%L:%c:%o' },
+ lualine_c = { 'diff' },
+ lualine_x = { 'searchcount, selectioncount' },
+ lualine_y = {},
+ lualine_z = { 'diagnostics' }
+ },
+ inactive_sections = {
+ lualine_a = { 'filename' },
+ lualine_b = {},
+ lualine_c = {},
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {}
+ },
+ },
+ },
+ {
+ "nvimtools/none-ls.nvim",
+ config = function()
+ local nls = require("null-ls")
+ nls.setup({
+ on_attach = function(client, bufnr)
+ require("cfg.lsp").on_attach_wrapper(
+ client,
+ bufnr,
+ { auto_format = true }
+ )
+ end,
+ sources = {
+ nls.builtins.formatting.black,
+ }
+ })
+ end,
+ },
+ "https://gitlab.com/HiPhish/rainbow-delimiters.nvim",
+}