diff --git a/nvim/.config/nvim/lazy-lock.json b/nvim/.config/nvim/lazy-lock.json index 22cfec4..925be37 100644 --- a/nvim/.config/nvim/lazy-lock.json +++ b/nvim/.config/nvim/lazy-lock.json @@ -1,6 +1,5 @@ { "BetterLua.vim": { "branch": "master", "commit": "d2d6c115575d09258a794a6f20ac60233eee59d5" }, - "LuaSnip": { "branch": "master", "commit": "500981ff6cefc7343e3959ef0f939bd0bfd49ba9" }, "Navigator.nvim": { "branch": "master", "commit": "91d86506ac2a039504d5205d32a1d4bc7aa57072" }, "bats.vim": { "branch": "master", "commit": "6a5d2ef22b0ede503d867770afd02ebb1f97b709" }, "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, @@ -13,7 +12,7 @@ "cmp-spell": { "branch": "master", "commit": "60584cb75e5e8bba5a0c9e4c3ab0791e0698bffa" }, "cmp-tmux": { "branch": "main", "commit": "984772716f66d8ee88535a6bf3f94c4b4e1301f5" }, "cmp-treesitter": { "branch": "master", "commit": "b40178b780d547bcf131c684bc5fd41af17d05f2" }, - "cmp_luasnip": { "branch": "master", "commit": "18095520391186d634a0045dacaa346291096566" }, + "cmp-vsnip": { "branch": "main", "commit": "989a8a73c44e926199bfd05fa7a516d51f2d2752" }, "completion-vcard": { "branch": "master", "commit": "2220fd517a985ececed1adcf0e5be8f2815564c7" }, "dial.nvim": { "branch": "master", "commit": "5020da900cc5dfd7067f181ee2ebd872ca7c84e8" }, "formatter.nvim": { "branch": "master", "commit": "8a4c961330cc4688087f23d18fa7d2f1af9a4902" }, @@ -22,14 +21,11 @@ "guihua.lua": { "branch": "master", "commit": "d3f6d01639b52e6a83ea98dd6ca244c9aa98b79b" }, "lazy.nvim": { "branch": "main", "commit": "273081443471cbc52c327bcb99614c32f247998d" }, "lightspeed.nvim": { "branch": "main", "commit": "299eefa6a9e2d881f1194587c573dad619fdb96f" }, - "lsp-format.nvim": { "branch": "master", "commit": "ca0df5c8544e51517209ea7b86ecc522c98d4f0a" }, - "lsp-zero.nvim": { "branch": "main", "commit": "42bc5a1081666098a7154532e6ff5e3edc483b39" }, "lsp_signature.nvim": { "branch": "master", "commit": "6f6252f63b0baf0f2224c4caea33819a27f3f550" }, + "lspkind-nvim": { "branch": "master", "commit": "c68b3a003483cf382428a43035079f78474cd11e" }, "lualine.nvim": { "branch": "master", "commit": "0050b308552e45f7128f399886c86afefc3eb988" }, "magma-nvim-goose": { "branch": "main", "commit": "94370733757d550594fe4a1d65643949d7485989" }, "markdown-preview.nvim": { "branch": "master", "commit": "02cc3874738bc0f86e4b91f09b8a0ac88aef8e96" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "7a97a77eee486ae152d2c559a459eda7c8aa12aa" }, - "mason.nvim": { "branch": "main", "commit": "14ae1ca58440b158a0a35cf90773013caddf788a" }, "mini.nvim": { "branch": "main", "commit": "dc0ccf1b0499d649a6177d2a406babcfe73b97de" }, "nabla.nvim": { "branch": "master", "commit": "ddbfc6e244e79db9280c535ee85c81388c5d1b46" }, "navigator.lua": { "branch": "master", "commit": "66d84151e94052f710b1dfb0d1fce2faaca6dced" }, @@ -67,6 +63,7 @@ "vim-pandoc": { "branch": "master", "commit": "9f406d964ca70d959b7867f1b5cee3d4884d4d3c" }, "vim-pandoc-syntax": { "branch": "master", "commit": "4268535e1d33117a680a91160d845cd3833dfe28" }, "vim-spellsync": { "branch": "master", "commit": "27e103f2d283a1f6e24cc99dbdcd624713aff277" }, + "vim-vsnip": { "branch": "master", "commit": "8dde8c0ef10bb1afdbb301e2bd7eb1c153dd558e" }, "which-key.nvim": { "branch": "main", "commit": "684e96c5e8477f1ee9b3f2e9a12d802fd12c5531" }, "zen-mode.nvim": { "branch": "main", "commit": "3c92f503823088862ca2a7809d1c7edc90fb92fa" }, "zettelkasten.nvim": { "branch": "main", "commit": "0e77624689b470410f5355b613d45219c9350264" } diff --git a/nvim/.config/nvim/lua/maps.lua b/nvim/.config/nvim/lua/maps.lua index 1cb5217..add7290 100644 --- a/nvim/.config/nvim/lua/maps.lua +++ b/nvim/.config/nvim/lua/maps.lua @@ -192,9 +192,6 @@ map('n', 'ZG', ':setlocal spell! spelllang=de_de', map('i', '', 'u[s1z=`]au') map('n', 's', 'ms[s1z=`s', { desc = 'Fix last spell error' }) --- PLUGIN: mini.nvim -map('n', 'm', ':lua MiniMap.toggle()', { silent = true }) - -- PLUGIN: easy-align -- Start interactive EasyAlign in visual mode (e.g. vipga) map('x', 'ga', '(EasyAlign)') diff --git a/nvim/.config/nvim/lua/plug/_cmp.lua b/nvim/.config/nvim/lua/plug/_cmp.lua index 086874a..9518479 100644 --- a/nvim/.config/nvim/lua/plug/_cmp.lua +++ b/nvim/.config/nvim/lua/plug/_cmp.lua @@ -1,40 +1,95 @@ -local lsp = require("lsp-zero") -lsp.preset("recommended") -lsp.on_attach(function(client, bufnr) - require("lsp-format").on_attach(client, bufnr) -end) -lsp.nvim_workspace() -lsp.setup_nvim_cmp({ - sources = { - { name = 'path' }, { name = 'nvim_lsp', keyword_length = 2 }, - { name = 'buffer', keyword_length = 3 }, - { name = 'luasnip', keyword_length = 2 }, { name = 'tmux' }, - { name = 'otter' }, { name = 'latex_symbols' }, { name = 'vCard' }, - { name = 'nvim_lua' }, { name = 'buffer' }, { name = 'spell' } - }, - documentation = { - max_height = 50, - max_width = 90, - border = 'rounded', - col_offset = 0, - side_padding = 1, - winhighlight = 'Normal:Normal,FloatBorder:Normal,CursorLine:Visual,Search:None', - zindex = 1001 - } -}) -lsp.setup() -vim.diagnostic.config { virtual_text = true } - local cmp = require 'cmp' --- `/` cmdline setup. +local lspkind = require 'lspkind' + +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 feedkey = function(key, mode) + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), + mode, true) +end + +vim.o.completeopt = "menu,menuone,noselect" + +-- completion items +require('cmp').register_source('vCard', require('completion_vcard').setup_cmp( + '~/documents/contacts/myconts')) +vim.g.vsnip_snippet_dir = (vim.env.XDG_DATA_HOME or "~/.local/share") .. + "/nvim/snippets" +cmp.setup({ + snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end }, + mapping = { + [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), + [''] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + [''] = cmp.mapping({ + i = cmp.mapping.abort(), + c = cmp.mapping.close() + }), + -- Accept currently selected item. If none selected, `select` first item. + -- Set `select` to `false` to only confirm explicitly selected items. + [''] = cmp.mapping.confirm({ select = false }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif vim.fn["vsnip#available"](1) == 1 then + feedkey("(vsnip-expand-or-jump)", "") + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + + [""] = cmp.mapping(function() + if cmp.visible() then + cmp.select_prev_item() + elseif vim.fn["vsnip#jumpable"](-1) == 1 then + feedkey("(vsnip-jump-prev)", "") + end + end, { "i", "s" }) + }, + formatting = { + format = lspkind.cmp_format({ + with_text = false, + menu = ({ + buffer = "B", + nvim_lua = "NLua", + tmux = "τ", + vCard = "VCARD" + }) + }) + }, + sources = cmp.config.sources({ + { name = 'path' }, { name = 'nvim_lsp' }, { name = 'treesitter' }, + { name = 'tmux' }, { name = 'vsnip' }, { name = 'otter' }, + { name = 'latex_symbols' }, { name = 'vCard' }, { name = 'nvim_lua' } + }, { { name = 'buffer' }, { name = 'spell' } }) +}) + +if vim.o.ft == 'clap_input' and vim.o.ft == 'guihua' and vim.o.ft == + 'guihua_rust' then require 'cmp'.setup.buffer { completion = { enable = false } } end + +-- set up pandoc bibtex source generation +require 'cmp_pandoc'.setup() + +-- Use buffer source for `/` search cmp.setup.cmdline('/', { mapping = cmp.mapping.preset.cmdline(), - sources = { { name = 'buffer' } } + sources = cmp.config.sources({ { name = 'buffer' } }) }) --- `:` cmdline setup. + +-- Use cmdline & path source for ':' in vim cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ { name = 'path' } }, { - { name = 'cmdline', option = { ignore_cmds = { 'Man', '!' } } } - }) + sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) + +require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol + .make_client_capabilities()) diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index 86a5c16..baae4bc 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -1,28 +1,28 @@ -local writing_ft = { "quarto", "pandoc", "markdown", "text", "tex" } +local writing_ft = {"quarto", "pandoc", "markdown", "text", "tex"} return { -- vim plugs -- essential - { 'numToStr/Navigator.nvim', config = true }, -- allow seamless navigation between vim buffers and tmux/wezterm splits - { 'jeffkreeftmeijer/vim-numbertoggle', event = "BufEnter" }, -- toggles numbers to absolute for all buffers but the current which is relative - { 'ojroques/vim-oscyank', event = "VeryLazy" }, -- yank from *anywhere* (even ssh session) to clipboard, using :OSCYank - { 'ggandor/lightspeed.nvim', event = "VeryLazy" }, -- jump between letters with improved fFtT quicksearch, mimics sneak + {'numToStr/Navigator.nvim', config = true}, -- allow seamless navigation between vim buffers and tmux/wezterm splits + {'jeffkreeftmeijer/vim-numbertoggle', event = "BufEnter"}, -- toggles numbers to absolute for all buffers but the current which is relative + {'ojroques/vim-oscyank', event = "VeryLazy"}, -- yank from *anywhere* (even ssh session) to clipboard, using :OSCYank + {'ggandor/lightspeed.nvim', event = "VeryLazy"}, -- jump between letters with improved fFtT quicksearch, mimics sneak -- files - { 'vifm/vifm.vim' }, -- integrate file manager + {'vifm/vifm.vim'}, -- integrate file manager { 'lewis6991/gitsigns.nvim', -- show vcs changes on left-hand gutter config = true, event = "BufRead" }, { - 'norcalli/nvim-colorizer.lua', -- color hex, named colors in the correct preview scheme - config = true, - event = "VeryLazy" -}, { - 'mhartington/formatter.nvim', -- auto formatting on save - config = function() require('plug._format') end, - event = "VeryLazy" -}, -- editing - { 'kylechui/nvim-surround', version = '*', config = true, event = "VeryLazy" }, -- surround things with other things using ys/cs/ds + 'norcalli/nvim-colorizer.lua', -- color hex, named colors in the correct preview scheme + config = true, + event = "VeryLazy" + }, { + 'mhartington/formatter.nvim', -- auto formatting on save + config = function() require('plug._format') end, + event = "VeryLazy" + }, -- editing + {'kylechui/nvim-surround', version = '*', config = true, event = "VeryLazy"}, -- surround things with other things using ys/cs/ds { 'monaqa/dial.nvim', -- extend the ^a / ^x possibilities to dates, hex, alphabets, markdown headers config = function() @@ -39,61 +39,61 @@ return { augend.constant.alias.bool, augend.semver.alias.semver, augend.constant.alias.Alpha, augend.constant.alias.alpha, augend.hexcolor.new { case = "lower" }, augend.constant.new { - elements = { "and", "or" }, - word = true, -- if false, "sand" is incremented into "sor", "doctor" into "doctand", etc. - cyclic = true -- "or" is incremented into "and". - }, + elements = { "and", "or" }, + word = true, -- if false, "sand" is incremented into "sor", "doctor" into "doctand", etc. + cyclic = true -- "or" is incremented into "and". + }, augend.constant - .new { - elements = { "&&", "||" }, - word = false, - cyclic = true - } + .new { + elements = { "&&", "||" }, + word = false, + cyclic = true + } } } end, event = "VeryLazy" }, { - 'tommcdo/vim-exchange', -- adds exchange operator with cx. common use: cxiw . on 2 words to switch - event = "VeryLazy" -}, { - 'junegunn/vim-easy-align', -- Align tables and other alignable things - event = "VeryLazy" -}, -- colorschemes - { 'norcalli/nvim-base16.lua' }, -- + 'tommcdo/vim-exchange', -- adds exchange operator with cx. common use: cxiw . on 2 words to switch + event = "VeryLazy" + }, { + 'junegunn/vim-easy-align', -- Align tables and other alignable things + event = "VeryLazy" + }, -- colorschemes + {'norcalli/nvim-base16.lua'}, -- -- statusline { 'nvim-lualine/lualine.nvim', - requires = { 'kyazdani42/nvim-web-devicons', opt = true }, + requires = {'kyazdani42/nvim-web-devicons', opt = true}, config = function() require('plug._lualine') end }, -- writing - { 'vim-pandoc/vim-pandoc-syntax', ft = writing_ft }, - { 'vim-pandoc/vim-pandoc', ft = writing_ft }, - { 'vim-pandoc/vim-criticmarkup', ft = writing_ft }, { - 'quarto-dev/quarto-nvim', - dependencies = { 'jmbuhr/otter.nvim', 'neovim/nvim-lspconfig' }, - config = function() - require 'quarto'.setup { - lspFeatures = { - enabled = true, - languages = { 'r', 'python', 'julia' }, - diagnostics = { enabled = true, triggers = { "BufWrite" } }, - completion = { enabled = true } + {'vim-pandoc/vim-pandoc-syntax', ft = writing_ft}, + {'vim-pandoc/vim-pandoc', ft = writing_ft}, + {'vim-pandoc/vim-criticmarkup', ft = writing_ft}, { + 'quarto-dev/quarto-nvim', + dependencies = {'jmbuhr/otter.nvim', 'neovim/nvim-lspconfig'}, + config = function() + require'quarto'.setup { + lspFeatures = { + enabled = true, + languages = {'r', 'python', 'julia'}, + diagnostics = {enabled = true, triggers = {"BufWrite"}}, + completion = {enabled = true} + } } - } - end, - ft = writing_ft -}, { 'micarmst/vim-spellsync', event = "VeryLazy" }, -- personal dict improvements for git sync - { 'folke/zen-mode.nvim', config = true, event = "VeryLazy" }, -- provide distraction free writing - { 'folke/twilight.nvim', event = "VeryLazy" }, -- provide even distraction free-er writing (lowlight paragraphs) - { 'marty-oehme/zettelkasten.nvim', ft = writing_ft, event = "VeryLazy" }, -- simple static markdown linking + end, + ft = writing_ft + }, {'micarmst/vim-spellsync', event = "VeryLazy"}, -- personal dict improvements for git sync + {'folke/zen-mode.nvim', config = true, event = "VeryLazy"}, -- provide distraction free writing + {'folke/twilight.nvim', event = "VeryLazy"}, -- provide even distraction free-er writing (lowlight paragraphs) + {'marty-oehme/zettelkasten.nvim', ft = writing_ft, event = "VeryLazy"}, -- simple static markdown linking { "iamcco/markdown-preview.nvim", -- generate an auto-updating html preview for md files build = function() vim.fn["mkdp#util#install"]() end, ft = writing_ft }, -- languages - { 'euclidianAce/BetterLua.vim', ft = 'lua' }, -- better syntax highlighting for lua - { 'aliou/bats.vim', ft = { "bash", "sh", "zsh", "bats" } }, -- enable syntax for bats shell-code testing library + {'euclidianAce/BetterLua.vim', ft = 'lua'}, -- better syntax highlighting for lua + {'aliou/bats.vim', ft = {"bash", "sh", "zsh", "bats"}}, -- enable syntax for bats shell-code testing library -- REPL work { @@ -108,37 +108,41 @@ return { 'echasnovski/mini.nvim', version = '*', config = function() require('plug._mini') end - }, { - "akinsho/nvim-toggleterm.lua", -- simpler, programmable and multiple terminal toggling for nvim - config = function() require('plug._toggleterm') end, - event = "BufWinEnter" -}, + }, + { + "akinsho/nvim-toggleterm.lua", -- simpler, programmable and multiple terminal toggling for nvim + config = function() require('plug._toggleterm') end, + event = "BufWinEnter" + }, { "folke/which-key.nvim", config = function() require("which-key").setup {} end }, { - "nvim-neorg/neorg", - config = function() require("plug._neorg") end, - dependencies = { "nvim-lua/plenary.nvim" }, - version = "*", - ft = "norg" -}, -- extensive organization plugin mimicking orgmode + "nvim-neorg/neorg", + config = function() require("plug._neorg") end, + dependencies = {"nvim-lua/plenary.nvim"}, + version = "*", + ft = "norg" + }, -- extensive organization plugin mimicking orgmode -- fuzzy matching - { "nvim-telescope/telescope-fzf-native.nvim", build = 'make' }, { - "nvim-telescope/telescope.nvim", - dependencies = { "nvim-lua/popup.nvim", "nvim-lua/plenary.nvim" }, - config = function() require('plug._telescope') end -}, -- treesitter + {"nvim-telescope/telescope-fzf-native.nvim", build = 'make'}, { + "nvim-telescope/telescope.nvim", + dependencies = {"nvim-lua/popup.nvim", "nvim-lua/plenary.nvim"}, + config = function() require('plug._telescope') end + }, -- snippeting + {"hrsh7th/vim-vsnip", event = "InsertEnter"}, -- snippet engine + {"rafamadriz/friendly-snippets", event = "InsertEnter"}, -- many snippets + -- treesitter { 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', config = function() require('plug._treesitter') end - }, { 'nvim-treesitter/playground', cmd = "TSPlaygroundToggle" }, -- interactively view and query the treesitter tree - { 'romgrk/nvim-treesitter-context', event = "BufReadPre", config = true }, -- show current cursor context at top of buffer + }, {'nvim-treesitter/playground', cmd = "TSPlaygroundToggle"}, -- interactively view and query the treesitter tree + {'romgrk/nvim-treesitter-context', event = "BufReadPre", config = true}, -- show current cursor context at top of buffer { 'RRethy/nvim-treesitter-textsubjects', -- allows using . and ; to target treesitter branches config = function() - require 'nvim-treesitter.configs'.setup { + require'nvim-treesitter.configs'.setup { textsubjects = { enable = true, keymaps = { @@ -149,47 +153,49 @@ return { } end, event = "BufReadPre" - }, { 'p00f/nvim-ts-rainbow', event = "BufReadPre" }, -- rainbow brackets using treesitter - { 'JoosepAlviste/nvim-ts-context-commentstring', event = "BufReadPre" }, -- improves commenting plugin above by using ts + }, {'p00f/nvim-ts-rainbow', event = "BufReadPre"}, -- rainbow brackets using treesitter + {'JoosepAlviste/nvim-ts-context-commentstring', event = "BufReadPre"}, -- improves commenting plugin above by using ts { 'lewis6991/spellsitter.nvim', -- uses treesitter to highlight spelling errors config = function() require('spellsitter').setup() end, event = "BufReadPre" }, -- lsp + {'neovim/nvim-lspconfig', event = "VeryLazy"}, -- some common language server configurations { - "VonHeikemen/lsp-zero.nvim", + 'simrat39/symbols-outline.nvim', + config = function() require('symbols-outline').setup() end, + event = "VeryLazy" + }, -- vista-like outline view for code + {'ray-x/lsp_signature.nvim', event = "VeryLazy"}, + {'ray-x/guihua.lua', build = 'cd lua/fzy && make', event = "VeryLazy"}, { + 'ray-x/navigator.lua', + config = function() require('plug._lsp') end, + event = "VeryLazy" + }, -- and completion + { + 'hrsh7th/nvim-cmp', -- simple completion engine built specifically for nvim and lsp dependencies = { - "neovim/nvim-lspconfig", "williamboman/mason.nvim", - "williamboman/mason-lspconfig.nvim", "hrsh7th/nvim-cmp", - "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", - "saadparwaiz1/cmp_luasnip", "hrsh7th/cmp-nvim-lsp", - "hrsh7th/cmp-nvim-lua", "L3MON4D3/LuaSnip", - "rafamadriz/friendly-snippets", "andersevenrud/cmp-tmux", - "hrsh7th/cmp-nvim-lsp", "kdheepak/cmp-latex-symbols", - "ray-x/cmp-treesitter", "f3fora/cmp-spell", "hrsh7th/cmp-cmdline", - "cbarrete/completion-vcard", { - 'aspeddro/cmp-pandoc.nvim', - dependencies = { 'nvim-lua/plenary.nvim', 'jbyuki/nabla.nvim' }, - event = "InsertEnter" - }, { "lukas-reineke/lsp-format.nvim", config = true } + 'onsails/lspkind-nvim', 'andersevenrud/cmp-tmux', -- completion source from adjacent tmux panes + 'hrsh7th/cmp-nvim-lsp', 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-path', + 'hrsh7th/cmp-cmdline', 'hrsh7th/cmp-vsnip', 'hrsh7th/cmp-nvim-lua', + 'kdheepak/cmp-latex-symbols', 'ray-x/cmp-treesitter', + 'f3fora/cmp-spell', 'cbarrete/completion-vcard' }, + event = "VeryLazy", config = function() require('plug._cmp') end - }, { 'simrat39/symbols-outline.nvim', config = true, event = "VeryLazy" }, -- vista-like outline view for code - { 'ray-x/lsp_signature.nvim', event = "VeryLazy" }, - { 'ray-x/guihua.lua', build = 'cd lua/fzy && make', event = "VeryLazy" }, { - 'ray-x/navigator.lua', - config = function() require('plug._lsp') end, - event = "VeryLazy" -}, -- and completion - { + }, { + 'aspeddro/cmp-pandoc.nvim', + dependencies = {'nvim-lua/plenary.nvim', 'jbyuki/nabla.nvim'}, + event = "VeryLazy" + }, { "jghauser/papis.nvim", - after = { "telescope.nvim", "nvim-cmp" }, + after = {"telescope.nvim", "nvim-cmp"}, dependencies = { "kkharji/sqlite.lua", "nvim-lua/plenary.nvim", "MunifTanjim/nui.nvim", "nvim-treesitter/nvim-treesitter" }, - ft = writing_ft, - rocks = { "lyaml" }, - config = true + event = "VeryLazy", + rocks = {"lyaml"}, + config = function() require("papis").setup({}) end } }