-- -- Plugins -- -- Install lazy if not available local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not (vim.uv or vim.loop).fs_stat(lazypath) then vim.fn.system({"git", "clone", "https://github.com/folke/lazy.nvim.git", lazypath}) end vim.opt.rtp:prepend(lazypath) -- Set up plugins for lazy -- (lazy gets loaded at the bottom of the file) local plugins = { "https://github.com/romainl/vim-cool", "https://github.com/tpope/vim-commentary", "https://github.com/editorconfig/editorconfig-vim", "https://github.com/tpope/vim-fugitive", {"https://github.com/itchyny/lightline.vim", config = function() config_lightline() end, dependencies = {"https://github.com/itchyny/vim-gitbranch"}, }, {"https://github.com/thezeroalpha/vim-lf", config = function() config_lf() end, dependencies = {"https://github.com/moll/vim-bbye"}, }, {"https://github.com/L3MON4D3/LuaSnip", config = function() config_luasnip() end, }, "https://github.com/tpope/vim-surround", "https://github.com/tpope/vim-repeat", "https://github.com/tpope/vim-speeddating", {"https://github.com/nvim-telescope/telescope.nvim", config = function() config_telescope() end, dependencies = {"https://github.com/nvim-lua/plenary.nvim"}, }, {"https://github.com/nvim-treesitter/nvim-treesitter", config = function() config_treesitter() end, build = function() require("nvim-treesitter.install").update({with_sync = true}) end, }, "https://github.com/jdhao/whitespace.nvim", -- Neovim LSP {"https://github.com/neovim/nvim-lspconfig", config = function() config_lspconfig() end, }, {"https://github.com/hrsh7th/nvim-cmp", config = function() config_cmp() end, dependencies = { "https://github.com/hrsh7th/cmp-buffer", "https://github.com/hrsh7th/cmp-cmdline", "https://github.com/hrsh7th/cmp-nvim-lsp", "https://github.com/saadparwaiz1/cmp_luasnip", "https://github.com/hrsh7th/cmp-path", }, }, {"https://github.com/jose-elias-alvarez/null-ls.nvim", config = function() config_null_ls() end, dependencies = {"https://github.com/nvim-lua/plenary.nvim"}, }, } -- -- Basics -- vim.opt.clipboard = "unnamedplus" vim.opt.completeopt = "menu,menuone,noselect" vim.opt.guicursor = "" vim.opt.ignorecase = true vim.opt.inccommand = "nosplit" vim.opt.mouse = "" vim.opt.number = true vim.opt.relativenumber = true vim.opt.shiftwidth = 0 vim.opt.showmode = false vim.opt.smartcase = true vim.opt.tabstop = 4 vim.opt.undofile = true -- Python paths, needed for virtualenvs vim.g.python3_host_prog = "/usr/bin/python3" vim.g.python_host_prog = "/usr/bin/python2" -- -- Colour scheme -- vim.g.colors_name = "vim" vim.opt.background = "light" vim.opt.termguicolors = false local hi = vim.api.nvim_set_hl -- General hi(0, "ColorColumn", {ctermbg=8}) hi(0, "CursorLineNr", {ctermfg=3}) hi(0, "LineNr", {ctermfg=3}) hi(0, "NormalFloat", {ctermbg=8}) hi(0, "Search", {ctermfg=0, ctermbg=3}) hi(0, "Statement", {ctermfg=3}) hi(0, "Visual", {ctermfg=0, ctermbg=3}) -- Completion hi(0, "Pmenu", {ctermfg=5}) hi(0, "PmenuSel", {ctermfg=6, ctermbg=8, cterm={bold=true}}) hi(0, "PmenuSbar", {}) -- Diffs hi(0, "DiffAdd", {ctermfg=6, ctermbg=8, cterm={bold=true,italic=true}}) hi(0, "DiffChange", {}) hi(0, "DiffDelete", {ctermfg=5, ctermbg=8, cterm={bold=true,italic=true}}) hi(0, "DiffText", {ctermfg=6, ctermbg=8, cterm={bold=true,italic=true}}) hi(0, "FoldColumn", {ctermbg=8}) hi(0, "Folded", {ctermbg=8}) hi(0, "SignColumn", {ctermfg=7, ctermbg=0}) -- Spelling hi(0, "SpellBad", {ctermfg=0, ctermbg=1, cterm={underline=true}}) hi(0, "SpellCap", {ctermfg=0, ctermbg=2, cterm={underline=true}}) hi(0, "SpellRare", {ctermfg=0, ctermbg=3, cterm={underline=true}}) hi(0, "SpellLocal", {ctermfg=0, ctermbg=5, cterm={underline=true}}) -- Window splits hi(0, "StatusLine", {ctermfg=5, ctermbg=8}) hi(0, "StatusLineNC", {ctermfg=8, ctermbg=5, cterm={reverse=true}}) hi(0, "WinSeparator", {ctermfg=5, ctermbg=8}) -- Telescope hi(0, "TelescopeNormal", {ctermbg=0}) hi(0, "TelescopeBorder", {ctermbg=0}) -- Neovim LSP hi(0, "DiagnosticError", {ctermfg=0, ctermbg=1, cterm={bold=true}}) hi(0, "DiagnosticInfo", {ctermfg=0, ctermbg=4, cterm={bold=true}}) hi(0, "DiagnosticWarn", {ctermfg=0, ctermbg=3, cterm={bold=true}}) hi(0, "DiagnosticFloatingError", {ctermfg=1, cterm={bold=true}}) hi(0, "DiagnosticFloatingInfo", {ctermfg=4, cterm={bold=true}}) hi(0, "DiagnosticFloatingWarn", {ctermfg=3, cterm={bold=true}}) hi(0, "DiagnosticUnderlineError", {cterm={underline=false}}) hi(0, "DiagnosticUnderlineHint", {cterm={underline=false}}) hi(0, "DiagnosticUnderlineInfo", {cterm={underline=false}}) hi(0, "DiagnosticUnderlineWarn", {cterm={underline=false}}) -- -- Language-specific -- vim.api.nvim_create_autocmd("Filetype", { pattern = { "css", "gitolite", "html", "htmldjango", "javascript", "javascriptreact", "json", "jst", "less", "php", "scss", "typescript", "typescriptreact", "yaml", }, callback = function() vim.bo.expandtab = true vim.bo.tabstop = 2 end }) vim.api.nvim_create_autocmd("Filetype", { pattern = "markdown", callback = function() vim.bo.textwidth = 72 end }) vim.g.html_indent_script1 = "inc" vim.g.html_indent_style1 = "inc" -- -- Key bindings -- vim.g.mapleader = " " -- Move between visual lines when text overflows vim.keymap.set("n", "j", "gj") vim.keymap.set("n", "k", "gk") -- Indent without having to redo your selection vim.keymap.set("x", "<", "", ">gv") -- Tab management vim.keymap.set("n", "o", ":tabnew") vim.keymap.set("n", "c", ":tabclose") vim.keymap.set("n", "j", "gt") vim.keymap.set("n", "k", "gT") -- Formatting vim.keymap.set("n", "f", function() vim.cmd("StripTrailingWhitespace") vim.lsp.buf.format({async=true}) end) vim.keymap.set("n", "F", ":StripTrailingWhitespace") -- lf - file manager vim.keymap.set("n", "", "LfEdit") -- Telescope - fuzzy finder vim.keymap.set("n", "", function() require("telescope.builtin").find_files({}) end) vim.keymap.set("n", "", function() require("telescope.builtin").live_grep({}) end) -- Neovim LSP - completion and diagnostics vim.keymap.set("n", "", function() vim.diagnostic.open_float({focusable=false}) end) vim.keymap.set("n", "", function() vim.lsp.buf.hover() end) vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end) -- Spell check vim.keymap.set("n", "", ":setlocal spell! spelllang=en_gb") vim.keymap.set("n", "", ":setlocal spell! spelllang=pl") -- -- Lightline - statusline -- function config_lightline() vim.g.lightline = { colorscheme = "biual", active = { left = {{"mode"}, {"readonly", "filename", "gitbranch"}, {"modified"}}, right = {{"filetype", "fileencoding"}, {"percent"}} }, component_function = {gitbranch = "gitbranch#name"}, } local ll_theme = {base = {}, normal = {}, tabline = {}} ll_theme.base.norm = {{{"#ad7ac4", 5}, {"#15181e", 0}}} ll_theme.base.sel = {{{"#ad7ac4", 5}, {"#343442", 8}}} ll_theme.normal.left = ll_theme.base.sel ll_theme.normal.middle = ll_theme.base.norm ll_theme.normal.right = ll_theme.base.sel ll_theme.tabline.left = ll_theme.base.norm ll_theme.tabline.middle = ll_theme.base.norm ll_theme.tabline.right = ll_theme.base.norm ll_theme.tabline.tabsel = ll_theme.base.sel vim.g["lightline#colorscheme#biual#palette"] = vim.fn["lightline#colorscheme#flatten"](ll_theme) end -- -- lf - file manager -- function config_lf() -- Replace netrw with lf vim.api.nvim_create_autocmd("BufEnter", { pattern = "*", callback = function() local buf_path = vim.fn.expand("%") if (vim.fn.isdirectory(buf_path) == 1) then vim.cmd("bdelete") vim.fn["lf#LF"](buf_path, "edit", {}) end end }) end -- -- Telescope - fuzzy finder -- function config_telescope() require("telescope").setup({ defaults = { mappings = { i = { [""] = require("telescope.actions").close }, }, } }) end -- -- Tree-sitter - syntax highlighting -- function config_treesitter() require("nvim-treesitter.configs").setup({ ensure_installed = { "c", "cpp", "css", "go", "javascript", "latex", "lua", "markdown", "scss", "tsx", "typescript", "zig", }, highlight = { enable = true, disable = { "markdown", } }, }) end -- -- Neovim LSP - completion and diagnostics -- function config_lspconfig() require("lspconfig").gopls.setup({ on_attach = function(client) client.server_capabilities.documentFormattingProvider = false end }) require("lspconfig").gdscript.setup({}) require("lspconfig").lua_ls.setup({ settings = { Lua = { runtime = {version = "LuaJIT"}, diagnostics = { globals = {"vim"}, disable = {"lowercase-global", "need-check-nil"} }, workspace = { checkThirdParty = false, library = vim.api.nvim_get_runtime_file("", true) } } } }) require("lspconfig").pylsp.setup({}) require("lspconfig").rust_analyzer.setup({}) require("lspconfig").tsserver.setup({}) end function config_null_ls() require("null-ls").setup({ sources = { require("null-ls").builtins.diagnostics.shellcheck, require("null-ls").builtins.formatting.goimports, }, }) end vim.diagnostic.config({ signs = true, underline = true, update_in_insert = false, virtual_text = false, }) -- -- nvim-cmp - autocompletion -- function config_cmp() local cmp = require("cmp") cmp.setup({ snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, preselect = cmp.PreselectMode.None, mapping = { [""] = cmp.mapping(cmp.mapping.select_next_item()), [""] = cmp.mapping(cmp.mapping.select_prev_item()), [""] = cmp.mapping(cmp.mapping.complete()), [""] = cmp.mapping({ i = cmp.mapping.abort(), c = cmp.mapping.close(), }), [""] = cmp.mapping.scroll_docs(-6), [""] = cmp.mapping.scroll_docs(6), [""] = cmp.mapping(function() cmp.confirm({behavior = cmp.ConfirmBehavior.Insert, select = true}) end), }, sources = { {name = "luasnip"}, {name = "nvim_lsp"}, {name = "buffer"}, {name = "path"}, } }) cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(), sources = { {name = "buffer"}, } }) cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ {name = "cmdline"} }) }) end -- -- LuaSnip - snippets -- function load_snippets() require("luasnip.loaders.from_snipmate").lazy_load({paths = {"./snippets"}}) end function config_luasnip() load_snippets() end -- -- lazy - plugin manager -- require("lazy").setup(plugins, { install = {colorscheme = {"vim"}}, })