@ -104,55 +104,91 @@ require('lazy').setup({
' L3MON4D3/LuaSnip ' ,
' saadparwaiz1/cmp_luasnip ' ,
-- Adds LSP completion capabilities
' hrsh7th/cmp-nvim-lsp ' ,
-- Adds LSP completion capabilities
' hrsh7th/cmp-nvim-lsp ' ,
' hrsh7th/cmp-path ' ,
-- Adds a number of user-friendly snippets
' rafamadriz/friendly-snippets ' ,
} ,
} ,
-- Useful plugin to show you pending keybinds.
{ ' folke/which-key.nvim ' , opts = { } } ,
{
-- Adds git related 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 = ' ~ ' } ,
} ,
on_attach = function ( bufnr )
vim.keymap . set ( ' n ' , ' <leader>hp ' , require ( ' gitsigns ' ) . preview_hunk ,
{ buffer = bufnr , desc = ' Preview git hunk ' } )
-- don't override the built-in and fugitive keymaps
local gs = package.loaded . gitsigns
vim.keymap . set ( { ' n ' , ' v ' } , ' ]c ' , function ( )
if vim.wo . diff then
return ' ]c '
end
vim.schedule ( function ( )
gs.next_hunk ( )
end )
return ' <Ignore> '
end , { expr = true , buffer = bufnr , desc = ' Jump to next hunk ' } )
vim.keymap . set ( { ' n ' , ' v ' } , ' [c ' , function ( )
if vim.wo . diff then
return ' [c '
end
vim.schedule ( function ( )
gs.prev_hunk ( )
end )
return ' <Ignore> '
end , { expr = true , buffer = bufnr , desc = ' Jump to previous hunk ' } )
end ,
} ,
-- Useful plugin to show you pending keybinds.
{ ' folke/which-key.nvim ' , opts = { } } ,
{
-- Adds git related 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 = ' ~ ' } ,
} ,
on_attach = function ( bufnr )
local gs = package.loaded . 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 ' , ' v ' } , ' ]c ' , function ( )
if vim.wo . diff then
return ' ]c '
end
vim.schedule ( function ( )
gs.next_hunk ( )
end )
return ' <Ignore> '
end , { expr = true , desc = ' Jump to next hunk ' } )
map ( { ' n ' , ' v ' } , ' [c ' , function ( )
if vim.wo . diff then
return ' [c '
end
vim.schedule ( function ( )
gs.prev_hunk ( )
end )
return ' <Ignore> '
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 ' } )
end ,
} ,
} ,
{
-- Theme inspired by Atom
@ -325,35 +361,35 @@ pcall(require('telescope').load_extension, 'fzf')
-- 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 )
local current_dir
local cwd = vim.fn . getcwd ( )
-- If the buffer is not associated with a file, return nil
if current_file == " " then
current_dir = cwd
else
-- Extract the directory from the current file's path
current_dir = vim.fn . fnamemodify ( current_file , " :h " )
end
-- Find the Git root directory from the current file's path
local git_root = vim.fn . systemlist ( " git -C " .. vim.fn . escape ( current_dir , " " ) .. " rev-parse --show-toplevel " ) [ 1 ]
if vim.v . shell_error ~= 0 then
print ( " Not a git repository. Searching on current working directory " )
return cwd
end
return 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 )
local current_dir
local cwd = vim.fn . getcwd ( )
-- If the buffer is not associated with a file, return nil
if current_file == ' ' then
current_dir = cwd
else
-- Extract the directory from the current file's path
current_dir = vim.fn . fnamemodify ( current_file , ' :h ' )
end
-- Find the Git root directory from the current file's path
local git_root = vim.fn . systemlist ( ' git -C ' .. vim.fn . escape ( current_dir , ' ' ) .. ' rev-parse --show-toplevel ' ) [ 1 ]
if vim.v . shell_error ~= 0 then
print ' Not a git repository. Searching on current working directory '
return cwd
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
require ( ' telescope.builtin ' ) . live_grep ( {
search_dirs = { git_root } ,
} )
end
local git_root = find_git_root ( )
if git_root then
require ( ' telescope.builtin ' ) . live_grep {
search_dirs = { git_root } ,
}
end
end
vim.api . nvim_create_user_command ( ' LiveGrepGitRoot ' , live_grep_git_root , { } )
@ -369,6 +405,14 @@ vim.keymap.set('n', '<leader>/', function()
} )
end , { desc = ' [/] Fuzzily search in current buffer ' } )
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 ' } )
vim.keymap . set ( ' n ' , ' <leader>gf ' , require ( ' telescope.builtin ' ) . git_files , { desc = ' Search [G]it [F]iles ' } )
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 ' } )
@ -496,14 +540,21 @@ end
-- document existing key chains
require ( ' which-key ' ) . register {
[ ' <leader>c ' ] = { name = ' [C]ode ' , _ = ' which_key_ignore ' } ,
[ ' <leader>d ' ] = { name = ' [D]ocument ' , _ = ' which_key_ignore ' } ,
[ ' <leader>g ' ] = { name = ' [G]it ' , _ = ' which_key_ignore ' } ,
[ ' <leader>h ' ] = { name = ' More git ' , _ = ' which_key_ignore ' } ,
[ ' <leader>r ' ] = { name = ' [R]ename ' , _ = ' which_key_ignore ' } ,
[ ' <leader>s ' ] = { name = ' [S]earch ' , _ = ' which_key_ignore ' } ,
[ ' <leader>w ' ] = { name = ' [W]orkspace ' , _ = ' which_key_ignore ' } ,
[ ' <leader>c ' ] = { name = ' [C]ode ' , _ = ' which_key_ignore ' } ,
[ ' <leader>d ' ] = { name = ' [D]ocument ' , _ = ' which_key_ignore ' } ,
[ ' <leader>g ' ] = { name = ' [G]it ' , _ = ' which_key_ignore ' } ,
[ ' <leader>h ' ] = { name = ' Git [H]unk ' , _ = ' which_key_ignore ' } ,
[ ' <leader>r ' ] = { name = ' [R]ename ' , _ = ' which_key_ignore ' } ,
[ ' <leader>s ' ] = { name = ' [S]earch ' , _ = ' which_key_ignore ' } ,
[ ' <leader>t ' ] = { name = ' [T]oggle ' , _ = ' which_key_ignore ' } ,
[ ' <leader>w ' ] = { name = ' [W]orkspace ' , _ = ' which_key_ignore ' } ,
}
-- 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 ' } )
-- mason-lspconfig requires that these setup functions are called in this order
-- before setting up the servers.
@ -583,7 +634,7 @@ cmp.setup {
end ,
} ,
completion = {
completeopt = ' menu,menuone,noinsert '
completeopt = ' menu,menuone,noinsert ' ,
} ,
mapping = cmp.mapping . preset.insert {
[ ' <C-n> ' ] = cmp.mapping . select_next_item ( ) ,
@ -617,6 +668,7 @@ cmp.setup {
sources = {
{ name = ' nvim_lsp ' } ,
{ name = ' luasnip ' } ,
{ name = ' path ' } ,
{ name = ' sourcery ' } ,
} ,
}