-- Aliases local api = vim.api local g, b = vim.g, vim.b local cmd = vim.cmd local highlight = vim.highlight local opt, opt_local = vim.opt, vim.opt_local local go = vim.go local map = vim.api.nvim_set_keymap local fn = vim.fn g['mapleader'] = " " g['syntax'] = true -- Bootstrapping for the package manager 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}) api.nvim_command('packadd packer.nvim') end cmd [[packadd packer.nvim]] -- Plugins require("packer").startup(function() -- Let the package manager manage itself. use { "wbthomason/packer.nvim", opt = true } -- THEMES! use { "chriskempson/base16-vim" } -- EditorConfig plugin use { "editorconfig/editorconfig-vim" } -- Colorize common color strings use { "norcalli/nvim-colorizer.lua", config = function() require"colorizer".setup() end } -- A snippets engine. -- One of the must-haves for me. use { "sirver/ultisnips", -- Contains various snippets for UltiSnips. requires = "honza/vim-snippets" } -- Text editor integration for the browser use {"subnut/nvim-ghost.nvim", run = ":call nvim_ghost#installer#install()"} -- Fuzzy finder of lists use { "nvim-telescope/telescope.nvim", requires = { {"nvim-lua/popup.nvim"}, {"nvim-lua/plenary.nvim"} } } -- A completion engine. -- nvim-cmp is mostly explicit by making the configuration process manual unlike bigger plugins like CoC use { "hrsh7th/nvim-cmp", requires = { "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-nvim-lua", "quangnguyen30192/cmp-nvim-ultisnips", }, config = function() local cmp = require("cmp") local t = function(str) return vim.api.nvim_replace_termcodes(str, true, true, true) end local check_back_space = function() local col = vim.fn.col(".") - 1 return col == 0 or vim.fn.getline("."):sub(col, col):match("%s") ~= nil end cmp.setup({ snippet = { expand = function(args) vim.fn["UltiSnips#Anon"](args.body) end, }, sources = { { name = "ultisnips" }, { name = "buffer" }, { name = "path" }, { name = "nvim_lua" }, { name = "nvim_lsp" }, }, mapping = { [""] = cmp.mapping(function(fallback) if vim.fn.pumvisible() == 1 then if vim.fn["UltiSnips#CanExpandSnippet"]() == 1 then return vim.fn.feedkeys(t("=UltiSnips#ExpandSnippet()")) end vim.fn.feedkeys(t(""), "n") elseif check_back_space() then vim.fn.feedkeys(t(""), "n") else fallback() end end, { "i", "s", }), [""] = cmp.mapping(function(fallback) if vim.fn.complete_info()["selected"] == -1 and vim.fn["UltiSnips#CanExpandSnippet"]() == 1 then vim.fn.feedkeys(t("=UltiSnips#ExpandSnippet()")) elseif vim.fn["UltiSnips#CanJumpForwards"]() == 1 then vim.fn.feedkeys(t(":call UltiSnips#JumpForwards()")) elseif vim.fn.pumvisible() == 1 then vim.fn.feedkeys(t(""), "n") elseif check_back_space() then vim.fn.feedkeys(t(""), "n") else fallback() end end, { "i", "s", }), [""] = cmp.mapping(function(fallback) if vim.fn["UltiSnips#CanJumpBackwards"]() == 1 then return vim.fn.feedkeys(t("=UltiSnips#JumpBackwards()")) elseif vim.fn.pumvisible() == 1 then vim.fn.feedkeys(t(""), "n") else fallback() end end, { "i", "s", }), } }) end } -- A linting engine, a DAP client, and an LSP client entered into a bar. use { "dense-analysis/ale" } use { "neovim/nvim-lspconfig" } use { "mfussenegger/nvim-dap" } -- One of the most popular plugins. -- Allows to create more substantial status bars. use { "vim-airline/vim-airline" } -- Fuzzy finder for finding files freely and fastly. use { "junegunn/fzf", requires = "junegunn/fzf.vim" } -- A full LaTeX toolchain plugin for Vim. -- Also a must-have for me since writing LaTeX can be a PITA. -- Most of the snippets and workflow is inspired from Gilles Castel's posts (at https://castel.dev/). use { "lervag/vimtex", cmd = "ALEEnable", config = function() -- Vimtex configuration g["tex_flavor"] = "latex" g["vimtex_view_method"] = "zathura" g["vimtex_quickfix_mode"] = 0 g["tex_conceal"] = "abdmg" g["vimtex_compiler_latexmk"] = { options = { "-bibtex", "-shell-escape", "-verbose", "-file-line-error", } } -- I use LuaLaTeX for my documents so let me have it as the default, please? g["vimtex_compiler_latexmk_engines"] = { _ = "-lualatex", pdflatex = "-pdf", dvipdfex = "-pdfdvi", lualatex = "-lualatex", xelatex = "-xelatex", } end } -- Enable visuals for addition/deletion of lines in the gutter (side) similar to Visual Studio Code. use { "airblade/vim-gitgutter" } -- Language plugins. use { "LnL7/vim-nix" } use { "vmchale/dhall-vim" } end) -- g['UltiSnipsExpandTrigger'] = "" g['UltiSnipsEditSplit'] = "context" g['UltiSnipsSnippetDirectories'] = {vim.env.HOME .. "/.config/nvim/own-snippets", ".snippets"} local t = function(str) return vim.api.nvim_replace_termcodes(str, true, true, true) end local check_back_space = function() local col = vim.fn.col('.') - 1 if col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then return true else return false end end -- Editor configuration opt.completeopt = "menuone,noselect" opt.termguicolors = true opt.encoding = "utf-8" opt.number = true opt.relativenumber = true opt.cursorline = true opt.expandtab = true opt.shiftwidth = 4 opt.tabstop = 4 opt.conceallevel = 1 opt.list = true opt.listchars = { tab = " ", trail = "ยท" } opt_local.spell = true opt.smartindent = true -- I have yet to solve how to do the following in Lua, lmao cmd "highlight clear SpellBad" cmd "highlight clear SpellLocal" cmd "highlight clear SpellCap" cmd "highlight clear SpellRare" cmd "highlight CursorLineNr ctermfg=cyan" cmd "highlight Visual term=reverse cterm=reverse" -- Keybindings map('i', 'jk', '', {}) map('n', 'hr', 'source $MYVIMRC', {}) map('i', "", "v:lua.tab_complete()", { expr = true }) map('s', "", "v:lua.tab_complete()", { expr = true }) map('i', "", "v:lua.s_tab_complete()", { expr = true }) map('s', "", "v:lua.s_tab_complete()", { expr = true }) map('n', 'ff', 'Telescope find_files', { noremap = true }) map('n', 'fg', 'Telescope grep_string', { noremap = true }) map('n', 'fG', 'Telescope live_grep', { noremap = true }) map('n', 'fb', 'Telescope buffers', { noremap = true }) map('n', 'fh', 'Telescope help_tags', { noremap = true }) -- LSP config local nvim_lsp = require('lspconfig') -- 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) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end -- Enable completion triggered by buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. 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.declaration()', opts) buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts) end local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) -- Enable the following language servers local servers = { 'clangd', 'rust_analyzer', 'pyright', 'tsserver' } for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { on_attach = on_attach, capabilities = capabilities, } end