diff --git a/init.lua b/init.lua index ffc00bb3..92996f6c 100644 --- a/init.lua +++ b/init.lua @@ -1,201 +1,168 @@ ---[[ +---------------------------------------------------------------- +-- NOTE: Configurations +---------------------------------------------------------------- -===================================================================== -==================== READ THIS BEFORE CONTINUING ==================== -===================================================================== -======== .-----. ======== -======== .----------------------. | === | ======== -======== |.-""""""""""""""""""-.| |-----| ======== -======== || || | === | ======== -======== || KICKSTART.NVIM || |-----| ======== -======== || || | === | ======== -======== || || |-----| ======== -======== ||:Tutor || |:::::| ======== -======== |'-..................-'| |____o| ======== -======== `"")----------------(""` ___________ ======== -======== /::::::::::| |::::::::::\ \ no mouse \ ======== -======== /:::========| |==hjkl==:::\ \ required \ ======== -======== '""""""""""""' '""""""""""""' '""""""""""' ======== -======== ======== -===================================================================== -===================================================================== - -What is Kickstart? - - Kickstart.nvim is *not* a distribution. - - Kickstart.nvim is a starting point for your own configuration. - The goal is that you can read every line of code, top-to-bottom, understand - what your configuration is doing, and modify it to suit your needs. - - Once you've done that, you can start exploring, configuring and tinkering to - make Neovim your own! That might mean leaving Kickstart just the way it is for a while - or immediately breaking it into modular pieces. It's up to you! - - If you don't know anything about Lua, I recommend taking some time to read through - a guide. One possible example which will only take 10-15 minutes: - - https://learnxinyminutes.com/docs/lua/ini - - After understanding a bit more about Lua, you can use `:help lua-guide` as a - reference for how Neovim integrates Lua. - - :help lua-guide - - (or HTML version): https://neovim.io/doc/user/lua-guide.html - -Kickstart Guide: - - TODO: The very first thing you should do is to run the command `:Tutor` in Neovim. - - If you don't know what this means, type the following: - - - - : - - Tutor - - - - (If you already know the Neovim basics, you can skip this step.) - - Once you've completed that, you can continue working through **AND READING** the rest - of the kickstart init.lua. - - Next, run AND READ `:help`. - This will open up a help window with some basic information - about reading, navigating and searching the builtin help documentation. - - This should be the first place you go to look when you're stuck or confused - with something. It's one of my favorite Neovim features. - - MOST IMPORTANTLY, we provide a keymap "sh" to [s]earch the [h]elp documentation, - which is very useful when you're not exactly sure of what you're looking for. - - I have left several `:help X` comments throughout the init.lua - These are hints about where to find more information about the relevant settings, - plugins or Neovim features used in Kickstart. - - NOTE: Look for lines like this - - Throughout the file. These are for you, the reader, to help you 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 Neovim config. - -If you experience any errors while trying to install kickstart, run `:checkhealth` for more info. - -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 loaded (otherwise wrong leader will be used) -vim.g.mapleader = ' ' -vim.g.maplocalleader = ' ' - --- Set to true if you have a Nerd Font installed and selected in the terminal -vim.g.have_nerd_font = true - --- [[ Setting options ]] --- See `:help vim.opt` --- NOTE: You can change these options as you wish! +-- See `:help vim.opt` -- For more options, you can see `:help option-list` --- Make line numbers default -vim.opt.number = true --- You can also add relative line numbers, to help with jumping. --- Experiment for yourself to see if you like it! --- vim.opt.relativenumber = true +local function config_main() + -- Enable mouse mode, can be useful for resizing splits for example! + vim.opt.mouse = 'a' + -- Don't show the mode, since it's already in the status line + vim.opt.showmode = false + -- Set to true if you have a Nerd Font installed and selected in the terminal + vim.g.have_nerd_font = true --- Enable mouse mode, can be useful for resizing splits for example! -vim.opt.mouse = 'a' + -- Sync clipboard between OS and Neovim. + -- Schedule the setting after `UiEnter` because it can increase startup-time. + -- Remove this option if you want your OS clipboard to remain independent. + -- See `:help 'clipboard'` + vim.schedule(function() + vim.opt.clipboard = 'unnamedplus' + end) --- Don't show the mode, since it's already in the status line -vim.opt.showmode = false + -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term + vim.opt.ignorecase = true + vim.opt.smartcase = true --- Sync clipboard between OS and Neovim. --- Schedule the setting after `UiEnter` because it can increase startup-time. --- Remove this option if you want your OS clipboard to remain independent. --- See `:help 'clipboard'` -vim.schedule(function() - vim.opt.clipboard = 'unnamedplus' -end) + -- Decrease update time + vim.opt.updatetime = 250 --- Enable break indent -vim.opt.breakindent = true + -- Decrease mapped sequence wait time + -- Displays which-key popup sooner + vim.opt.timeoutlen = 300 --- Save undo history -vim.opt.undofile = true + -- Configure how new splits should be opened + vim.opt.splitright = true + vim.opt.splitbelow = true +end --- Case-insensitive searching UNLESS \C or one or more capital letters in the search term -vim.opt.ignorecase = true -vim.opt.smartcase = true +local function config_editor() + -- Make line numbers default + vim.opt.number = true + -- You can also add relative line numbers, to help with jumping. + -- Experiment for yourself to see if you like it! + -- vim.opt.relativenumber = true --- Keep signcolumn on by default -vim.opt.signcolumn = 'yes' + -- Enable break indent + vim.opt.breakindent = true --- Decrease update time -vim.opt.updatetime = 250 + -- Save undo history + vim.opt.undofile = true --- Decrease mapped sequence wait time --- Displays which-key popup sooner -vim.opt.timeoutlen = 300 + -- Keep signcolumn on by default + vim.opt.signcolumn = 'yes' --- Configure how new splits should be opened -vim.opt.splitright = true -vim.opt.splitbelow = true + -- Sets how neovim will display certain whitespace characters in the editor. + -- See `:help 'list'` + -- and `:help 'listchars'` + vim.opt.list = true + vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } --- Sets how neovim will display certain whitespace characters in the editor. --- See `:help 'list'` --- and `:help 'listchars'` -vim.opt.list = true -vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } + -- Preview substitutions live, as you type! + vim.opt.inccommand = 'split' --- Preview substitutions live, as you type! -vim.opt.inccommand = 'split' + -- Show which line your cursor is on + vim.opt.cursorline = true --- Show which line your cursor is on -vim.opt.cursorline = true + -- Minimal number of screen lines to keep above and below the cursor. + vim.opt.scrolloff = 20 --- Minimal number of screen lines to keep above and below the cursor. -vim.opt.scrolloff = 20 + -- vim.opt.fillchars = { fold = ' ' } + -- vim.opt.foldmethod = 'indent' + -- vim.opt.foldenable = false + -- vim.opt.foldlevel = 99 + -- g.markdown_folding = 1 -- enable markdown folding +end --- [[ Basic Keymaps ]] --- See `:help vim.keymap.set()` +local function config_keybinds() + -- See `:help vim.keymap.set()` + -- Set as the leader key (see `:help mapleader`) + -- [note] Must happen before plugins are loaded (otherwise wrong leader will be used) + vim.g.mapleader = ' ' + vim.g.maplocalleader = ' ' --- Clear highlights on search when pressing in normal mode --- See `:help hlsearch` -vim.keymap.set('n', '', 'nohlsearch') + -- Clear highlights on search when pressing in normal mode + -- See `:help hlsearch` + vim.keymap.set('n', '', 'nohlsearch') --- Diagnostic keymaps -vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) + -- Diagnostic keymaps + vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) --- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier --- for people to discover. Otherwise, you normally need to press , which --- is not what someone will guess without a bit more experience. --- --- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping --- or just use to exit terminal mode -vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) + -- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier + -- for people to discover. Otherwise, you normally need to press , which + -- is not what someone will guess without a bit more experience. + -- + -- [note] This won't work in all terminal emulators/tmux/etc. Try your own mapping + -- or just use to exit terminal mode + vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) --- TIP: Disable arrow keys in normal mode --- vim.keymap.set('n', '', 'echo "Use h to move!!"') --- vim.keymap.set('n', '', 'echo "Use l to move!!"') --- vim.keymap.set('n', '', 'echo "Use k to move!!"') --- vim.keymap.set('n', '', 'echo "Use j to move!!"') + -- TIP: Disable arrow keys in normal mode + -- vim.keymap.set('n', '', 'echo "Use h to move!!"') + -- vim.keymap.set('n', '', 'echo "Use l to move!!"') + -- vim.keymap.set('n', '', 'echo "Use k to move!!"') + -- vim.keymap.set('n', '', 'echo "Use j to move!!"') --- Keybinds to make split navigation easier. --- Use CTRL+ to switch between windows --- --- See `:help wincmd` for a list of all window commands -vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) -vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) -vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) -vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) + -- Keybinds to make split navigation easier. + -- Use CTRL+ to switch between windows + -- + -- See `:help wincmd` for a list of all window commands + vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) + vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) + vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) + vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) + + -- Allow clipboard copy paste in neovim + vim.api.nvim_set_keymap('', '', '+p', { noremap = true, silent = true }) + vim.api.nvim_set_keymap('!', '', '+', { noremap = true, silent = true }) + vim.api.nvim_set_keymap('t', '', '+', { noremap = true, silent = true }) + vim.api.nvim_set_keymap('v', '', '+', { noremap = true, silent = true }) + + -- Execute Lua + vim.keymap.set('n', 'x', 'source %') + vim.keymap.set('n', 'x', ':.lua') + vim.keymap.set('v', 'x', ':lua') +end + +config_main() +config_editor() +config_keybinds() + +---------------------------------------------------------------- +-- NOTE: GUI - Neovide +---------------------------------------------------------------- + +-- See: https://neovide.dev/configuration.html + +if vim.g.neovide then + -- vim.o.guifont = 'CommitMono Nerd Font:h14.5' + vim.g.neovide_scale_factor = 1.0 + vim.opt.linespace = 6 + + vim.g.neovide_position_animation_length = 0.30 + vim.g.neovide_scroll_animation_length = 0.0 + + vim.g.neovide_remember_window_size = true + + vim.g.neovide_cursor_animation_length = 0.07 + vim.g.neovide_cursor_trail_size = 0.2 + + -- : `D` is the CMD key + vim.keymap.set('n', '', ':w') -- Save + vim.keymap.set('v', '', '"+y') -- Copy + vim.keymap.set('n', '', '"+P') -- Paste normal mode + vim.keymap.set('v', '', '"+P') -- Paste visual mode + vim.keymap.set('c', '', '+') -- Paste command mode + vim.keymap.set('i', '', 'l"+Pli') -- Paste insert mode +end + +---------------------------------------------------------------- +-- NOTE: Autcommands +---------------------------------------------------------------- --- [[ Basic Autocommands ]] -- See `:help lua-guide-autocommands` --- Highlight when yanking (copying) text --- Try it with `yap` in normal mode --- See `:help vim.highlight.on_yank()` +-- Highlight when yanking (copying) text, see `:help vim.highlight.on_yank()` vim.api.nvim_create_autocmd('TextYankPost', { desc = 'Highlight when yanking (copying) text', group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }), @@ -204,22 +171,15 @@ vim.api.nvim_create_autocmd('TextYankPost', { end, }) --- WARN: My Configuration +---------------------------------------------------------------- +-- NOTE: Plugins +---------------------------------------------------------------- --- vim.opt.fillchars = { fold = ' ' } --- vim.opt.foldmethod = 'indent' --- vim.opt.foldenable = false --- vim.opt.foldlevel = 99 --- g.markdown_folding = 1 -- enable markdown folding +-- Manager (lazy.nvim) +-- 1. `:Lazy` to check status of plugins, press `?` for help in the menu and `:q` to close +-- 2. `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info +-- 3. `:Lazy update` to update plugins -vim.keymap.set('n', 'x', 'source %') -vim.keymap.set('n', 'x', ':.lua') -vim.keymap.set('v', 'x', ':lua') - --- WARN: My Configuration - --- [[ Install `lazy.nvim` plugin manager ]] --- See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = 'https://github.com/folke/lazy.nvim.git' @@ -230,194 +190,31 @@ if not (vim.uv or vim.loop).fs_stat(lazypath) then end ---@diagnostic disable-next-line: undefined-field vim.opt.rtp:prepend(lazypath) --- [[ Configure and install plugins ]] --- --- To check the current status of your plugins, run --- :Lazy --- --- You can press `?` in this menu for help. Use `:q` to close the window --- --- To update plugins you can run --- :Lazy update --- --- NOTE: Here is where you install your plugins. +-- Plugins List + require('lazy').setup({ - -- NOTE: Plugins can be added with a link (or for a github repo: 'owner/repo' link). - 'tpope/vim-sleuth', -- Detect tabstop and shiftwidth automatically - -- NOTE: Plugins can also be added by using a table, - -- with the first argument being the link and the following - -- keys can be used to configure plugin behavior/loading/etc. - -- - -- Use `opts = {}` to force a plugin to be loaded. - -- + ---------------------------- + --> Neovim + ---------------------------- - -- Here is a more advanced example where we pass configuration - -- options to `gitsigns.nvim`. This is equivalent to the following Lua: - -- require('gitsigns').setup({ ... }) - -- - -- See `:help gitsigns` to understand what the configuration keys do - { -- Adds git related signs to the gutter, as well as utilities for managing changes - 'lewis6991/gitsigns.nvim', - opts = { - signs = { - add = { text = '┃' }, - change = { text = '┃' }, - delete = { text = '_' }, - topdelete = { text = '‾' }, - changedelete = { text = '~' }, - untracked = { text = '┆' }, - }, - signs_staged = { - add = { text = '┃' }, - change = { text = '┃' }, - delete = { text = '_' }, - topdelete = { text = '‾' }, - changedelete = { text = '~' }, - untracked = { text = '┆' }, - }, - signs_staged_enable = true, - on_attach = function(bufnr) - local gitsigns = require 'gitsigns' + -- Appearance: Theme + { + 'folke/tokyonight.nvim', + priority = 1000, -- Make sure to load this before all the other start plugins. + init = function() + -- Load the colorscheme here. + -- Like many other themes, this one has different styles, and you could load + -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. + vim.cmd.colorscheme 'tokyonight-night' - local function map(mode, l, r, opts) - opts = opts or {} - opts.buffer = bufnr - vim.keymap.set(mode, l, r, opts) - end - - -- Navigation - map('n', ']c', function() - if vim.wo.diff then - vim.cmd.normal { ']c', bang = true } - else - gitsigns.nav_hunk 'next' - end - end) - - map('n', '[c', function() - if vim.wo.diff then - vim.cmd.normal { '[c', bang = true } - else - gitsigns.nav_hunk 'prev' - end - end) - - -- Keybinds - map('n', 'hp', gitsigns.preview_hunk) - - vim.cmd [[ - highlight GitSignsAdd guifg=green guibg=NONE - highlight GitSignsChange guifg=darkyellow guibg=NONE - highlight GitSignsDelete guifg=red guibg=NONE - ]] - - --[[ - -- Actions - map('n', 'hs', gitsigns.stage_hunk) - map('n', 'hr', gitsigns.reset_hunk) - map('v', 'hs', function() - gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } - end) - map('v', 'hr', function() - gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } - end) - map('n', 'hS', gitsigns.stage_buffer) - map('n', 'hu', gitsigns.undo_stage_hunk) - map('n', 'hR', gitsigns.reset_buffer) - map('n', 'hb', function() - gitsigns.blame_line { full = true } - end) - map('n', 'tb', gitsigns.toggle_current_line_blame) - map('n', 'hd', gitsigns.diffthis) - map('n', 'hD', function() - gitsigns.diffthis '~' - end) - map('n', 'td', gitsigns.toggle_deleted) - - -- Text object - map({ 'o', 'x' }, 'ih', ':Gitsigns select_hunk') - --]] - end, - }, + -- You can configure highlights by doing something like: + vim.cmd.hi 'Comment gui=none' + end, }, - -- NOTE: Plugins can also be configured to run Lua code when they are loaded. - -- - -- This is often very useful to both group configuration, as well as handle - -- lazy loading plugins that don't need to be loaded immediately at startup. - -- - -- For example, in the following configuration, we use: - -- event = 'VimEnter' - -- - -- which loads which-key before all the UI elements are loaded. Events can be - -- normal autocommands events (`:help autocmd-events`). - -- - -- Then, because we use the `opts` key (recommended), the configuration runs - -- after the plugin has been loaded as `require(MODULE).setup(opts)`. - - { -- Useful plugin to show you pending keybinds. - 'folke/which-key.nvim', - event = 'VimEnter', -- Sets the loading event to 'VimEnter' - opts = { - icons = { - -- set icon mappings to true if you have a Nerd Font - mappings = vim.g.have_nerd_font, - -- If you are using a Nerd Font: set icons.keys to an empty table which will use the - -- default which-key.nvim defined Nerd Font icons, otherwise define a string table - keys = vim.g.have_nerd_font and {} or { - Up = ' ', - Down = ' ', - Left = ' ', - Right = ' ', - C = ' ', - M = ' ', - D = ' ', - S = ' ', - CR = ' ', - Esc = ' ', - ScrollWheelDown = ' ', - ScrollWheelUp = ' ', - NL = ' ', - BS = ' ', - Space = ' ', - Tab = ' ', - F1 = '', - F2 = '', - F3 = '', - F4 = '', - F5 = '', - F6 = '', - F7 = '', - F8 = '', - F9 = '', - F10 = '', - F11 = '', - F12 = '', - }, - }, - - -- Document existing key chains - spec = { - { 'c', group = '[C]ode', mode = { 'n', 'x' } }, - { 'd', group = '[D]ocument' }, - { 'r', group = '[R]ename' }, - { 's', group = '[S]earch' }, - { 'w', group = '[W]orkspace' }, - { 't', group = '[T]oggle' }, - { 'h', group = 'Git [H]unk', mode = { 'n', 'v' } }, - }, - }, - }, - - -- NOTE: Plugins can specify dependencies. - -- - -- The dependencies are proper plugin specifications as well - anything - -- you do for a plugin at the top level, you can do for a dependency. - -- - -- Use the `dependencies` key to specify the dependencies of a particular plugin - - { -- Fuzzy Finder (files, lsp, etc) + -- Telescope: Fuzzy Finder (files, lsp, etc) + { 'nvim-telescope/telescope.nvim', event = 'VimEnter', branch = '0.1.x', @@ -522,10 +319,239 @@ require('lazy').setup({ end, }, - -- LSP Plugins + -- Whichkey: Show pending keybinds + { + 'folke/which-key.nvim', + event = 'VimEnter', -- Sets the loading event to 'VimEnter' + opts = { + icons = { + -- set icon mappings to true if you have a Nerd Font + mappings = vim.g.have_nerd_font, + -- If you are using a Nerd Font: set icons.keys to an empty table which will use the + -- default which-key.nvim defined Nerd Font icons, otherwise define a string table + keys = vim.g.have_nerd_font and {} or { + Up = ' ', + Down = ' ', + Left = ' ', + Right = ' ', + C = ' ', + M = ' ', + D = ' ', + S = ' ', + CR = ' ', + Esc = ' ', + ScrollWheelDown = ' ', + ScrollWheelUp = ' ', + NL = ' ', + BS = ' ', + Space = ' ', + Tab = ' ', + F1 = '', + F2 = '', + F3 = '', + F4 = '', + F5 = '', + F6 = '', + F7 = '', + F8 = '', + F9 = '', + F10 = '', + F11 = '', + F12 = '', + }, + }, + + -- Document existing key chains + spec = { + { 'c', group = '[C]ode', mode = { 'n', 'x' } }, + { 'd', group = '[D]ocument' }, + { 'r', group = '[R]ename' }, + { 's', group = '[S]earch' }, + { 'w', group = '[W]orkspace' }, + { 't', group = '[T]oggle' }, + { 'h', group = 'Git [H]unk', mode = { 'n', 'v' } }, + }, + }, + }, + + -- Mini: Collection of various small independent plugins/modules + { + 'echasnovski/mini.nvim', + config = function() + -- Better Around/Inside textobjects + -- + -- Examples: + -- - va) - [V]isually select [A]round [)]paren + -- - yinq - [Y]ank [I]nside [N]ext [Q]uote + -- - ci' - [C]hange [I]nside [']quote + require('mini.ai').setup { n_lines = 500 } + + -- Add/delete/replace surroundings (brackets, quotes, etc.) + -- + -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren + -- - sd' - [S]urround [D]elete [']quotes + -- - sr)' - [S]urround [R]eplace [)] ['] + require('mini.surround').setup() + + -- Simple and easy statusline. + -- You could remove this setup call if you don't like it, + -- and try some other statusline plugin + local statusline = require 'mini.statusline' + -- set use_icons to true if you have a Nerd Font + statusline.setup { use_icons = vim.g.have_nerd_font } + + -- You can configure sections in the statusline by overriding their + -- default behavior. For example, here we set the section for + -- cursor location to LINE:COLUMN + ---@diagnostic disable-next-line: duplicate-set-field + statusline.section_location = function() + return '%2l:%-2v' + end + + -- ... and there is more! + -- Check out: https://github.com/echasnovski/mini.nvim + end, + }, + + ---------------------------- + --> Layout + ---------------------------- + + ---------------------------- + --> [Editor] General + ---------------------------- + + -- Detect tabstop and shiftwidth automatically + 'tpope/vim-sleuth', + + -- Comment highlighting + { + 'folke/todo-comments.nvim', + event = 'VimEnter', + dependencies = { 'nvim-lua/plenary.nvim' }, + opts = { signs = false }, + }, + + -- Formatting + { + 'stevearc/conform.nvim', + event = { 'BufWritePre' }, + cmd = { 'ConformInfo' }, + keys = { + { + 'f', + function() + require('conform').format { async = true, lsp_format = 'fallback' } + end, + mode = '', + desc = '[F]ormat buffer', + }, + }, + opts = { + notify_on_error = false, + format_on_save = function(bufnr) + -- Disable "format_on_save lsp_fallback" for languages that don't + -- have a well standardized coding style. You can add additional + -- languages here or re-enable it for the disabled ones. + local disable_filetypes = { c = true, cpp = true } + local lsp_format_opt + if disable_filetypes[vim.bo[bufnr].filetype] then + lsp_format_opt = 'never' + else + lsp_format_opt = 'fallback' + end + return { + timeout_ms = 500, + lsp_format = lsp_format_opt, + } + end, + formatters_by_ft = { + lua = { 'stylua' }, + -- Conform can also run multiple formatters sequentially + -- python = { "isort", "black" }, + -- + -- You can use 'stop_after_first' to run the first available formatter from the list + -- javascript = { "prettierd", "prettier", stop_after_first = true }, + }, + }, + }, + + ---------------------------- + --> [Editor] Languages & Syntax (treesitter, folding, etc..) + ---------------------------- + + -- Treesitter + { + 'nvim-treesitter/nvim-treesitter', + build = ':TSUpdate', + main = 'nvim-treesitter.configs', -- Sets main module to use for opts + -- [[ Configure Treesitter ]] See `:help nvim-treesitter` + opts = { + ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }, + -- Autoinstall languages that are not installed + auto_install = true, + highlight = { + enable = true, + -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. + -- If you are experiencing weird indenting issues, add the language to + -- the list of additional_vim_regex_highlighting and disabled languages for indent. + additional_vim_regex_highlighting = { 'ruby' }, + }, + indent = { enable = true, disable = { 'ruby' } }, + }, + -- There are additional nvim-treesitter modules that you can use to interact + -- with nvim-treesitter. You should go explore a few and see what interests you: + -- + -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` + -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context + -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects + }, + + -- UFO: Folding + { + 'kevinhwang91/nvim-ufo', + dependencies = { + 'kevinhwang91/promise-async', + 'nvim-treesitter/nvim-treesitter', + }, + config = function() + -- Enable fold column + vim.o.foldcolumn = '1' + -- Set fold level to 99 (effectively expanding all folds) + vim.o.foldlevel = 99 + -- Start with all folds expanded + vim.o.foldlevelstart = 99 + -- Use nvim-ufo provider + vim.o.foldenable = true + + -- Using ufo provider need remap `zR` and `zM` + vim.keymap.set('n', 'zR', require('ufo').openAllFolds) + vim.keymap.set('n', 'zM', require('ufo').closeAllFolds) + vim.keymap.set('n', 'zm', require('ufo').closeFoldsWith) -- closeAllFolds == closeFoldsWith(0) + vim.keymap.set('n', 'K', function() + local winid = require('ufo').peekFoldedLinesUnderCursor() + if not winid then + -- choose one of coc.nvim and nvim lsp + vim.fn.CocActionAsync 'definitionHover' -- coc.nvim + vim.lsp.buf.hover() + end + end) + + -- Configure UFO + require('ufo').setup { + provider_selector = function(bufnr, filetype, buftype) + return { 'treesitter', 'indent' } + end, + } + end, + }, + + ---------------------------- + --> [Editor] LSP & Completion + ---------------------------- + + -- LSP: Neovim APIs { - -- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins - -- used for completion, annotations and signatures of Neovim apis 'folke/lazydev.nvim', ft = 'lua', opts = { @@ -536,17 +562,18 @@ require('lazy').setup({ }, }, { 'Bilal2453/luvit-meta', lazy = true }, + + -- LSP: Automatically install LSPs and related tools to stdpath for Neovim { - -- Main LSP Configuration 'neovim/nvim-lspconfig', dependencies = { - -- Automatically install LSPs and related tools to stdpath for Neovim - { 'williamboman/mason.nvim', config = true }, -- NOTE: Must be loaded before dependants + -- [note] Mason must be loaded before dependants + { 'williamboman/mason.nvim', config = true }, 'williamboman/mason-lspconfig.nvim', 'WhoIsSethDaniel/mason-tool-installer.nvim', -- Useful status updates for LSP. - -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` + -- [note] `opts = {}` is the same as calling `require('fidget').setup({})` { 'j-hui/fidget.nvim', opts = {} }, -- Allows extra capabilities provided by nvim-cmp @@ -760,50 +787,8 @@ require('lazy').setup({ end, }, - { -- Autoformat - 'stevearc/conform.nvim', - event = { 'BufWritePre' }, - cmd = { 'ConformInfo' }, - keys = { - { - 'f', - function() - require('conform').format { async = true, lsp_format = 'fallback' } - end, - mode = '', - desc = '[F]ormat buffer', - }, - }, - opts = { - notify_on_error = false, - format_on_save = function(bufnr) - -- Disable "format_on_save lsp_fallback" for languages that don't - -- have a well standardized coding style. You can add additional - -- languages here or re-enable it for the disabled ones. - local disable_filetypes = { c = true, cpp = true } - local lsp_format_opt - if disable_filetypes[vim.bo[bufnr].filetype] then - lsp_format_opt = 'never' - else - lsp_format_opt = 'fallback' - end - return { - timeout_ms = 500, - lsp_format = lsp_format_opt, - } - end, - formatters_by_ft = { - lua = { 'stylua' }, - -- Conform can also run multiple formatters sequentially - -- python = { "isort", "black" }, - -- - -- You can use 'stop_after_first' to run the first available formatter from the list - -- javascript = { "prettierd", "prettier", stop_after_first = true }, - }, - }, - }, - - { -- Autocompletion + -- Autocompletion + { 'hrsh7th/nvim-cmp', event = 'InsertEnter', dependencies = { @@ -919,116 +904,118 @@ require('lazy').setup({ end, }, - { -- You can easily change to a different colorscheme. - -- Change the name of the colorscheme plugin below, and then - -- change the command in the config to whatever the name of that colorscheme is. - -- - -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. - 'folke/tokyonight.nvim', - priority = 1000, -- Make sure to load this before all the other start plugins. - init = function() - -- Load the colorscheme here. - -- Like many other themes, this one has different styles, and you could load - -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. - vim.cmd.colorscheme 'tokyonight-night' + ---------------------------- + --> Tools (Git) + ---------------------------- - -- You can configure highlights by doing something like: - vim.cmd.hi 'Comment gui=none' - end, - }, - - -- Highlight todo, notes, etc in comments - { 'folke/todo-comments.nvim', event = 'VimEnter', dependencies = { 'nvim-lua/plenary.nvim' }, opts = { signs = false } }, - - { -- Collection of various small independent plugins/modules - 'echasnovski/mini.nvim', - config = function() - -- Better Around/Inside textobjects - -- - -- Examples: - -- - va) - [V]isually select [A]round [)]paren - -- - yinq - [Y]ank [I]nside [N]ext [Q]uote - -- - ci' - [C]hange [I]nside [']quote - require('mini.ai').setup { n_lines = 500 } - - -- Add/delete/replace surroundings (brackets, quotes, etc.) - -- - -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren - -- - sd' - [S]urround [D]elete [']quotes - -- - sr)' - [S]urround [R]eplace [)] ['] - require('mini.surround').setup() - - -- Simple and easy statusline. - -- You could remove this setup call if you don't like it, - -- and try some other statusline plugin - local statusline = require 'mini.statusline' - -- set use_icons to true if you have a Nerd Font - statusline.setup { use_icons = vim.g.have_nerd_font } - - -- You can configure sections in the statusline by overriding their - -- default behavior. For example, here we set the section for - -- cursor location to LINE:COLUMN - ---@diagnostic disable-next-line: duplicate-set-field - statusline.section_location = function() - return '%2l:%-2v' - end - - -- ... and there is more! - -- Check out: https://github.com/echasnovski/mini.nvim - end, - }, - { -- Highlight, edit, and navigate code - 'nvim-treesitter/nvim-treesitter', - build = ':TSUpdate', - main = 'nvim-treesitter.configs', -- Sets main module to use for opts - -- [[ Configure Treesitter ]] See `:help nvim-treesitter` + -- Gitsigns: Adds git signs to the gutter and utilities for managing changes + { + 'lewis6991/gitsigns.nvim', opts = { - ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }, - -- Autoinstall languages that are not installed - auto_install = true, - highlight = { - enable = true, - -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. - -- If you are experiencing weird indenting issues, add the language to - -- the list of additional_vim_regex_highlighting and disabled languages for indent. - additional_vim_regex_highlighting = { 'ruby' }, + signs = { + add = { text = '┃' }, + change = { text = '┃' }, + delete = { text = '_' }, + topdelete = { text = '‾' }, + changedelete = { text = '~' }, + untracked = { text = '┆' }, }, - indent = { enable = true, disable = { 'ruby' } }, + signs_staged = { + add = { text = '┃' }, + change = { text = '┃' }, + delete = { text = '_' }, + topdelete = { text = '‾' }, + changedelete = { text = '~' }, + untracked = { text = '┆' }, + }, + signs_staged_enable = true, + on_attach = function(bufnr) + local gitsigns = require 'gitsigns' + + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map('n', ']c', function() + if vim.wo.diff then + vim.cmd.normal { ']c', bang = true } + else + gitsigns.nav_hunk 'next' + end + end) + + map('n', '[c', function() + if vim.wo.diff then + vim.cmd.normal { '[c', bang = true } + else + gitsigns.nav_hunk 'prev' + end + end) + + -- Keybinds + map('n', 'hp', gitsigns.preview_hunk) + + vim.cmd [[ + highlight GitSignsAdd guifg=green guibg=NONE + highlight GitSignsChange guifg=darkyellow guibg=NONE + highlight GitSignsDelete guifg=red guibg=NONE + ]] + + --[[ + -- Actions + map('n', 'hs', gitsigns.stage_hunk) + map('n', 'hr', gitsigns.reset_hunk) + map('v', 'hs', function() + gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } + end) + map('v', 'hr', function() + gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } + end) + map('n', 'hS', gitsigns.stage_buffer) + map('n', 'hu', gitsigns.undo_stage_hunk) + map('n', 'hR', gitsigns.reset_buffer) + map('n', 'hb', function() + gitsigns.blame_line { full = true } + end) + map('n', 'tb', gitsigns.toggle_current_line_blame) + map('n', 'hd', gitsigns.diffthis) + map('n', 'hD', function() + gitsigns.diffthis '~' + end) + map('n', 'td', gitsigns.toggle_deleted) + + -- Text object + map({ 'o', 'x' }, 'ih', ':Gitsigns select_hunk') + --]] + end, }, - -- There are additional nvim-treesitter modules that you can use to interact - -- with nvim-treesitter. You should go explore a few and see what interests you: - -- - -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` - -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context - -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects }, - -- The following comments only work if you have downloaded the kickstart repo, not just copy pasted the - -- init.lua. If you want these files, they are in the repository, so you can just download them and - -- place them in the correct locations. + ---------------------------- + --> Notes + ---------------------------- + -- + -- Useful plugin configs including in the Kickstart repo + -- require 'kickstart.plugins.debug', + -- require 'kickstart.plugins.indent_line', + -- require 'kickstart.plugins.lint', + -- require 'kickstart.plugins.autopairs', + -- require 'kickstart.plugins.neo-tree', + -- require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps - -- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart - -- - -- Here are some example plugins that I've included in the Kickstart repository. - -- Uncomment any of the lines below to enable them (you will need to restart nvim). - -- - -- require 'kickstart.plugins.debug', - -- require 'kickstart.plugins.indent_line', - -- require 'kickstart.plugins.lint', - -- require 'kickstart.plugins.autopairs', - -- require 'kickstart.plugins.neo-tree', - -- require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps - - -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` - -- This is the easiest way to modularize your config. - -- - -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. - { import = 'custom.plugins' }, + -- Autoloading all *.lua files from `lua/custom/plugins/*.lua` + -- This is the easiest way to modularize your config + -- just uncomment the following line + -- { import = 'custom.plugins' }, -- -- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec` - -- Or use telescope! - -- In normal mode type `sh` then write `lazy.nvim-plugin` + -- Or use telescope! In normal mode type `sh` then write `lazy.nvim-plugin` -- you can continue same window with `sr` which resumes last telescope search + -- + -- }, { ui = { -- If you are using a Nerd Font: set icons to an empty table which will use the diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index 21714d7e..be0eb9d8 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -2,43 +2,4 @@ -- I promise not to create any merge conflicts in this directory :) -- -- See the kickstart.nvim README for more information -return { - -- Add this section for nvim-ufo and its dependencies - { - 'kevinhwang91/nvim-ufo', - dependencies = { - 'kevinhwang91/promise-async', - 'nvim-treesitter/nvim-treesitter', - }, - config = function() - -- Enable fold column - vim.o.foldcolumn = '1' - -- Set fold level to 99 (effectively expanding all folds) - vim.o.foldlevel = 99 - -- Start with all folds expanded - vim.o.foldlevelstart = 99 - -- Use nvim-ufo provider - vim.o.foldenable = true - - -- Using ufo provider need remap `zR` and `zM` - vim.keymap.set('n', 'zR', require('ufo').openAllFolds) - vim.keymap.set('n', 'zM', require('ufo').closeAllFolds) - vim.keymap.set('n', 'zm', require('ufo').closeFoldsWith) -- closeAllFolds == closeFoldsWith(0) - vim.keymap.set('n', 'K', function() - local winid = require('ufo').peekFoldedLinesUnderCursor() - if not winid then - -- choose one of coc.nvim and nvim lsp - vim.fn.CocActionAsync 'definitionHover' -- coc.nvim - vim.lsp.buf.hover() - end - end) - - -- Configure UFO - require('ufo').setup { - provider_selector = function(bufnr, filetype, buftype) - return { 'treesitter', 'indent' } - end, - } - end, - }, -} +return {}