From a91dfef8f11a7fd7d84947341adbbc908cbe64e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20L=C3=BCdecke?= Date: Mon, 9 Sep 2024 09:50:41 +0200 Subject: [PATCH] First working setup in order to superseede Emacs --- init.lua | 14 +++++ lazy-lock.json | 21 ++++++++ lua/colorscheme.lua | 8 +++ lua/config/nvim-cmp.lua | 79 ++++++++++++++++++++++++++++ lua/keybindings.lua | 18 +++++++ lua/lsp.lua | 91 ++++++++++++++++++++++++++++++++ lua/options.lua | 25 +++++++++ lua/plugins.lua | 112 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 368 insertions(+) create mode 100644 init.lua create mode 100644 lazy-lock.json create mode 100644 lua/colorscheme.lua create mode 100644 lua/config/nvim-cmp.lua create mode 100644 lua/keybindings.lua create mode 100644 lua/lsp.lua create mode 100644 lua/options.lua create mode 100644 lua/plugins.lua diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..778c06b --- /dev/null +++ b/init.lua @@ -0,0 +1,14 @@ +if vim.g.neovide then + -- Put anything you want to happen only in Neovide here + vim.print(vim.g.neovide_version) + vim.g.neovide_cursor_animation_length = 0 + vim.g.neovide_scroll_animation_length = 0 +end + +vim.o.guifont = "Source Code Pro:h14" -- text below applies for VimScript + +require('options') +require('plugins') +require('colorscheme') +require('lsp') +require('keybindings') diff --git a/lazy-lock.json b/lazy-lock.json new file mode 100644 index 0000000..ce1a469 --- /dev/null +++ b/lazy-lock.json @@ -0,0 +1,21 @@ +{ + "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, + "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, + "cmp-cmdline": { "branch": "main", "commit": "d250c63aa13ead745e3a40f61fdd3470efde3923" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "39e2eda76828d88b773cc27a3f61d2ad782c922d" }, + "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, + "fzf-lua": { "branch": "main", "commit": "f39de2d77755e90a7a80989b007f0bf2ca13b0dd" }, + "lazy.nvim": { "branch": "main", "commit": "48b52b5cfcf8f88ed0aff8fde573a5cc20b1306d" }, + "lspkind.nvim": { "branch": "master", "commit": "cff4ae321a91ee3473a92ea1a8c637e3a9510aec" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "482350b050bd413931c2cdd4857443c3da7d57cb" }, + "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, + "neogit": { "branch": "master", "commit": "9bc4ee89bb42be31a2f0b1da41e36e3e6cab9bbb" }, + "nvim-cmp": { "branch": "main", "commit": "ae644feb7b67bf1ce4260c231d1d4300b19c6f30" }, + "nvim-lspconfig": { "branch": "master", "commit": "0ef64599b8aa0187ee5f6d92cb39c951f348f041" }, + "nvim-web-devicons": { "branch": "master", "commit": "9793801f974bba70e4ac5d7eae6c4f5659993d8e" }, + "orgmode": { "branch": "master", "commit": "e3500add486b17da58ce8e42a0f799161e5761c9" }, + "plenary.nvim": { "branch": "master", "commit": "ec289423a1693aeae6cd0d503bac2856af74edaa" }, + "space-vim-theme": { "branch": "master", "commit": "4790dbba31f678f75af4f4c7a1465008542bd979" }, + "which-key.nvim": { "branch": "main", "commit": "bfec3d6bc0a9b0b2cb11644642f78c2c3915eef0" } +} diff --git a/lua/colorscheme.lua b/lua/colorscheme.lua new file mode 100644 index 0000000..8eb140d --- /dev/null +++ b/lua/colorscheme.lua @@ -0,0 +1,8 @@ +-- define your colorscheme here +local colorscheme = 'lunaperche' + +local is_ok, _ = pcall(vim.cmd, "colorscheme " .. colorscheme) +if not is_ok then + vim.notify('colorscheme ' .. colorscheme .. ' not found!') + return +end diff --git a/lua/config/nvim-cmp.lua b/lua/config/nvim-cmp.lua new file mode 100644 index 0000000..6ecd795 --- /dev/null +++ b/lua/config/nvim-cmp.lua @@ -0,0 +1,79 @@ +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 + +local luasnip = require("luasnip") +local cmp = require("cmp") + +cmp.setup({ + snippet = { + -- REQUIRED - you must specify a snippet engine + expand = function(args) + require('luasnip').lsp_expand(args.body) -- For `luasnip` users. + end, + }, + mapping = cmp.mapping.preset.insert({ + -- Use to scroll the docs + [''] = cmp.mapping.scroll_docs( -4), + [''] = cmp.mapping.scroll_docs(4), + -- Use to switch in items + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + -- Use (Enter) to confirm selection + -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [''] = cmp.mapping.confirm({ select = true }), + + -- A super tab + -- sourc: https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#luasnip + [""] = cmp.mapping(function(fallback) + -- Hint: if the completion menu is visible select next one + if cmp.visible() then + cmp.select_next_item() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), -- i - insert mode; s - select mode + [""] = 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" }), + }), + + -- Let's configure the item's appearance + -- source: https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance + formatting = { + -- Set order from left to right + -- kind: single letter indicating the type of completion + -- abbr: abbreviation of "word"; when not empty it is used in the menu instead of "word" + -- menu: extra text for the popup menu, displayed after "word" or "abbr" + fields = { 'abbr', 'menu' }, + + -- customize the appearance of the completion menu + format = function(entry, vim_item) + vim_item.menu = ({ + nvim_lsp = '[Lsp]', + luasnip = '[Luasnip]', + buffer = '[File]', + path = '[Path]', + })[entry.source.name] + return vim_item + end, + }, + + -- Set source precedence + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, -- For nvim-lsp + { name = 'luasnip' }, -- For luasnip user + { name = 'buffer' }, -- For buffer word completion + { name = 'path' }, -- For path completion + }) +}) diff --git a/lua/keybindings.lua b/lua/keybindings.lua new file mode 100644 index 0000000..2a99578 --- /dev/null +++ b/lua/keybindings.lua @@ -0,0 +1,18 @@ +-- vim.keymap.set('i', 'todo', '// TODO.=strftime("%Y-%m-%d") ') + +-- some shortcuts for LSP stuff +vim.keymap.set('n', 'l', ':lua vim.lsp.buf.code_action()') +vim.keymap.set('n', 'F', ':lua vim.lsp.buf.format()') + + +-- Setup fzf-lua keybindings +local fzf = require('fzf-lua') +vim.keymap.set('n', 'ff', fzf.files, {}) +vim.keymap.set('n', 'fs', fzf.lines, {}) +vim.keymap.set('n', 'fg', fzf.live_grep, {}) +vim.keymap.set('n', 'fk', fzf.keymaps, {}) +vim.keymap.set('n', 'fb', fzf.buffers, {}) +vim.keymap.set('n', 'fc', fzf.commands, {}) +vim.keymap.set('n', 'fC', fzf.command_history, {}) +vim.keymap.set('n', 'fm', fzf.manpages, {}) + diff --git a/lua/lsp.lua b/lua/lsp.lua new file mode 100644 index 0000000..253cce3 --- /dev/null +++ b/lua/lsp.lua @@ -0,0 +1,91 @@ +require('mason').setup({ + ui = { + icons = { + package_installed = "✓", + package_pending = "➜", + package_uninstalled = "✗" + } + } +}) + +require('mason-lspconfig').setup({ + -- A list of servers to automatically install if they're not already installed + ensure_installed = { + 'pylsp', + 'lua_ls', + 'rust_analyzer', + 'yamlls', + 'tsserver', + 'gopls', + 'vuels' + }, +}) + + +-- Set different settings for different languages' LSP +-- LSP list: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md +-- How to use setup({}): https://github.com/neovim/nvim-lspconfig/wiki/Understanding-setup-%7B%7D +-- - the settings table is sent to the LSP +-- - on_attach: a lua callback function to run after LSP attaches to a given buffer +local lspconfig = require('lspconfig') + +-- Customized on_attach function +-- See `:help vim.diagnostic.*` for documentation on any of the below functions +local opts = { noremap = true, silent = true } +vim.keymap.set('n', 'e', vim.diagnostic.open_float, opts) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) +vim.keymap.set('n', 'q', vim.diagnostic.setloclist, opts) + +-- Use an on_attach function to only map the following keys +-- after the language server attaches to the current buffer +local on_attach = function(client, bufnr) + -- Enable completion triggered by + vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- See `:help vim.lsp.*` for documentation on any of the below functions + local bufopts = { noremap = true, silent = true, buffer = bufnr } + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) + vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) + vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) + vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) + vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) + vim.keymap.set('n', 'wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, bufopts) + vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) + vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) + vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) + vim.keymap.set("n", "f", function() + vim.lsp.buf.format({ async = true }) + end, bufopts) +end + +-- Configure each language +-- How to add LSP for a specific language? +-- 1. use `:Mason` to install corresponding LSP +-- 2. add configuration below +lspconfig.pylsp.setup({ + on_attach = on_attach, +}) +lspconfig.vuels.setup({ + on_attach = on_attach +}) +lspconfig.rust_analyzer.setup({ + on_attach = on_attach +}) +lspconfig.lua_ls.setup({ + on_attach = on_attach +}) +lspconfig.yamlls.setup({ + on_attach = on_attach +}) +lspconfig.tsserver.setup({ + on_attach = on_attach +}) +lspconfig.gopls.setup({ + on_attach = on_attach +}) diff --git a/lua/options.lua b/lua/options.lua new file mode 100644 index 0000000..0134b08 --- /dev/null +++ b/lua/options.lua @@ -0,0 +1,25 @@ +-- Hint: use `:h