--[[ ===================================================================== ==================== READ THIS BEFORE CONTINUING ==================== ===================================================================== Kickstart.nvim is *not* a distribution. Kickstart.nvim is a template for your own configuration. The goal is that you can read every line of code, top-to-bottom, and understand what your configuration is doing. Once you've done that, you should start exploring, configuring and tinkering to explore Neovim! If you don't know anything about Lua, I recommend taking some time to read through a guide. One possible example: - https://learnxinyminutes.com/docs/lua/ And then you can explore or search through `:help lua-guide` Kickstart Guide: I have left several `:help X` comments throughout the init.lua You should run that command and read that help section for more information. In addition, I have some `NOTE:` items throughout the file. These are for you, the reader to help understand what is happening. Feel free to delete them once you know what you're doing, but they should serve as a guide for when you are first encountering a few different constructs in your nvim config. I hope you enjoy your Neovim journey, - TJ P.S. You can delete this when you're done too. It's your config now :) --]] -- Set as the leader key -- See `:help mapleader` -- NOTE: Must happen before plugins are required (otherwise wrong leader will be used) vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' -- Install package manager -- https://github.com/folke/lazy.nvim -- `:help lazy.nvim.txt` for more info local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' if not vim.loop.fs_stat(lazypath) then vim.fn.system { 'git', 'clone', '--filter=blob:none', 'https://github.com/folke/lazy.nvim.git', '--branch=stable', -- latest stable release lazypath, } end vim.opt.rtp:prepend(lazypath) -- NOTE: Here is where you install your plugins. -- You can configure plugins using the `config` key. -- -- You can also configure plugins after the setup call, -- as they will be available in your neovim runtime. require('lazy').setup({ -- NOTE: First, some plugins that don't require any configuration -- Git related plugins 'tpope/vim-fugitive', 'tpope/vim-rhubarb', -- Detect tabstop and shiftwidth automatically 'tpope/vim-sleuth', -- NOTE: This is where your plugins related to LSP can be installed. -- The configuration is done below. Search for lspconfig to find it below. { -- LSP Configuration & Plugins 'neovim/nvim-lspconfig', dependencies = { -- Automatically install LSPs to stdpath for neovim { 'williamboman/mason.nvim', config = true }, 'williamboman/mason-lspconfig.nvim', -- Useful status updates for LSP -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` { 'j-hui/fidget.nvim', opts = {} }, -- Additional lua configuration, makes nvim stuff amazing! 'folke/neodev.nvim', }, }, { -- Autocompletion 'hrsh7th/nvim-cmp', dependencies = { 'hrsh7th/cmp-nvim-lsp', 'L3MON4D3/LuaSnip', 'saadparwaiz1/cmp_luasnip' }, }, -- Useful plugin to show you pending keybinds. { 'folke/which-key.nvim', opts = {} }, { -- Adds git releated signs to the gutter, as well as utilities for managing changes 'lewis6991/gitsigns.nvim', opts = { -- See `:help gitsigns.txt` signs = { add = { text = '+' }, change = { text = '~' }, delete = { text = '_' }, topdelete = { text = '‾' }, changedelete = { text = '~' }, }, }, }, { -- Theme inspired by Atom 'navarasu/onedark.nvim', priority = 1000, config = function() vim.cmd.colorscheme 'onedark' end, }, { -- Set lualine as statusline 'nvim-lualine/lualine.nvim', -- See `:help lualine.txt` opts = { options = { icons_enabled = false, theme = 'onedark', component_separators = '|', section_separators = '', }, }, }, { -- Add indentation guides even on blank lines 'lukas-reineke/indent-blankline.nvim', -- Enable `lukas-reineke/indent-blankline.nvim` -- See `:help indent_blankline.txt` opts = { char = '┊', show_trailing_blankline_indent = false, }, }, -- "gc" to comment visual regions/lines { 'numToStr/Comment.nvim', opts = {} }, -- Fuzzy Finder (files, lsp, etc) { 'nvim-telescope/telescope.nvim', version = '*', dependencies = { 'nvim-lua/plenary.nvim' } }, -- Fuzzy Finder Algorithm which requires local dependencies to be built. -- Only load if `make` is available. Make sure you have the system -- requirements installed. { 'nvim-telescope/telescope-fzf-native.nvim', -- NOTE: If you are having trouble with this installation, -- refer to the README for telescope-fzf-native for more instructions. build = 'make', cond = function() return vim.fn.executable 'make' == 1 end, }, { -- Highlight, edit, and navigate code 'nvim-treesitter/nvim-treesitter', dependencies = { 'nvim-treesitter/nvim-treesitter-textobjects', }, build = ":TSUpdate", }, -- NOTE: Next Step on Your Neovim Journey: Add/Configure additional "plugins" for kickstart -- These are some example plugins that I've included in the kickstart repository. -- Uncomment any of the lines below to enable them. -- require 'kickstart.plugins.autoformat', -- require 'kickstart.plugins.debug', -- NOTE: The import below automatically adds your own plugins, configuration, etc from `lua/custom/plugins/*.lua` -- You can use this folder to prevent any conflicts with this init.lua if you're interested in keeping -- up-to-date with whatever is in the kickstart repo. -- -- For additional information see: https://github.com/folke/lazy.nvim#-structuring-your-plugins -- -- An additional note is that if you only copied in the `init.lua`, you can just comment this line -- to get rid of the warning telling you that there are not plugins in `lua/custom/plugins/`. { 'towolf/vim-helm' }, { 'nvim-tree/nvim-tree.lua' }, { 'nvim-tree/nvim-web-devicons' }, { 'neovim/nvim-lspconfig' }, { 'jose-elias-alvarez/null-ls.nvim' }, { 'MunifTanjim/prettier.nvim' }, { 'f-person/git-blame.nvim' }, { 'ldelossa/gh.nvim', dependencies = { 'ldelossa/litee.nvim' } }, { 'tpope/vim-abolish' }, { import = 'custom.plugins' }, }, {}) -- [[ Setting options ]] -- See `:help vim.o` -- Set highlight on search vim.o.hlsearch = false -- Make line numbers default vim.wo.number = true -- Enable mouse mode vim.o.mouse = 'a' -- Sync clipboard between OS and Neovim. -- Remove this option if you want your OS clipboard to remain independent. -- See `:help 'clipboard'` vim.o.clipboard = 'unnamedplus' -- Enable break indent vim.o.breakindent = true -- Save undo history vim.o.undofile = true -- Case insensitive searching UNLESS /C or capital in search vim.o.ignorecase = true vim.o.smartcase = true -- Keep signcolumn on by default vim.wo.signcolumn = 'yes' -- Decrease update time vim.o.updatetime = 250 vim.o.timeout = true vim.o.timeoutlen = 300 -- Set completeopt to have a better completion experience vim.o.completeopt = 'menuone,noselect' -- NOTE: You should make sure your terminal supports this vim.o.termguicolors = true -- [[ Basic Keymaps ]] -- Keymaps for better default experience -- See `:help vim.keymap.set()` vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) -- Remap for dealing with word wrap vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) --- Autocommands -- [[ Highlight on yank ]] -- See `:help vim.highlight.on_yank()` local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) vim.api.nvim_create_autocmd('TextYankPost', { callback = function() vim.highlight.on_yank() end, group = highlight_group, pattern = '*', }) -- [[ Configure Telescope ]] -- See `:help telescope` and `:help telescope.setup()` require('telescope').setup { defaults = { mappings = { i = { [''] = false, [''] = false, }, }, }, } -- Enable telescope fzf native, if installed pcall(require('telescope').load_extension, 'fzf') require("telescope").setup { pickers = { live_grep = { additional_args = function(opts) return { "--hidden" } end }, }, } -- See `:help telescope.builtin` vim.keymap.set('n', '?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) vim.keymap.set('n', '', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) vim.keymap.set('n', '/', function() -- You can pass additional configuration to telescope to change theme, layout, etc. require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { winblend = 10, previewer = false, }) end, { desc = '[/] Fuzzily search in current buffer' }) vim.keymap.set('n', 'sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) vim.keymap.set('n', 'sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) vim.keymap.set('n', 'sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) vim.keymap.set('n', 'sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) vim.keymap.set('n', 'sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) -- [[ Configure NvimTree ]] require("nvim-tree").setup() vim.keymap.set('n', 'e', ":NvimTreeToggle", { desc = 'Toggle NvimTree' }) vim.keymap.set('n', 'ef', ':NvimTreeFindFile', { desc = 'Find file' }) vim.keymap.set('n', '', '') vim.keymap.set('n', '', '') vim.keymap.set('n', '', '') vim.keymap.set('n', '', '') -- [[ Configure Treesitter ]] -- See `:help nvim-treesitter` require('nvim-treesitter.configs').setup { -- Add languages to be installed here that you want installed for treesitter ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'tsx', 'typescript', 'vimdoc', 'vim', 'terraform' }, -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) auto_install = false, highlight = { enable = true }, indent = { enable = true, disable = { 'python' } }, incremental_selection = { enable = true, keymaps = { init_selection = '', node_incremental = '', scope_incremental = '', node_decremental = '', }, }, textobjects = { select = { enable = true, lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim keymaps = { -- You can use the capture groups defined in textobjects.scm ['aa'] = '@parameter.outer', ['ia'] = '@parameter.inner', ['af'] = '@function.outer', ['if'] = '@function.inner', ['ac'] = '@class.outer', ['ic'] = '@class.inner', }, }, move = { enable = true, set_jumps = true, -- whether to set jumps in the jumplist goto_next_start = { [']m'] = '@function.outer', [']]'] = '@class.outer', }, goto_next_end = { [']M'] = '@function.outer', [']['] = '@class.outer', }, goto_previous_start = { ['[m'] = '@function.outer', ['[['] = '@class.outer', }, goto_previousqend = { ['[M'] = '@function.outer', ['[]'] = '@class.outer', }, }, swap = { enable = true, swap_next = { ['a'] = '@parameter.inner', }, swap_previous = { ['A'] = '@parameter.inner', }, }, }, } -- Diagnostic keymaps vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = "Go to previous diagnostic message" }) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = "Go to next diagnostic message" }) vim.keymap.set('n', 'e', vim.diagnostic.open_float, { desc = "Open floating diagnostic message" }) vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = "Open diagnostics list" }) -- LSP settings. -- This function gets run when an LSP connects to a particular buffer. local on_attach = function(_, bufnr) -- NOTE: Remember that lua is a real programming language, and as such it is possible -- to define small helper and utility functions so you don't have to repeat yourself -- many times. -- -- In this case, we create a function that lets us more easily define mappings specific -- for LSP related items. It sets the mode, buffer and description for us each time. local nmap = function(keys, func, desc) if desc then desc = 'LSP: ' .. desc end vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) end nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') -- See `:help K` for why this keymap nmap('K', vim.lsp.buf.hover, 'Hover Documentation') nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') -- Lesser used LSP functionality nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') nmap('wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, '[W]orkspace [L]ist Folders') -- Create a command `:Format` local to the LSP buffer vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) vim.lsp.buf.format() end, { desc = 'Format current buffer with LSP' }) end -- Enable the following language servers -- Feel free to add/remove any LSPs that you want here. They will automatically be installed. -- -- Add any additional override configuration in the following tables. They will be passed to -- the `settings` field of the server config. You must look up that documentation yourself. local servers = { -- clangd = {}, -- gopls = {}, -- pyright = {}, -- rust_analyzer = {}, -- tsserver = {}, lua_ls = { Lua = { workspace = { checkThirdParty = false }, telemetry = { enable = false }, }, }, } -- Setup neovim lua configuration require('neodev').setup() -- nvim-cmp supports additional completion capabilities, so broadcast that to servers local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) require 'cmp'.setup { sources = { { name = 'path' } } } -- Ensure the servers above are installed local mason_lspconfig = require 'mason-lspconfig' mason_lspconfig.setup { ensure_installed = vim.tbl_keys(servers), } mason_lspconfig.setup_handlers { function(server_name) require('lspconfig')[server_name].setup { capabilities = capabilities, on_attach = on_attach, settings = servers[server_name], } end, } require 'lspconfig'.terraformls.setup {} vim.api.nvim_create_autocmd({ "BufWritePre" }, { callback = function() vim.lsp.buf.format() end, pattern = { "*.tf", "*.tfvars" }, }) -- Configure nullls local null_ls = require("null-ls") local group = vim.api.nvim_create_augroup("lsp_format_on_save", { clear = false }) local event = "BufWritePre" -- or "BufWritePost" local async = event == "BufWritePost" null_ls.setup({ on_attach = function(client, bufnr) if client.supports_method("textDocument/formatting") then vim.keymap.set("n", "f", function() vim.lsp.buf.format({ bufnr = vim.api.nvim_get_current_buf() }) end, { buffer = bufnr, desc = "[lsp] format" }) -- format on save vim.api.nvim_clear_autocmds({ buffer = bufnr, group = group }) vim.api.nvim_create_autocmd(event, { buffer = bufnr, group = group, callback = function() vim.lsp.buf.format({ bufnr = bufnr, async = async }) end, desc = "[lsp] format on save", }) end if client.supports_method("textDocument/rangeFormatting") then vim.keymap.set("x", "f", function() vim.lsp.buf.format({ bufnr = vim.api.nvim_get_current_buf() }) end, { buffer = bufnr, desc = "[lsp] format" }) end end, }) -- Configure prettier local prettier = require("prettier") prettier.setup({ bin = 'prettier', -- or `'prettierd'` (v0.23.3+) filetypes = { "css", "graphql", "html", "javascript", "javascriptreact", "json", "less", "markdown", "scss", "typescript", "typescriptreact", "yaml", }, }) -- nvim-cmp setup local cmp = require 'cmp' local luasnip = require 'luasnip' luasnip.config.setup {} cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert { [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete {}, [''] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), [''] = 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' }), }, sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, }, } -- Setting up ghvim require('litee.lib').setup() require('litee.gh').setup({ -- deprecated, around for compatability for now. jump_mode = "invoking", -- remap the arrow keys to resize any litee.nvim windows. map_resize_keys = false, -- do not map any keys inside any gh.nvim buffers. disable_keymaps = false, -- the icon set to use. icon_set = "default", -- any custom icons to use. icon_set_custom = nil, -- whether to register the @username and #issue_number omnifunc completion -- in buffers which start with .git/ git_buffer_completion = true, -- defines keymaps in gh.nvim buffers. keymaps = { -- when inside a gh.nvim panel, this key will open a node if it has -- any futher functionality. for example, hitting on a commit node -- will open the commit's changed files in a new gh.nvim panel. open = "", -- when inside a gh.nvim panel, expand a collapsed node expand = "zo", -- when inside a gh.nvim panel, collpased and expanded node collapse = "zc", -- when cursor is over a "#1234" formatted issue or PR, open its details -- and comments in a new tab. goto_issue = "gd", -- show any details about a node, typically, this reveals commit messages -- and submitted review bodys. details = "d", -- inside a convo buffer, submit a comment submit_comment = "", -- inside a convo buffer, when your cursor is ontop of a comment, open -- up a set of actions that can be performed. actions = "", -- inside a thread convo buffer, resolve the thread. resolve_thread = "", -- inside a gh.nvim panel, if possible, open the node's web URL in your -- browser. useful particularily for digging into external failed CI -- checks. goto_web = "gx" } }) local wk = require("which-key") wk.register({ g = { name = "+Git", h = { name = "+Github", c = { name = "+Commits", c = { "GHCloseCommit", "Close" }, e = { "GHExpandCommit", "Expand" }, o = { "GHOpenToCommit", "Open To" }, p = { "GHPopOutCommit", "Pop Out" }, z = { "GHCollapseCommit", "Collapse" }, }, i = { name = "+Issues", p = { "GHPreviewIssue", "Preview" }, }, l = { name = "+Litee", t = { "LTPanel", "Toggle Panel" }, }, r = { name = "+Review", b = { "GHStartReview", "Begin" }, c = { "GHCloseReview", "Close" }, d = { "GHDeleteReview", "Delete" }, e = { "GHExpandReview", "Expand" }, s = { "GHSubmitReview", "Submit" }, z = { "GHCollapseReview", "Collapse" }, }, p = { name = "+Pull Request", c = { "GHClosePR", "Close" }, d = { "GHPRDetails", "Details" }, e = { "GHExpandPR", "Expand" }, o = { "GHOpenPR", "Open" }, p = { "GHPopOutPR", "PopOut" }, r = { "GHRefreshPR", "Refresh" }, t = { "GHOpenToPR", "Open To" }, z = { "GHCollapsePR", "Collapse" }, }, t = { name = "+Threads", c = { "GHCreateThread", "Create" }, n = { "GHNextThread", "Next" }, t = { "GHToggleThread", "Toggle" }, }, }, }, }, { prefix = "" }) local configs = require('lspconfig.configs') local lspconfig = require('lspconfig') local util = require('lspconfig.util') if not configs.helm_ls then configs.helm_ls = { default_config = { cmd = {"helm_ls", "serve"}, filetypes = {'helm'}, root_dir = function(fname) return util.root_pattern('Chart.yaml')(fname) end, }, } end lspconfig.helm_ls.setup { filetypes = {"helm"}, cmd = {"helm_ls", "serve"}, } -- The line beneath this is called `modeline`. See `:help modeline` -- vim: ts=2 sts=2 sw=2 et