2023-02-17 16:31:57 -05:00
--[[
=====================================================================
==================== READ THIS BEFORE CONTINUING ====================
=====================================================================
Kickstart.nvim is * not * a distribution .
Kickstart.nvim is a template for your own configuration .
2023-05-22 11:29:42 -07:00
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 .
2023-02-17 16:31:57 -05:00
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 /
2023-08-10 15:00:15 -04:00
2023-02-17 16:31:57 -05:00
And then you can explore or search through ` : help lua - guide `
2023-08-10 15:00:15 -04:00
- https : // neovim.io / doc / user / lua - guide.html
2023-02-17 16:31:57 -05:00
2023-12-09 20:18:01 +01:00
-- nvim-tree.lua
-- disable netrw at the very start of your init.lua
-- vim.g.loaded_netrw = 1
-- vim.g.loaded_netrwPlugin = 1
2023-02-17 16:31:57 -05:00
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 : )
--]]
2023-11-07 11:27:14 +01:00
2023-02-17 16:31:57 -05:00
-- Set <space> 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 = ' '
2023-12-13 12:36:43 +00:00
-- Put anything you want to happen only in Neovide here
if vim.g . neovide then
-- Themes
vim.g . neovide_theme = ' dark '
vim.g . neovide_fullscreen = true
-- Refresh rates
vim.g . neovide_refresh_rate = 60
vim.g . neovide_refresh_rate_idle = 5
-- Cursor modes
vim.g . neovide_cursor_vfx_mode = " pixiedust "
end
2023-11-07 11:27:14 +01:00
-- [[ Install `lazy.nvim` plugin manager ]]
2023-02-17 16:31:57 -05:00
-- 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 ,
}
2022-06-23 23:35:53 -04:00
end
2023-02-17 16:31:57 -05:00
vim.opt . rtp : prepend ( lazypath )
2022-06-23 23:35:53 -04:00
2023-11-07 11:27:14 +01:00
-- [[ Configure plugins ]]
2023-02-17 16:31:57 -05:00
-- 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
2022-11-18 21:04:04 -05:00
2023-02-17 16:31:57 -05:00
-- 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.
2023-05-08 11:02:37 +01:00
{
-- LSP Configuration & Plugins
2022-11-18 21:04:04 -05:00
' neovim/nvim-lspconfig ' ,
2023-02-17 16:31:57 -05:00
dependencies = {
2022-11-18 21:04:04 -05:00
-- Automatically install LSPs to stdpath for neovim
2023-10-06 16:25:57 -07:00
' williamboman/mason.nvim ' ,
2022-11-18 21:04:04 -05:00
' williamboman/mason-lspconfig.nvim ' ,
-- Useful status updates for LSP
2023-02-17 16:31:57 -05:00
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
2023-11-13 15:46:34 -05:00
{ ' j-hui/fidget.nvim ' , opts = { } } ,
2022-12-20 22:12:39 -05:00
2023-02-17 16:31:57 -05:00
-- Additional lua configuration, makes nvim stuff amazing!
2022-12-20 22:12:39 -05:00
' folke/neodev.nvim ' ,
2022-11-18 21:04:04 -05:00
} ,
2023-02-17 16:31:57 -05:00
} ,
2022-11-18 21:04:04 -05:00
2023-05-08 11:02:37 +01:00
{
-- Autocompletion
2022-11-18 21:04:04 -05:00
' hrsh7th/nvim-cmp ' ,
2023-05-21 23:46:09 -07:00
dependencies = {
-- Snippet Engine & its associated nvim-cmp source
' L3MON4D3/LuaSnip ' ,
' saadparwaiz1/cmp_luasnip ' ,
-- Adds LSP completion capabilities
' hrsh7th/cmp-nvim-lsp ' ,
2023-12-08 18:44:06 +05:30
' hrsh7th/cmp-path ' ,
2023-05-21 23:46:09 -07:00
-- Adds a number of user-friendly snippets
' rafamadriz/friendly-snippets ' ,
} ,
2023-02-17 16:31:57 -05:00
} ,
2022-11-18 21:04:04 -05:00
2023-02-17 16:31:57 -05:00
-- Useful plugin to show you pending keybinds.
2023-05-16 12:38:56 -07:00
{ ' folke/which-key.nvim ' , opts = { } } ,
2023-05-08 11:02:37 +01:00
{
2023-07-31 02:46:27 +09:00
-- Adds git related signs to the gutter, as well as utilities for managing changes
2023-02-17 16:31:57 -05:00
' lewis6991/gitsigns.nvim ' ,
opts = {
-- See `:help gitsigns.txt`
signs = {
add = { text = ' + ' } ,
change = { text = ' ~ ' } ,
delete = { text = ' _ ' } ,
topdelete = { text = ' ‾ ' } ,
changedelete = { text = ' ~ ' } ,
} ,
2023-02-26 23:03:34 -03:00
on_attach = function ( bufnr )
2023-08-22 07:17:15 +03:00
local gs = package.loaded . gitsigns
2023-12-04 16:35:54 +01:00
local function map ( mode , l , r , opts )
opts = opts or { }
opts.buffer = bufnr
vim.keymap . set ( mode , l , r , opts )
end
-- Navigation
map ( { ' n ' , ' v ' } , ' ]c ' , function ( )
2023-10-06 16:25:57 -07:00
if vim.wo . diff then
return ' ]c '
end
vim.schedule ( function ( )
gs.next_hunk ( )
end )
2023-08-22 07:17:15 +03:00
return ' <Ignore> '
2023-12-04 16:35:54 +01:00
end , { expr = true , desc = ' Jump to next hunk ' } )
map ( { ' n ' , ' v ' } , ' [c ' , function ( )
2023-10-06 16:25:57 -07:00
if vim.wo . diff then
return ' [c '
end
vim.schedule ( function ( )
gs.prev_hunk ( )
end )
2023-08-22 07:17:15 +03:00
return ' <Ignore> '
2023-12-04 16:35:54 +01:00
end , { expr = true , desc = ' Jump to previous hunk ' } )
-- Actions
-- visual mode
map ( ' v ' , ' <leader>hs ' , function ( )
gs.stage_hunk { vim.fn . line ' . ' , vim.fn . line ' v ' }
end , { desc = ' stage git hunk ' } )
map ( ' v ' , ' <leader>hr ' , function ( )
gs.reset_hunk { vim.fn . line ' . ' , vim.fn . line ' v ' }
end , { desc = ' reset git hunk ' } )
-- normal mode
map ( ' n ' , ' <leader>hs ' , gs.stage_hunk , { desc = ' git stage hunk ' } )
map ( ' n ' , ' <leader>hr ' , gs.reset_hunk , { desc = ' git reset hunk ' } )
map ( ' n ' , ' <leader>hS ' , gs.stage_buffer , { desc = ' git Stage buffer ' } )
map ( ' n ' , ' <leader>hu ' , gs.undo_stage_hunk , { desc = ' undo stage hunk ' } )
map ( ' n ' , ' <leader>hR ' , gs.reset_buffer , { desc = ' git Reset buffer ' } )
map ( ' n ' , ' <leader>hp ' , gs.preview_hunk , { desc = ' preview git hunk ' } )
map ( ' n ' , ' <leader>hb ' , function ( )
gs.blame_line { full = false }
end , { desc = ' git blame line ' } )
map ( ' n ' , ' <leader>hd ' , gs.diffthis , { desc = ' git diff against index ' } )
map ( ' n ' , ' <leader>hD ' , function ( )
gs.diffthis ' ~ '
end , { desc = ' git diff against last commit ' } )
-- Toggles
map ( ' n ' , ' <leader>tb ' , gs.toggle_current_line_blame , { desc = ' toggle git blame line ' } )
map ( ' n ' , ' <leader>td ' , gs.toggle_deleted , { desc = ' toggle git show deleted ' } )
-- Text object
map ( { ' o ' , ' x ' } , ' ih ' , ' :<C-U>Gitsigns select_hunk<CR> ' , { desc = ' select git hunk ' } )
2023-05-16 12:38:56 -07:00
end ,
2023-02-17 16:31:57 -05:00
} ,
} ,
2023-12-13 12:36:43 +00:00
2023-06-04 16:10:59 +00:00
{
2023-12-13 12:36:43 +00:00
" folke/tokyonight.nvim " ,
lazy = false ,
2023-06-04 16:10:59 +00:00
priority = 1000 ,
2023-12-13 12:36:43 +00:00
opts = { } ,
2023-06-04 16:10:59 +00:00
} ,
2023-12-13 12:36:43 +00:00
--{
-- Theme inspired by Atom
-- 'navarasu/onedark.nvim',
-- priority = 1000,
-- config = function()
-- vim.cmd.colorscheme 'onedark'
-- end,
--},
2022-11-18 21:04:04 -05:00
2023-12-09 20:18:01 +01:00
{
' nvim-tree/nvim-tree.lua ' ,
version = ' * ' ,
lazy = false ,
dependencies = {
' nvim-tree/nvim-web-devicons ' ,
} ,
config = function ( )
require ( ' nvim-tree ' ) . setup ( {
sort = {
sorter = ' case_sensitive ' ,
} ,
view = {
width = 30 ,
} ,
renderer = {
group_empty = true ,
} ,
filters = {
dotfiles = true ,
} ,
} )
end ,
} ,
2023-06-04 16:10:59 +00:00
{
-- Set lualine as statusline
' nvim-lualine/lualine.nvim ' ,
-- See `:help lualine.txt`
opts = {
options = {
icons_enabled = false ,
theme = ' onedark ' ,
component_separators = ' | ' ,
section_separators = ' ' ,
} ,
} ,
} ,
2022-11-18 21:04:04 -05:00
2023-05-08 11:02:37 +01:00
{
-- Add indentation guides even on blank lines
2023-02-17 16:31:57 -05:00
' lukas-reineke/indent-blankline.nvim ' ,
-- Enable `lukas-reineke/indent-blankline.nvim`
2023-10-10 19:57:49 -03:00
-- See `:help ibl`
2023-10-06 16:25:57 -07:00
main = ' ibl ' ,
2023-09-28 23:11:05 +09:00
opts = { } ,
2023-02-17 16:31:57 -05:00
} ,
2022-11-18 21:04:04 -05:00
2023-02-17 16:31:57 -05:00
-- "gc" to comment visual regions/lines
2023-05-16 12:38:56 -07:00
{ ' numToStr/Comment.nvim ' , opts = { } } ,
2022-08-24 11:48:08 +03:00
-- Fuzzy Finder (files, lsp, etc)
2023-02-17 16:31:57 -05:00
{
2023-08-05 17:28:18 -07:00
' nvim-telescope/telescope.nvim ' ,
branch = ' 0.1.x ' ,
dependencies = {
2023-08-06 16:27:05 +01:00
' nvim-lua/plenary.nvim ' ,
2023-08-05 17:31:01 -07:00
-- 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.
2023-12-08 11:20:47 +01:00
-- build = 'make',
build = ' cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build ' ,
2023-08-05 17:31:01 -07:00
cond = function ( )
2023-12-08 11:27:17 +01:00
return vim.fn . executable ' cmake ' == 1
2023-08-05 17:31:01 -07:00
end ,
} ,
2023-08-05 17:28:18 -07:00
} ,
2023-02-17 16:31:57 -05:00
} ,
2022-06-23 23:35:53 -04:00
2023-05-08 11:02:37 +01:00
{
-- Highlight, edit, and navigate code
2023-02-17 16:31:57 -05:00
' nvim-treesitter/nvim-treesitter ' ,
dependencies = {
' nvim-treesitter/nvim-treesitter-textobjects ' ,
} ,
2023-05-16 12:38:56 -07:00
build = ' :TSUpdate ' ,
2023-02-17 16:31:57 -05:00
} ,
2022-11-21 06:47:24 -06:00
2023-02-17 16:31:57 -05:00
-- 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.
2023-12-09 20:18:01 +01:00
require ' kickstart.plugins.autoformat ' ,
require ' kickstart.plugins.debug ' ,
2022-06-23 23:35:53 -04:00
2023-07-01 12:34:20 -04:00
-- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
2023-02-17 16:31:57 -05:00
-- 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.
2023-07-01 12:34:20 -04:00
-- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going.
2023-02-17 16:31:57 -05:00
--
-- For additional information see: https://github.com/folke/lazy.nvim#-structuring-your-plugins
2023-12-09 20:18:01 +01:00
{ import = ' custom.plugins ' } ,
2023-02-17 16:31:57 -05:00
} , { } )
2022-06-23 23:35:53 -04:00
-- [[ Setting options ]]
-- See `:help vim.o`
2023-05-22 11:29:42 -07:00
-- NOTE: You can change these options as you wish!
2022-06-23 23:35:53 -04:00
-- Set highlight on search
vim.o . hlsearch = false
-- Make line numbers default
vim.wo . number = true
-- Enable mouse mode
vim.o . mouse = ' a '
2023-02-17 21:37:36 +00:00
-- 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 '
2022-06-23 23:35:53 -04:00
-- Enable break indent
vim.o . breakindent = true
-- Save undo history
vim.o . undofile = true
2023-06-18 16:20:34 +02:00
-- Case-insensitive searching UNLESS \C or capital in search
2022-06-23 23:35:53 -04:00
vim.o . ignorecase = true
vim.o . smartcase = true
2023-02-17 16:31:57 -05:00
-- Keep signcolumn on by default
2022-06-23 23:35:53 -04:00
vim.wo . signcolumn = ' yes '
2023-02-17 16:31:57 -05:00
-- Decrease update time
vim.o . updatetime = 250
vim.o . timeoutlen = 300
2022-06-23 23:35:53 -04:00
-- Set completeopt to have a better completion experience
vim.o . completeopt = ' menuone,noselect '
2023-02-17 16:31:57 -05:00
-- NOTE: You should make sure your terminal supports this
vim.o . termguicolors = true
2022-06-23 23:35:53 -04:00
-- [[ Basic Keymaps ]]
-- Keymaps for better default experience
-- See `:help vim.keymap.set()`
vim.keymap . set ( { ' n ' , ' v ' } , ' <Space> ' , ' <Nop> ' , { 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 } )
2023-11-07 11:18:15 +01:00
-- 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 ' , ' <leader>e ' , vim.diagnostic . open_float , { desc = ' Open floating diagnostic message ' } )
vim.keymap . set ( ' n ' , ' <leader>q ' , vim.diagnostic . setloclist , { desc = ' Open diagnostics list ' } )
2022-06-23 23:35:53 -04:00
-- [[ 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 = ' * ' ,
} )
2023-12-13 12:36:43 +00:00
-- [[ Configure TokyoNight ]]
-- https://github.com/folke/tokyonight.nvim
require ( " tokyonight " ) . setup ( {
-- your configuration comes here
-- or leave it empty to use the default settings
style = " storm " , -- The theme comes in three styles, `storm`, `moon`, a darker variant `night` and `day`
light_style = " day " , -- The theme is used when the background is set to light
transparent = false , -- Enable this to disable setting the background color
terminal_colors = true , -- Configure the colors used when opening a `:terminal` in [Neovim](https://github.com/neovim/neovim)
styles = {
-- Style to be applied to different syntax groups
-- Value is any valid attr-list value for `:help nvim_set_hl`
comments = { italic = true } ,
keywords = { italic = true } ,
functions = { } ,
variables = { } ,
-- Background styles. Can be "dark", "transparent" or "normal"
sidebars = " dark " , -- style for sidebars, see below
floats = " dark " , -- style for floating windows
} ,
sidebars = { " qf " , " help " } , -- Set a darker background on sidebar-like windows. For example: `["qf", "vista_kind", "terminal", "packer"]`
day_brightness = 0.3 , -- Adjusts the brightness of the colors of the **Day** style. Number between 0 and 1, from dull to vibrant colors
hide_inactive_statusline = false , -- Enabling this option, will hide inactive statuslines and replace them with a thin border instead. Should work with the standard **StatusLine** and **LuaLine**.
dim_inactive = false , -- dims inactive windows
lualine_bold = false , -- When `true`, section headers in the lualine theme will be bold
--- You can override specific color groups to use other groups or a hex color
--- function will be called with a ColorScheme table
---@param colors ColorScheme
on_colors = function ( colors ) end ,
--- You can override specific highlights to use other groups or a hex color
--- function will be called with a Highlights and ColorScheme table
---@param highlights Highlights
---@param colors ColorScheme
on_highlights = function ( highlights , colors ) end ,
} )
vim.cmd [[colorscheme tokyonight]]
2022-06-23 23:35:53 -04:00
-- [[ Configure Telescope ]]
2022-06-28 20:45:51 +00:00
-- See `:help telescope` and `:help telescope.setup()`
2022-06-23 23:35:53 -04:00
require ( ' telescope ' ) . setup {
defaults = {
mappings = {
i = {
[ ' <C-u> ' ] = false ,
[ ' <C-d> ' ] = false ,
} ,
} ,
} ,
}
-- Enable telescope fzf native, if installed
pcall ( require ( ' telescope ' ) . load_extension , ' fzf ' )
2023-11-06 11:10:16 -03:00
-- Telescope live_grep in git root
-- Function to find the git root directory based on the current buffer's path
local function find_git_root ( )
-- Use the current buffer's path as the starting point for the git search
local current_file = vim.api . nvim_buf_get_name ( 0 )
2023-11-06 22:29:05 -03:00
local current_dir
local cwd = vim.fn . getcwd ( )
2023-11-06 11:10:16 -03:00
-- If the buffer is not associated with a file, return nil
2023-12-03 20:23:39 +01:00
if current_file == ' ' then
2023-11-06 22:29:05 -03:00
current_dir = cwd
else
-- Extract the directory from the current file's path
2023-12-03 20:23:39 +01:00
current_dir = vim.fn . fnamemodify ( current_file , ' :h ' )
2023-11-06 11:10:16 -03:00
end
2023-11-06 22:29:05 -03:00
2023-11-06 11:10:16 -03:00
-- Find the Git root directory from the current file's path
2023-12-03 20:23:39 +01:00
local git_root = vim.fn . systemlist ( ' git -C ' .. vim.fn . escape ( current_dir , ' ' ) .. ' rev-parse --show-toplevel ' ) [ 1 ]
2023-11-06 11:10:16 -03:00
if vim.v . shell_error ~= 0 then
2023-12-03 20:23:39 +01:00
print ' Not a git repository. Searching on current working directory '
2023-11-06 22:29:05 -03:00
return cwd
2023-11-06 11:10:16 -03:00
end
return git_root
end
-- Custom live_grep function to search in git root
local function live_grep_git_root ( )
local git_root = find_git_root ( )
if git_root then
2023-12-03 20:23:39 +01:00
require ( ' telescope.builtin ' ) . live_grep {
search_dirs = { git_root } ,
}
2023-11-06 11:10:16 -03:00
end
end
vim.api . nvim_create_user_command ( ' LiveGrepGitRoot ' , live_grep_git_root , { } )
2022-06-23 23:35:53 -04:00
-- See `:help telescope.builtin`
vim.keymap . set ( ' n ' , ' <leader>? ' , require ( ' telescope.builtin ' ) . oldfiles , { desc = ' [?] Find recently opened files ' } )
vim.keymap . set ( ' n ' , ' <leader><space> ' , require ( ' telescope.builtin ' ) . buffers , { desc = ' [ ] Find existing buffers ' } )
vim.keymap . set ( ' n ' , ' <leader>/ ' , 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 ,
} )
2023-02-17 16:31:57 -05:00
end , { desc = ' [/] Fuzzily search in current buffer ' } )
2022-06-23 23:35:53 -04:00
2023-12-04 16:45:01 +01:00
local function telescope_live_grep_open_files ( )
require ( ' telescope.builtin ' ) . live_grep {
grep_open_files = true ,
prompt_title = ' Live Grep in Open Files ' ,
}
end
vim.keymap . set ( ' n ' , ' <leader>s/ ' , telescope_live_grep_open_files , { desc = ' [S]earch [/] in Open Files ' } )
vim.keymap . set ( ' n ' , ' <leader>ss ' , require ( ' telescope.builtin ' ) . builtin , { desc = ' [S]earch [S]elect Telescope ' } )
2023-04-24 17:57:47 +01:00
vim.keymap . set ( ' n ' , ' <leader>gf ' , require ( ' telescope.builtin ' ) . git_files , { desc = ' Search [G]it [F]iles ' } )
2022-06-23 23:35:53 -04:00
vim.keymap . set ( ' n ' , ' <leader>sf ' , require ( ' telescope.builtin ' ) . find_files , { desc = ' [S]earch [F]iles ' } )
vim.keymap . set ( ' n ' , ' <leader>sh ' , require ( ' telescope.builtin ' ) . help_tags , { desc = ' [S]earch [H]elp ' } )
vim.keymap . set ( ' n ' , ' <leader>sw ' , require ( ' telescope.builtin ' ) . grep_string , { desc = ' [S]earch current [W]ord ' } )
2023-11-06 15:29:09 -03:00
vim.keymap . set ( ' n ' , ' <leader>sg ' , require ( ' telescope.builtin ' ) . live_grep , { desc = ' [S]earch by [G]rep ' } )
vim.keymap . set ( ' n ' , ' <leader>sG ' , ' :LiveGrepGitRoot<cr> ' , { desc = ' [S]earch by [G]rep on Git Root ' } )
2022-06-23 23:35:53 -04:00
vim.keymap . set ( ' n ' , ' <leader>sd ' , require ( ' telescope.builtin ' ) . diagnostics , { desc = ' [S]earch [D]iagnostics ' } )
2023-09-23 12:10:51 -04:00
vim.keymap . set ( ' n ' , ' <leader>sr ' , require ( ' telescope.builtin ' ) . resume , { desc = ' [S]earch [R]esume ' } )
2022-06-23 23:35:53 -04:00
-- [[ Configure Treesitter ]]
-- See `:help nvim-treesitter`
2023-09-30 00:35:22 +00:00
-- Defer Treesitter setup after first render to improve startup time of 'nvim {filename}'
vim.defer_fn ( function ( )
require ( ' nvim-treesitter.configs ' ) . setup {
-- Add languages to be installed here that you want installed for treesitter
2023-10-03 13:22:25 +00:00
ensure_installed = { ' c ' , ' cpp ' , ' go ' , ' lua ' , ' python ' , ' rust ' , ' tsx ' , ' javascript ' , ' typescript ' , ' vimdoc ' , ' vim ' , ' bash ' } ,
2023-10-06 16:25:57 -07:00
2023-09-30 00:35:22 +00:00
-- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!)
auto_install = false ,
2023-10-06 16:25:57 -07:00
2023-09-30 00:35:22 +00:00
highlight = { enable = true } ,
indent = { enable = true } ,
incremental_selection = {
2022-06-23 23:35:53 -04:00
enable = true ,
keymaps = {
2023-09-30 00:35:22 +00:00
init_selection = ' <c-space> ' ,
node_incremental = ' <c-space> ' ,
scope_incremental = ' <c-s> ' ,
node_decremental = ' <M-space> ' ,
2022-06-23 23:35:53 -04:00
} ,
} ,
2023-09-30 00:35:22 +00:00
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 ' ,
} ,
2022-06-23 23:35:53 -04:00
} ,
2023-09-30 00:35:22 +00:00
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_previous_end = {
[ ' [M ' ] = ' @function.outer ' ,
[ ' [] ' ] = ' @class.outer ' ,
} ,
2022-06-23 23:35:53 -04:00
} ,
2023-09-30 00:35:22 +00:00
swap = {
enable = true ,
swap_next = {
[ ' <leader>a ' ] = ' @parameter.inner ' ,
} ,
swap_previous = {
[ ' <leader>A ' ] = ' @parameter.inner ' ,
} ,
2022-06-23 23:35:53 -04:00
} ,
} ,
2023-09-30 00:35:22 +00:00
}
end , 0 )
2022-06-23 23:35:53 -04:00
2023-05-21 23:46:09 -07:00
-- [[ Configure LSP ]]
2022-06-23 23:35:53 -04:00
-- 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 ( ' <leader>rn ' , vim.lsp . buf.rename , ' [R]e[n]ame ' )
2022-06-24 17:19:15 +01:00
nmap ( ' <leader>ca ' , vim.lsp . buf.code_action , ' [C]ode [A]ction ' )
2022-06-23 23:35:53 -04:00
2023-10-13 16:21:10 +09:00
nmap ( ' gd ' , require ( ' telescope.builtin ' ) . lsp_definitions , ' [G]oto [D]efinition ' )
2022-11-18 21:04:04 -05:00
nmap ( ' gr ' , require ( ' telescope.builtin ' ) . lsp_references , ' [G]oto [R]eferences ' )
2023-08-21 17:19:13 -04:00
nmap ( ' gI ' , require ( ' telescope.builtin ' ) . lsp_implementations , ' [G]oto [I]mplementation ' )
2023-10-13 16:21:10 +09:00
nmap ( ' <leader>D ' , require ( ' telescope.builtin ' ) . lsp_type_definitions , ' Type [D]efinition ' )
2022-06-23 23:35:53 -04:00
nmap ( ' <leader>ds ' , require ( ' telescope.builtin ' ) . lsp_document_symbols , ' [D]ocument [S]ymbols ' )
nmap ( ' <leader>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 ( ' <C-k> ' , vim.lsp . buf.signature_help , ' Signature Documentation ' )
-- Lesser used LSP functionality
nmap ( ' gD ' , vim.lsp . buf.declaration , ' [G]oto [D]eclaration ' )
nmap ( ' <leader>wa ' , vim.lsp . buf.add_workspace_folder , ' [W]orkspace [A]dd Folder ' )
nmap ( ' <leader>wr ' , vim.lsp . buf.remove_workspace_folder , ' [W]orkspace [R]emove Folder ' )
nmap ( ' <leader>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
2022-08-24 11:17:50 +03:00
vim.api . nvim_buf_create_user_command ( bufnr , ' Format ' , function ( _ )
2022-12-20 22:12:39 -05:00
vim.lsp . buf.format ( )
2022-08-24 11:17:50 +03:00
end , { desc = ' Format current buffer with LSP ' } )
2022-06-23 23:35:53 -04:00
end
2023-09-24 10:24:33 +02:00
-- document existing key chains
2023-10-06 16:25:57 -07:00
require ( ' which-key ' ) . register {
2023-09-24 10:24:33 +02:00
[ ' <leader>c ' ] = { name = ' [C]ode ' , _ = ' which_key_ignore ' } ,
[ ' <leader>d ' ] = { name = ' [D]ocument ' , _ = ' which_key_ignore ' } ,
[ ' <leader>g ' ] = { name = ' [G]it ' , _ = ' which_key_ignore ' } ,
2023-12-04 16:35:54 +01:00
[ ' <leader>h ' ] = { name = ' Git [H]unk ' , _ = ' which_key_ignore ' } ,
2023-09-24 10:24:33 +02:00
[ ' <leader>r ' ] = { name = ' [R]ename ' , _ = ' which_key_ignore ' } ,
[ ' <leader>s ' ] = { name = ' [S]earch ' , _ = ' which_key_ignore ' } ,
2023-12-04 16:35:54 +01:00
[ ' <leader>t ' ] = { name = ' [T]oggle ' , _ = ' which_key_ignore ' } ,
2023-09-24 10:24:33 +02:00
[ ' <leader>w ' ] = { name = ' [W]orkspace ' , _ = ' which_key_ignore ' } ,
2023-10-06 16:25:57 -07:00
}
2023-12-04 16:35:54 +01:00
-- register which-key VISUAL mode
-- required for visual <leader>hs (hunk stage) to work
require ( ' which-key ' ) . register ( {
[ ' <leader> ' ] = { name = ' VISUAL <leader> ' } ,
[ ' <leader>h ' ] = { ' Git [H]unk ' } ,
} , { mode = ' v ' } )
2023-09-24 10:24:33 +02:00
2023-10-07 16:14:26 -07:00
-- mason-lspconfig requires that these setup functions are called in this order
-- before setting up the servers.
require ( ' mason ' ) . setup ( )
require ( ' mason-lspconfig ' ) . setup ( )
2022-06-23 23:35:53 -04:00
-- Enable the following language servers
2022-12-20 22:12:39 -05:00
-- 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.
2023-07-24 20:41:14 +02:00
--
-- If you want to override the default filetypes that your language server will attach to you can
-- define the property 'filetypes' to the map in question.
2022-12-20 22:12:39 -05:00
local servers = {
-- clangd = {},
-- gopls = {},
-- pyright = {},
-- rust_analyzer = {},
-- tsserver = {},
2023-07-24 20:41:14 +02:00
-- html = { filetypes = { 'html', 'twig', 'hbs'} },
2022-12-20 22:12:39 -05:00
2023-02-17 16:31:57 -05:00
lua_ls = {
2022-12-20 22:12:39 -05:00
Lua = {
workspace = { checkThirdParty = false } ,
telemetry = { enable = false } ,
2023-11-24 09:55:19 -07:00
-- NOTE: toggle below to ignore Lua_LS's noisy `missing-fields` warnings
-- diagnostics = { disable = { 'missing-fields' } },
2022-12-20 22:12:39 -05:00
} ,
} ,
2022-06-23 23:35:53 -04:00
}
2022-12-20 22:12:39 -05:00
-- Setup neovim lua configuration
require ( ' neodev ' ) . setup ( )
2023-02-17 16:31:57 -05:00
2022-12-20 22:12:39 -05:00
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
2022-11-18 21:04:04 -05:00
local capabilities = vim.lsp . protocol.make_client_capabilities ( )
capabilities = require ( ' cmp_nvim_lsp ' ) . default_capabilities ( capabilities )
2022-12-20 22:12:39 -05:00
-- Ensure the servers above are installed
local mason_lspconfig = require ' mason-lspconfig '
2022-11-18 21:04:04 -05:00
2022-12-20 22:12:39 -05:00
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 ] ,
2023-07-25 17:06:04 +02:00
filetypes = ( servers [ server_name ] or { } ) . filetypes ,
2022-12-20 22:12:39 -05:00
}
2023-10-06 16:25:57 -07:00
end ,
2022-06-23 23:35:53 -04:00
}
2023-05-21 23:46:09 -07:00
-- [[ Configure nvim-cmp ]]
-- See `:help cmp`
2022-06-23 23:35:53 -04:00
local cmp = require ' cmp '
local luasnip = require ' luasnip '
2023-05-16 12:38:56 -07:00
require ( ' luasnip.loaders.from_vscode ' ) . lazy_load ( )
2023-02-17 16:31:57 -05:00
luasnip.config . setup { }
2022-06-23 23:35:53 -04:00
cmp.setup {
snippet = {
expand = function ( args )
luasnip.lsp_expand ( args.body )
end ,
} ,
2023-11-11 20:31:05 +05:30
completion = {
2023-12-03 20:23:39 +01:00
completeopt = ' menu,menuone,noinsert ' ,
2023-11-11 20:31:05 +05:30
} ,
2022-06-23 23:35:53 -04:00
mapping = cmp.mapping . preset.insert {
2023-04-27 09:33:10 +02:00
[ ' <C-n> ' ] = cmp.mapping . select_next_item ( ) ,
[ ' <C-p> ' ] = cmp.mapping . select_prev_item ( ) ,
2022-06-23 23:35:53 -04:00
[ ' <C-d> ' ] = cmp.mapping . scroll_docs ( - 4 ) ,
[ ' <C-f> ' ] = cmp.mapping . scroll_docs ( 4 ) ,
2023-02-17 16:31:57 -05:00
[ ' <C-Space> ' ] = cmp.mapping . complete { } ,
2022-06-23 23:35:53 -04:00
[ ' <CR> ' ] = cmp.mapping . confirm {
behavior = cmp.ConfirmBehavior . Replace ,
select = true ,
} ,
[ ' <Tab> ' ] = cmp.mapping ( function ( fallback )
if cmp.visible ( ) then
cmp.select_next_item ( )
2023-05-07 16:28:13 -07:00
elseif luasnip.expand_or_locally_jumpable ( ) then
2022-06-23 23:35:53 -04:00
luasnip.expand_or_jump ( )
else
fallback ( )
end
end , { ' i ' , ' s ' } ) ,
[ ' <S-Tab> ' ] = cmp.mapping ( function ( fallback )
if cmp.visible ( ) then
cmp.select_prev_item ( )
2023-05-07 16:38:44 -07:00
elseif luasnip.locally_jumpable ( - 1 ) then
2022-06-23 23:35:53 -04:00
luasnip.jump ( - 1 )
else
fallback ( )
end
end , { ' i ' , ' s ' } ) ,
} ,
sources = {
{ name = ' nvim_lsp ' } ,
{ name = ' luasnip ' } ,
2023-12-08 18:44:06 +05:30
{ name = ' path ' } ,
2022-06-23 23:35:53 -04:00
} ,
}
-- The line beneath this is called `modeline`. See `:help modeline`
-- vim: ts=2 sts=2 sw=2 et