-- Leader key (must be set before lazy.nvim loads) vim.g.mapleader = "," -------------------- Options -------------------- vim.opt.number = true vim.opt.cursorline = true vim.opt.expandtab = true vim.opt.tabstop = 4 vim.opt.shiftwidth = 4 vim.opt.softtabstop = 4 vim.opt.autoindent = true vim.opt.spelllang = "vi,en" vim.opt.foldmethod = "syntax" vim.opt.foldlevel = 1 vim.opt.foldnestmax = 1 vim.opt.hlsearch = true vim.opt.splitright = true vim.opt.splitbelow = true vim.opt.termguicolors = true -------------------- Keymaps -------------------- -- Clear hlsearch then enter insert mode vim.keymap.set("n", "i", ":nohlsi", { silent = true }) -- Save with space vim.keymap.set("n", "", ":w", { silent = true }) -- Window navigation vim.keymap.set("n", "", "h") vim.keymap.set("n", "", "j") vim.keymap.set("n", "", "k") vim.keymap.set("n", "", "l") vim.keymap.set("n", "", "h") vim.keymap.set("n", "", "j") vim.keymap.set("n", "", "k") vim.keymap.set("n", "", "l") -- Tab management vim.keymap.set("n", "to", ":tabonly", { silent = true }) vim.keymap.set("n", "o", ":only", { silent = true }) vim.keymap.set("n", "", ":tabn", { silent = true }) vim.keymap.set("n", "", ":tabp", { silent = true }) -- Clipboard operations vim.keymap.set("v", "y", '"+y') vim.keymap.set("n", "Y", '"+yg_') vim.keymap.set("n", "y", '"+y') vim.keymap.set("n", "yy", '"+yy') vim.keymap.set("n", "p", '"+p') vim.keymap.set("n", "P", '"+P') -------------------- Bootstrap lazy.nvim -------------------- local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.uv.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath, }) end vim.opt.rtp:prepend(lazypath) -------------------- Plugins -------------------- require("lazy").setup({ -- Colorscheme { "ellisonleao/gruvbox.nvim", priority = 1000, config = function() require("gruvbox").setup({ contrast = "hard", }) vim.cmd.colorscheme("gruvbox") end, }, -- Icons (dependency for nvim-tree and lualine) { "nvim-tree/nvim-web-devicons", lazy = true }, -- File tree { "nvim-tree/nvim-tree.lua", dependencies = { "nvim-tree/nvim-web-devicons" }, keys = { { "", "NvimTreeToggle", desc = "Toggle file tree" }, }, config = function() require("nvim-tree").setup() end, }, -- Comments { "numToStr/Comment.nvim", event = "VeryLazy", config = function() require("Comment").setup() end, }, -- Fuzzy finder (telescope replaces fzf) { "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim", { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, }, keys = { { "b", "Telescope buffers", desc = "Buffers" }, { "r", "Telescope live_grep", desc = "Live grep" }, { "f", "Telescope find_files", desc = "Find files" }, { "g", "Telescope git_files", desc = "Git files" }, { "w", "Telescope grep_string", desc = "Grep word under cursor" }, }, config = function() require("telescope").setup() require("telescope").load_extension("fzf") end, }, -- Statusline { "nvim-lualine/lualine.nvim", dependencies = { "nvim-tree/nvim-web-devicons" }, config = function() require("lualine").setup({ options = { theme = "gruvbox" }, }) end, }, -- Autopairs { "windwp/nvim-autopairs", event = "InsertEnter", opts = {}, }, -- Surround { "4ree/viml-surround", event = "VeryLazy" }, -- LSP { "neovim/nvim-lspconfig", config = function() vim.lsp.config("clangd", {}) vim.lsp.config("pyright", {}) vim.lsp.config("rust_analyzer", {}) vim.lsp.config("julials", {}) vim.lsp.enable({ "clangd", "pyright", "rust_analyzer", "julials" }) vim.api.nvim_create_autocmd("LspAttach", { callback = function(args) local opts = { buffer = args.buf } vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) vim.keymap.set("n", "gr", vim.lsp.buf.references, opts) vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) vim.keymap.set("n", "rn", vim.lsp.buf.rename, opts) vim.keymap.set("n", "ca", vim.lsp.buf.code_action, opts) end, }) end, }, -- Completion (coq_nvim) { "ms-jpq/coq_nvim", branch = "coq", dependencies = { { "ms-jpq/coq.artifacts", branch = "artifacts" }, { "ms-jpq/coq.thirdparty", branch = "3p" }, }, init = function() vim.g.coq_settings = { auto_start = "shut-up" } end, }, -- Quickfix enhancements { "kevinhwang91/nvim-bqf", ft = "qf" }, -- Git { "tpope/vim-fugitive" }, -- IME support { "4ree/vim-ime", event = "VeryLazy", opts = {}, }, -- LaTeX { "lervag/vimtex", config = function() vim.g.vimtex_view_method = "zathura" vim.g.vimtex_compiler_latexmk = { options = { "-verbose", "-file-line-error", "-synctex=1", "-interaction=nonstopmode", "-shell-escape", "-output-directory=./output", "-aux-directory=./", }, } end, }, -- Julia { "JuliaEditorSupport/julia-vim" }, })