From aa33b73377dbbf70f7096bb13ed0e73b419f1272 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Wed, 21 Dec 2022 16:29:10 +0100 Subject: [PATCH] refactor of nvim config --- roles/nvim/files/init_pc.lua | 398 +++++++++++++++-------------- roles/nvim/tasks/main.yml | 1 + roles/xmonad/files/xmonad_t460p.hs | 2 + 3 files changed, 206 insertions(+), 195 deletions(-) diff --git a/roles/nvim/files/init_pc.lua b/roles/nvim/files/init_pc.lua index 21e1a95..58ffa10 100644 --- a/roles/nvim/files/init_pc.lua +++ b/roles/nvim/files/init_pc.lua @@ -5,49 +5,54 @@ local unmap = vim.api.nvim_del_keymap local augroup = vim.api.nvim_create_augroup local autocmd = vim.api.nvim_create_autocmd -local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' +local install_path = fn.stdpath('data') .. '/site/pack/packer/start/packer.nvim' if fn.empty(fn.glob(install_path)) > 0 then - fn.system({'git', 'clone', 'https://github.com/wbthomason/packer.nvim', install_path}) + fn.system({ 'git', 'clone', 'https://github.com/wbthomason/packer.nvim', install_path }) vim.cmd 'packadd packer.nvim' end require('packer').startup(function() - use 'wbthomason/packer.nvim' -- Package Manager - use 'nvim-lua/plenary.nvim' -- Lua Library - use 'neovim/nvim-lspconfig' -- Language Server Config + use 'wbthomason/packer.nvim' -- Package Manager + use 'nvim-lua/plenary.nvim' -- Lua Library + use 'neovim/nvim-lspconfig' -- Language Server Config use { - 'hrsh7th/nvim-cmp', -- Completion + 'hrsh7th/nvim-cmp', -- Completion requires = { - 'hrsh7th/cmp-buffer', -- Completion source buffer - 'hrsh7th/cmp-nvim-lsp', -- Completion source LSP - 'hrsh7th/cmp-path', -- Completion source filepaths - 'saadparwaiz1/cmp_luasnip', -- Completion source snippets - 'ray-x/lsp_signature.nvim' -- Signature when typing + 'hrsh7th/cmp-buffer', -- Completion source buffer + 'hrsh7th/cmp-nvim-lsp', -- Completion source LSP + 'hrsh7th/cmp-path', -- Completion source filepaths + 'hrsh7th/cmp-cmdline', -- Completion source for commandline + 'saadparwaiz1/cmp_luasnip', -- Completion source snippets + 'ray-x/lsp_signature.nvim' -- Signature when typing } } - use { 'L3MON4D3/LuaSnip' } -- Snippets + use { 'L3MON4D3/LuaSnip' } -- Snippets use { - 'nvim-treesitter/nvim-treesitter', -- Syntax Highlighting + 'nvim-treesitter/nvim-treesitter', -- Syntax Highlighting run = ':TSUpdate' } - use 'tpope/vim-commentary' -- Commentary - use 'tpope/vim-surround' -- Surrounding - use 'tpope/vim-repeat' -- Repeat Surrounding - use "tversteeg/registers.nvim" -- Preview Registers - use 'windwp/nvim-autopairs' -- Autopairs - use 'windwp/nvim-ts-autotag' -- HTML Autopairs - use 'nvim-telescope/telescope.nvim' -- Fuzzy Finder - use 'tamago324/lir.nvim' -- Filebrowser - use 'jakewvincent/mkdnflow.nvim' -- Notetaking - use 'davidgranstrom/nvim-markdown-preview' -- Markdown Livepreview - use 'xuhdev/vim-latex-live-preview' -- Latex Livepreview - use 'norcalli/nvim-colorizer.lua' -- render Color Codes - use 'aklt/plantuml-syntax' -- Plantuml Syntax, till treesitter supports Plantuml + use 'tpope/vim-commentary' -- Commentary + use 'tpope/vim-surround' -- Surrounding + use 'tpope/vim-repeat' -- Repeat Surrounding + use 'tpope/vim-sleuth' -- Detect Spacing + use "tversteeg/registers.nvim" -- Preview Registers + use 'windwp/nvim-autopairs' -- Autopairs + use 'windwp/nvim-ts-autotag' -- HTML Autopairs + use 'nvim-telescope/telescope.nvim' -- Fuzzy Finder + use 'tamago324/lir.nvim' -- Filebrowser + use 'jakewvincent/mkdnflow.nvim' -- Notetaking + use 'davidgranstrom/nvim-markdown-preview' -- Markdown Livepreview + use 'xuhdev/vim-latex-live-preview' -- Latex Livepreview + use 'norcalli/nvim-colorizer.lua' -- render Color Codes + use 'aklt/plantuml-syntax' -- Plantuml Syntax, till treesitter supports Plantuml use { - 'rust-sailfish/sailfish', -- Sailfish Syntax + 'rust-sailfish/sailfish', -- Sailfish Syntax rtp = 'syntax/vim' } + use 'ggandor/leap.nvim' -- Jump around in file + use 'mfussenegger/nvim-dap' -- Debugger Adapter Protocol + use 'rcarriga/nvim-dap-ui' -- UI for DAP end) -- General Editor Settings @@ -66,11 +71,12 @@ opt.statusline = ' %f %r %m%=%y %{&fileencoding?&fileencoding:&encoding}[%{&file opt.completeopt = 'menuone,noinsert,noselect' -map('n', 'ZT', 'w', { noremap = true }) +map('n', 'w', 'w', { noremap = true }) +map('n', 'q', 'wq', { noremap = true }) map('n', 'ZO', '!compiler %', { noremap = true }) map('n', 'ZK', '!kdeconnect-cli -d 3993d52f1018a472 --share %', { noremap = true }) -map('n', '/', 'let @/ = ""', { noremap = true }) -map('n', 'plp', '!feh %:s?pu?png? &', {noremap = true}) +map('n', '', 'let @/ = ""', { noremap = true }) +map('n', 'plp', '!feh %:s?pu?png? &', { noremap = true }) -- Splits map('n', '', 'h', { noremap = true }) @@ -83,27 +89,14 @@ opt.splitright = true -- Identation with autocmd augroup('programming', {}) - autocmd('FileType', { - group = 'programming', - desc = 'Set identation to two spaces for filetypes in {pattern}', - pattern = { 'lua', 'html', 'css', 'scss', 'sass', 'less', 'htmldjango', 'sailfish', 'typescript', 'typescriptreact', 'javascript', 'javascriptreact', 'haskell' }, - command = 'setlocal ts=2 sw=2 sts=2 expandtab' - }) - autocmd('FileType', { - group = 'programming', - desc = 'Set identation to one tab for filetypes in {pattern}', - pattern = { 'python' }, - command = 'setlocal ts=4 sw=4 sts=4 expandtab' - }) - autocmd({ 'BufNewFile', 'BufRead' }, { - group = 'programming', - desc = 'Set Filetype to sailfish for .stpl files', - pattern = { '*stpl' }, - command = 'setlocal filetype=sailfish' - }) +autocmd({ 'BufNewFile', 'BufRead' }, { + group = 'programming', + desc = 'Set Filetype to sailfish for .stpl files', + pattern = { '*stpl' }, + command = 'setlocal filetype=sailfish' +}) vim.cmd("au BufRead *.yaml,*.yml if search('hosts:\\|tasks:\\|ansible.builtin', 'nw') | set ft=yaml.ansible | endif") - -- Spellcheck _G.enable_spell = function(lang) vim.bo.spelllang = lang @@ -111,11 +104,11 @@ _G.enable_spell = function(lang) if lang ~= "" then vim.wo.spell = true - map('n', 'ff', ']s', { noremap = true}) - map('n', 'fF', '[s', { noremap = true}) - map('n', 'fa', 'zg', { noremap = true}) - map('n', 'fn', 'z=', { noremap = true}) - map('n', 'fd', 'zuw=', { noremap = true}) + map('n', 'ff', ']s', { noremap = true }) + map('n', 'fF', '[s', { noremap = true }) + map('n', 'fa', 'zg', { noremap = true }) + map('n', 'fn', 'z=', { noremap = true }) + map('n', 'fd', 'zuw=', { noremap = true }) print(lang .. " spellcheck enabled") else vim.wo.spell = false @@ -142,7 +135,7 @@ local on_attach = function(client, bufnr) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end -- Mappings. - local opts = { noremap=true, silent=true } + local opts = { noremap = true, silent = true } -- See `:help vim.lsp.*` for documentation on any of the below functions buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) @@ -160,88 +153,74 @@ local on_attach = function(client, bufnr) }, bufnr) end -local runtime_path = vim.split(package.path, ';') -table.insert(runtime_path, "lua/?.lua") -table.insert(runtime_path, "lua/?/init.lua") +local capabilities = require("cmp_nvim_lsp").default_capabilities() + +local servers = { 'rust_analyzer', 'texlab', 'pyright', 'tsserver', 'ccls', 'html', 'yamlls', 'ansiblels', 'csharp_ls', + 'hls' } +for _, server in ipairs(servers) do + lsp[server].setup { + on_attach = on_attach, + capabilities = capabilities, + } +end lsp.sumneko_lua.setup { - cmd = {"lua-language-server"}, on_attach = on_attach, + capabilities = capabilities, settings = { Lua = { runtime = { + -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = 'LuaJIT', - path = runtime_path, }, diagnostics = { - globals = {'vim'}, + -- Get the language server to recognize the `vim` global + globals = { 'vim' }, }, workspace = { + -- Make the server aware of Neovim runtime files library = vim.api.nvim_get_runtime_file("", true), }, + -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false, }, }, - } -} - -lsp.rust_analyzer.setup { - on_attach = on_attach, -} - -lsp.texlab.setup { - on_attach = on_attach, -} - -lsp.pyright.setup { - on_attach = on_attach, -} - -lsp.tsserver.setup{ - on_attach = on_attach, -} - -lsp.ccls.setup { - on_attach = on_attach, -} - -local capabilities = vim.lsp.protocol.make_client_capabilities() -capabilities.textDocument.completion.completionItem.snippetSupport = true - -lsp.cssls.setup { - capabilities = capabilities, - on_attach = on_attach, -} - -lsp.html.setup { - capabilities = capabilities, - on_attach = on_attach, -} - -lsp.yamlls.setup { - capabilities = capabilities, - on_attach = on_attach, -} - -lsp.ansiblels.setup { - capabilities = capabilities, - on_attach = on_attach, -} - -lsp.csharp_ls.setup { - capabilities = capabilities, - on_attach = on_attach, -} - -lsp.hls.setup { - capabilities = capabilities, - on_attach = on_attach, + }, } -- Autopairs -require'nvim-ts-autotag'.setup() -require'nvim-autopairs'.setup{} +require 'nvim-ts-autotag'.setup() +require 'nvim-autopairs'.setup {} + +-- Snippets +local ls = require('luasnip') +local types = require('luasnip.util.types') + +ls.config.set_config({ + history = true, + updateevents = "TextChanged,TextChangedI", + ext_opts = { + [types.choiceNode] = { + active = { + virt_text = { { "●", "Function" } } + } + }, + [types.insertNode] = { + active = { + virt_text = { { "●", "Comment" } } + } + } + }, +}) + +require("luasnip.loaders.from_lua").load({ paths = "~/.config/nvim/lua/snippets" }) + +local has_words_before = function() + unpack = unpack or table.unpack + 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 -- Completion local cmp = require('cmp') @@ -252,8 +231,35 @@ cmp.setup { [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.abort(), - [''] = cmp.mapping.confirm({behavior = cmp.ConfirmBehavior.Insert, select = false }), - [''] = cmp.mapping.confirm({behavior = cmp.ConfirmBehavior.Insert, select = true }) + [''] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = false }), + [''] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = true }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif ls.expand_or_locally_jumpable() then + ls.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif ls.locally_jumpable(-1) then + ls.jump(-1) + else + fallback() + end + end, { "i", "s" }), + [''] = cmp.mapping(function(fallback) + if ls.choice_active() then + ls.change_choice(1) + else + fallback() + end + end, { 'i', 's' }) }, snippet = { expand = function(args) @@ -261,63 +267,29 @@ cmp.setup { end }, sources = { - { name = 'luasnip'}, + { name = 'luasnip' }, { name = 'nvim_lsp' }, { name = 'path' }, { name = 'buffer' }, } } --- Snippets -local ls = require('luasnip') -local types = require('luasnip.util.types') - -ls.config.set_config({ - history = true, - updateevents = "TextChanged,TextChangedI", - ext_opts = { - [types.choiceNode] = { - active = { - virt_text = { { "[C]", "Comment" } }, - }, - }, - [types.insertNode] = { - active = { - virt_text = { { "[I]", "Comment" } }, - }, - }, - }, +cmp.setup.cmdline({ '/', '?' }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' } + } }) --- Helper Termcode wrapper -local to_term = function(str) - return vim.api.nvim_replace_termcodes(str, true, true, true) -end - -_G.next_opt = function() - if ls and ls.expand_or_jumpable() then - return to_term "luasnip-expand-or-jump" - else - return to_term "" - end -end - -_G.prev_opt = function() - if ls and ls.jumpable(-1) then - return to_term "luasnip-jump-prev" - else - return to_term "" - end -end - -map("i", "", "luasnip-next-choice", {}) -map("s", "", "luasnip-next-choice", {}) -map("i", "", "v:lua.next_opt()", {expr = true}) -map("s", "", "v:lua.next_opt()", {expr = true}) -map("i", "", "v:lua.prev_opt()", {expr = true}) -map("s", "", "v:lua.prev_opt()", {expr = true}) - -require("luasnip.loaders.from_lua").load({paths = "~/.config/nvim/lua/snippets"}) +-- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). +cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = 'path' } + }, { + { name = 'cmdline' } + }) +}) -- Treesitter require('nvim-treesitter.configs').setup { @@ -332,10 +304,10 @@ require('nvim-treesitter.configs').setup { } -- Telescope -map('n', 'ff', 'lua require("telescope.builtin").find_files()', {noremap = true}) -map('n', 'fg', 'lua require("telescope.builtin").live_grep()', {noremap = true}) -map('n', 'fb', 'lua require("telescope.builtin").buffers()', {noremap = true}) -map('n', 'fh', 'lua require("telescope.builtin").help_tags()', {noremap = true}) +map('n', 'ff', 'lua require("telescope.builtin").find_files()', { noremap = true }) +map('n', 'fg', 'lua require("telescope.builtin").live_grep()', { noremap = true }) +map('n', 'fb', 'lua require("telescope.builtin").buffers()', { noremap = true }) +map('n', 'fh', 'lua require("telescope.builtin").help_tags()', { noremap = true }) -- Vimwiki require('mkdnflow').setup({ @@ -344,7 +316,7 @@ require('mkdnflow').setup({ folds = false, }, mappings = { - MkdnEnter = { {'i', 'n', 'v'}, ''} + MkdnEnter = { { 'i', 'n', 'v' }, '' } }, links = { transform_explicit = function(text) @@ -360,17 +332,17 @@ autocmd('FileType', { }) vim.wo.conceallevel = 2 vim.keymap.set('n', '', ':edit #', { silent = true }) -map('n', 'wf', 'lua require("telescope_customs").find_wiki()', {noremap = true}) -map('n', 'wg', 'lua require("telescope_customs").grep_wiki()', {noremap = true}) +map('n', 'wf', 'lua require("telescope_customs").find_wiki()', { noremap = true }) +map('n', 'wg', 'lua require("telescope_customs").grep_wiki()', { noremap = true }) -- Markdown Live Preview vim.g.nvim_markdown_preview_format = 'markdown' -map('n', 'mlp', 'MarkdownPreview', {noremap = true}) +map('n', 'mlp', 'MarkdownPreview', { noremap = true }) -- Latex Live Preview vim.g.livepreview_previewer = 'zathura' vim.g.livepreview_use_biber = 1 -map('n', 'llp', 'LLPStartPreview', {noremap = true}) +map('n', 'llp', 'LLPStartPreview', { noremap = true }) -- Lir Filebrowser local actions = require('lir.actions') @@ -383,16 +355,16 @@ require('lir').setup { [''] = actions.vsplit, [''] = actions.tabedit, - ['h'] = actions.up, - ['q'] = actions.quit, + ['h'] = actions.up, + ['q'] = actions.quit, - ['K'] = actions.mkdir, - ['N'] = actions.newfile, - ['R'] = actions.rename, - ['@'] = actions.cd, - ['Y'] = actions.yank_path, - ['.'] = actions.toggle_show_hidden, - ['x'] = actions.delete, + ['K'] = actions.mkdir, + ['N'] = actions.newfile, + ['R'] = actions.rename, + ['@'] = actions.cd, + ['Y'] = actions.yank_path, + ['.'] = actions.toggle_show_hidden, + ['x'] = actions.delete, }, float = { winblend = 0, @@ -418,13 +390,49 @@ vim.g.loaded_netrwPlugin = 1 require('colorizer').setup({ '*'; }, { - RGB = true; -- #RGB hex codes - RRGGBB = true; -- #RRGGBB hex codes - names = false; -- "Name" codes like Blue - RRGGBBAA = true; -- #RRGGBBAA hex codes - rgb_fn = true; -- CSS rgb() and rgba() functions - hsl_fn = true; -- CSS hsl() and hsla() functions - css = false; -- Enable all CSS features: rgb_fn, hsl_fn, names, RGB, RRGGBB - css_fn = false; -- Enable all CSS *functions*: rgb_fn, hsl_fn - mode = 'background'; -- Set the display mode. + RGB = true; -- #RGB hex codes + RRGGBB = true; -- #RRGGBB hex codes + names = false; -- "Name" codes like Blue + RRGGBBAA = true; -- #RRGGBBAA hex codes + rgb_fn = true; -- CSS rgb() and rgba() functions + hsl_fn = true; -- CSS hsl() and hsla() functions + css = false; -- Enable all CSS features: rgb_fn, hsl_fn, names, RGB, RRGGBB + css_fn = false; -- Enable all CSS *functions*: rgb_fn, hsl_fn + mode = 'background'; -- Set the display mode. }) + +-- Leap +require('leap').add_default_mappings() + +-- Debugger Adapter Protocol +local dap = require('dap') + +dap.adapters.codelldb = { + type = 'server', + port = "${port}", + executable = { + command = '/usr/bin/codelldb', + args = { "--port", "${port}" }, + } +} + +dap.configurations.rust = { + { + name = "Launch file", + type = "codelldb", + request = "launch", + program = function() + return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') + end, + cwd = '${workspaceFolder}', + stopOnEntry = false, + }, +} + +map('n', 'dc', 'lua require"dap".continue()', { noremap = true }) +map('n', 'db', 'lua require"dap".toggle_breakpoint()', { noremap = true }) +map('n', 'do', 'lua require"dap".step_over()', { noremap = true }) +map('n', 'di', 'lua require"dap".step_into()', { noremap = true }) + +require("dapui").setup() +map('n', 'dd', 'lua require"dapui".toggle()', { noremap = true }) diff --git a/roles/nvim/tasks/main.yml b/roles/nvim/tasks/main.yml index 9b22b84..bba5c13 100644 --- a/roles/nvim/tasks/main.yml +++ b/roles/nvim/tasks/main.yml @@ -64,3 +64,4 @@ # TODO ansible-language-server AUR # TODO csharp-ls dotnet tool # TODO vscode-langservers-extracted AUR + # TODO codelldb-bin AUR -> C/C++/Rust Debugger diff --git a/roles/xmonad/files/xmonad_t460p.hs b/roles/xmonad/files/xmonad_t460p.hs index ead40c0..b80312d 100644 --- a/roles/xmonad/files/xmonad_t460p.hs +++ b/roles/xmonad/files/xmonad_t460p.hs @@ -80,6 +80,8 @@ topicItems = , TI "InternalVertecApi" "~/projekte/InternalVertecAPI" (switchToLayout "Programming" *> spawn "rider ~/projekte/InternalVertecAPI/InternalVertecAPI.sln") , TI "Abwesenheitskalender_Frontend" "~/projekte/Abwesenheitskalender_Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor) , TI "aoc" "~/projekte/aoc" (switchToLayout "Programming" *> spawnShell *> spawnEditor) + , TI "STracker_Frontend" "~/projekte/SchulungsTracker/Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor) + , TI "STracker_Backend" "~/projekte/SchulungsTracker/Backend" (switchToLayout "Full" *> spawnShellAndExecute "rider ~/projekte/SchulungsTracker/Backend/Schulungstracker.backend.sln") ] myTopicConfig :: TopicConfig