418 lines
15 KiB
Lua
418 lines
15 KiB
Lua
--[[
|
||
|
||
=====================================================================
|
||
==================== 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/
|
||
|
||
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:
|
||
- <escape key>
|
||
- :
|
||
- Tutor
|
||
- <enter key>
|
||
|
||
(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 "<space>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 <space> 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 = false
|
||
|
||
-- [[ Setting options ]]
|
||
-- See `:help vim.opt`
|
||
-- NOTE: You can change these options as you wish!
|
||
-- For more options, you can see `:help option-list`
|
||
|
||
-- Make line numbers default
|
||
-- vim.opt.number = true
|
||
-- You can also add reeative line numbers, to help with jumping.
|
||
-- Experiment for yourself to see if you like it!
|
||
vim.opt.relativenumber = true
|
||
|
||
-- Ensure line numbers are always visible
|
||
vim.opt.numberwidth = 4 -- Width of number column
|
||
vim.opt.signcolumn = 'yes' -- Always show sign column
|
||
|
||
-- 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
|
||
|
||
-- 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)
|
||
|
||
-- Enable break indent
|
||
vim.opt.breakindent = true
|
||
|
||
-- Save undo history
|
||
vim.opt.undofile = true
|
||
|
||
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
|
||
vim.opt.ignorecase = true
|
||
vim.opt.smartcase = true
|
||
|
||
-- Keep signcolumn on by default
|
||
vim.opt.signcolumn = 'yes'
|
||
|
||
-- Decrease update time
|
||
vim.opt.updatetime = 250
|
||
|
||
-- Decrease mapped sequence wait time
|
||
vim.opt.timeoutlen = 300
|
||
|
||
-- 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 = false -- Disable showing whitespace characters
|
||
-- vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' }
|
||
|
||
-- Preview substitutions live, as you type!
|
||
vim.opt.inccommand = 'split'
|
||
|
||
-- 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 = 10
|
||
|
||
-- Configure fillchars to show empty lines
|
||
vim.opt.fillchars = {
|
||
eob = ' ', -- End of buffer character (empty line indicator)
|
||
fold = ' ', -- Fold indicator
|
||
foldopen = '▼', -- Fold open indicator
|
||
foldclose = '▶', -- Fold close indicator
|
||
foldsep = '│', -- Fold separator
|
||
diff = '╱', -- Diff indicator
|
||
msgsep = ' ', -- Message separator
|
||
vert = '│', -- Vertical split character
|
||
horiz = '─', -- Horizontal split character
|
||
horizup = '┴', -- Horizontal up split character
|
||
horizdown = '┬', -- Horizontal down split character
|
||
}
|
||
|
||
-- Show empty lines at the end of buffer
|
||
vim.opt.display = 'lastline'
|
||
|
||
-- Enable virtual text for better empty line visibility
|
||
vim.opt.virtualedit = 'onemore'
|
||
|
||
-- Indent configuration
|
||
vim.opt.tabstop = 2 -- Number of spaces a tab counts for
|
||
vim.opt.shiftwidth = 2 -- Number of spaces to use for each step of (auto)indent
|
||
vim.opt.softtabstop = 2 -- Number of spaces that a tab counts for while performing editing operations
|
||
vim.opt.expandtab = true -- Use spaces instead of tabs
|
||
vim.opt.smartindent = true -- Smart autoindenting when starting a new line
|
||
vim.opt.autoindent = true -- Copy indent from current line when starting a new line
|
||
|
||
-- Filetype-specific indent settings
|
||
vim.api.nvim_create_autocmd('FileType', {
|
||
pattern = { 'python', 'yaml', 'yml' },
|
||
callback = function()
|
||
vim.opt_local.tabstop = 2
|
||
vim.opt_local.shiftwidth = 2
|
||
vim.opt_local.softtabstop = 2
|
||
end,
|
||
})
|
||
|
||
vim.api.nvim_create_autocmd('FileType', {
|
||
pattern = { 'go', 'rust' },
|
||
callback = function()
|
||
vim.opt_local.tabstop = 4
|
||
vim.opt_local.shiftwidth = 4
|
||
vim.opt_local.softtabstop = 4
|
||
vim.opt_local.expandtab = false -- Use tabs for Go and Rust
|
||
end,
|
||
})
|
||
|
||
vim.api.nvim_create_autocmd('FileType', {
|
||
pattern = { 'kotlin', 'java', 'javascript', 'typescript', 'lua' },
|
||
callback = function()
|
||
vim.opt_local.tabstop = 2
|
||
vim.opt_local.shiftwidth = 2
|
||
vim.opt_local.softtabstop = 2
|
||
vim.opt_local.expandtab = true
|
||
end,
|
||
})
|
||
|
||
-- [[ Basic Keymaps ]]
|
||
-- See `:help vim.keymap.set()`
|
||
|
||
-- Clear highlights on search when pressing <Esc> in normal mode
|
||
-- See `:help hlsearch`
|
||
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
|
||
|
||
-- Diagnostic keymaps
|
||
vim.keymap.set('n', '<leader>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 <C-\><C-n>, 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 <C-\><C-n> to exit terminal mode
|
||
vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
|
||
|
||
-- TIP: Disable arrow keys in normal mode
|
||
-- vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>')
|
||
-- vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>')
|
||
-- vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>')
|
||
-- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
|
||
|
||
-- Keybinds to make split navigation easier.
|
||
-- Use CTRL+<hjkl> to switch between windows
|
||
--
|
||
-- See `:help wincmd` for a list of all window commands
|
||
vim.keymap.set('n', '<C-h>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
|
||
vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
|
||
vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
|
||
vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
|
||
|
||
-- [[ 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()`
|
||
vim.api.nvim_create_autocmd('TextYankPost', {
|
||
desc = 'Highlight when yanking (copying) text',
|
||
group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
|
||
callback = function()
|
||
vim.highlight.on_yank()
|
||
end,
|
||
})
|
||
|
||
-- [[ 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'
|
||
local out = vim.fn.system { 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }
|
||
if vim.v.shell_error ~= 0 then
|
||
error('Error cloning lazy.nvim:\n' .. out)
|
||
end
|
||
end ---@diagnostic disable-next-line: undefined-field
|
||
vim.opt.rtp:prepend(lazypath)
|
||
|
||
-- Load LSP configurations
|
||
require 'config.lspconfig'
|
||
require 'config.diagnostic'
|
||
|
||
-- Load filetype configurations
|
||
require 'config.filetypes'
|
||
-- [[ 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.
|
||
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.
|
||
--
|
||
|
||
-- 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 = '~' },
|
||
},
|
||
},
|
||
},
|
||
|
||
-- 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)`.
|
||
|
||
require 'plugins.which-key',
|
||
|
||
-- 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
|
||
|
||
require 'plugins.telescope',
|
||
|
||
-- LSP Plugins
|
||
require 'plugins.lazydev',
|
||
-- nvim bar plugin
|
||
require 'plugins.lualine',
|
||
|
||
require 'plugins.java',
|
||
require 'plugins.conform',
|
||
|
||
require 'plugins.cmp',
|
||
require 'plugins.colorscheme',
|
||
require 'plugins.lsp',
|
||
require 'plugins.nvim-surround',
|
||
require 'plugins.todo-comments',
|
||
require 'plugins.mini',
|
||
require 'plugins.treesitter',
|
||
|
||
-- 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.
|
||
|
||
-- 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 'plugins.debug',
|
||
-- require 'plugins.indent_line',
|
||
-- require 'plugins.lint',
|
||
require 'plugins.autopairs',
|
||
require 'plugins.neo-tree',
|
||
require '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' },
|
||
--
|
||
-- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec`
|
||
-- Or use telescope!
|
||
-- In normal mode type `<space>sh` then write `lazy.nvim-plugin`
|
||
-- you can continue same window with `<space>sr` which resumes last telescope search
|
||
}, {
|
||
ui = {
|
||
-- If you are using a Nerd Font: set icons to an empty table which will use the
|
||
-- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table
|
||
icons = vim.g.have_nerd_font and {} or {
|
||
cmd = '⌘',
|
||
config = '🛠',
|
||
event = '📅',
|
||
ft = '📂',
|
||
init = '⚙',
|
||
keys = '🗝',
|
||
plugin = '🔌',
|
||
runtime = '💻',
|
||
require = '🌙',
|
||
source = '📄',
|
||
start = '🚀',
|
||
task = '📌',
|
||
lazy = '💤 ',
|
||
},
|
||
},
|
||
})
|
||
|
||
-- The line beneath this is called `modeline`. See `:help modeline`
|
||
-- vim: ts=2 sts=2 sw=2 et
|