mirror of
https://github.com/hyzendust/KickestEnd.nvim.git
synced 2026-02-15 00:21:15 +01:00
Fixed Spaces with Tabs for indents in lua
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
column_width = 160
|
column_width = 160
|
||||||
line_endings = "Unix"
|
line_endings = "Unix"
|
||||||
indent_type = "Spaces"
|
indent_type = "Tabs"
|
||||||
indent_width = 2
|
indent_width = 4
|
||||||
quote_style = "AutoPreferSingle"
|
quote_style = "AutoPreferSingle"
|
||||||
call_parentheses = "None"
|
call_parentheses = "None"
|
||||||
|
|||||||
@@ -1,34 +1,52 @@
|
|||||||
{
|
{
|
||||||
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
|
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
|
||||||
"LuaSnip": { "branch": "master", "commit": "73813308abc2eaeff2bc0d3f2f79270c491be9d7" },
|
"LuaSnip": { "branch": "master", "commit": "73813308abc2eaeff2bc0d3f2f79270c491be9d7" },
|
||||||
"cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" },
|
"cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" },
|
||||||
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
|
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
|
||||||
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
||||||
"conform.nvim": { "branch": "master", "commit": "9d859cbfbde7a1bd1770e7c97aef30ec5a237a71" },
|
"conform.nvim": { "branch": "master", "commit": "9d859cbfbde7a1bd1770e7c97aef30ec5a237a71" },
|
||||||
"fidget.nvim": { "branch": "main", "commit": "3f5475949679953af6d78654db29b944fa826e6a" },
|
"fidget.nvim": { "branch": "main", "commit": "3f5475949679953af6d78654db29b944fa826e6a" },
|
||||||
"friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
|
"friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
|
||||||
"gitsigns.nvim": { "branch": "main", "commit": "1ee5c1fd068c81f9dd06483e639c2aa4587dc197" },
|
"gitsigns.nvim": { "branch": "main", "commit": "1ee5c1fd068c81f9dd06483e639c2aa4587dc197" },
|
||||||
"indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" },
|
"indent-blankline.nvim": {
|
||||||
"kanagawa.nvim": { "branch": "master", "commit": "27f1e119f3a7e6d11d435a59e3262e6affda1f83" },
|
"branch": "master",
|
||||||
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
|
"commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba"
|
||||||
"lualine.nvim": { "branch": "master", "commit": "b8c23159c0161f4b89196f74ee3a6d02cdc3a955" },
|
},
|
||||||
"mason-conform.nvim": { "branch": "main", "commit": "48da2ebd5efbaf8a99566eadc3ece82d523f03c5" },
|
"kanagawa.nvim": { "branch": "master", "commit": "27f1e119f3a7e6d11d435a59e3262e6affda1f83" },
|
||||||
"mason-lspconfig.nvim": { "branch": "main", "commit": "155eac5d8609a2f110041f8ac3491664cc126354" },
|
"lazy.nvim": { "branch": "main", "commit": "59334064f8604ca073791c25dcc5c9698865406e" },
|
||||||
"mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" },
|
"lualine.nvim": { "branch": "master", "commit": "b8c23159c0161f4b89196f74ee3a6d02cdc3a955" },
|
||||||
"neo-tree.nvim": { "branch": "main", "commit": "9130e58424ad95bf2dd8b40afbb8cf04d648638c" },
|
"mason-conform.nvim": {
|
||||||
"neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
|
"branch": "main",
|
||||||
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
|
"commit": "48da2ebd5efbaf8a99566eadc3ece82d523f03c5"
|
||||||
"nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" },
|
},
|
||||||
"nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" },
|
"mason-lspconfig.nvim": {
|
||||||
"nvim-lspconfig": { "branch": "master", "commit": "e688b486fe9291f151eae7e5c0b5a5c4ef980847" },
|
"branch": "main",
|
||||||
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
|
"commit": "6bdb14f230de0904229ec367b410fb817e59b072"
|
||||||
"nvim-treesitter-textobjects": { "branch": "master", "commit": "71385f191ec06ffc60e80e6b0c9a9d5daed4824c" },
|
},
|
||||||
"nvim-web-devicons": { "branch": "master", "commit": "f6b0920f452bfd7595ee9a9efe5e1ae78e0e2997" },
|
"mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" },
|
||||||
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
|
"neo-tree.nvim": { "branch": "main", "commit": "9130e58424ad95bf2dd8b40afbb8cf04d648638c" },
|
||||||
"telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" },
|
"neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
|
||||||
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
|
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
|
||||||
"undotree": { "branch": "master", "commit": "0f1c9816975b5d7f87d5003a19c53c6fd2ff6f7f" },
|
"nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" },
|
||||||
"vim-fugitive": { "branch": "master", "commit": "61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4" },
|
"nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" },
|
||||||
"vim-rhubarb": { "branch": "master", "commit": "5496d7c94581c4c9ad7430357449bb57fc59f501" },
|
"nvim-lspconfig": { "branch": "master", "commit": "e688b486fe9291f151eae7e5c0b5a5c4ef980847" },
|
||||||
"which-key.nvim": { "branch": "main", "commit": "904308e6885bbb7b60714c80ab3daf0c071c1492" }
|
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
|
||||||
|
"nvim-treesitter-textobjects": {
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "71385f191ec06ffc60e80e6b0c9a9d5daed4824c"
|
||||||
|
},
|
||||||
|
"nvim-web-devicons": {
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "b8221e42cf7287c4dcde81f232f58d7b947c210d"
|
||||||
|
},
|
||||||
|
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
|
||||||
|
"telescope-fzf-native.nvim": {
|
||||||
|
"branch": "main",
|
||||||
|
"commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55"
|
||||||
|
},
|
||||||
|
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
|
||||||
|
"undotree": { "branch": "master", "commit": "0f1c9816975b5d7f87d5003a19c53c6fd2ff6f7f" },
|
||||||
|
"vim-fugitive": { "branch": "master", "commit": "61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4" },
|
||||||
|
"vim-rhubarb": { "branch": "master", "commit": "5496d7c94581c4c9ad7430357449bb57fc59f501" },
|
||||||
|
"which-key.nvim": { "branch": "main", "commit": "904308e6885bbb7b60714c80ab3daf0c071c1492" }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
local M = {}
|
local M = {}
|
||||||
function M.trim_clipboard()
|
function M.trim_clipboard()
|
||||||
local content = vim.fn.getreg '+'
|
local content = vim.fn.getreg '+'
|
||||||
-- Remove single trailing newline if present
|
-- Remove single trailing newline if present
|
||||||
content = content:gsub('\n$', '')
|
content = content:gsub('\n$', '')
|
||||||
vim.fn.setreg('+', content)
|
vim.fn.setreg('+', content)
|
||||||
vim.fn.setreg('*', content)
|
vim.fn.setreg('*', content)
|
||||||
vim.notify('Copied selection to clipboard', vim.log.levels.INFO)
|
vim.notify('Copied selection to clipboard', vim.log.levels.INFO)
|
||||||
end
|
end
|
||||||
return M
|
return M
|
||||||
|
|||||||
@@ -2,181 +2,181 @@
|
|||||||
vim.cmd [[ let g:neo_tree_remove_legacy_commands = 1 ]]
|
vim.cmd [[ let g:neo_tree_remove_legacy_commands = 1 ]]
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'nvim-neo-tree/neo-tree.nvim',
|
'nvim-neo-tree/neo-tree.nvim',
|
||||||
version = '*',
|
version = '*',
|
||||||
dependencies = {
|
dependencies = {
|
||||||
'nvim-lua/plenary.nvim',
|
'nvim-lua/plenary.nvim',
|
||||||
'nvim-tree/nvim-web-devicons',
|
'nvim-tree/nvim-web-devicons',
|
||||||
'MunifTanjim/nui.nvim',
|
'MunifTanjim/nui.nvim',
|
||||||
},
|
},
|
||||||
config = function()
|
config = function()
|
||||||
local function smart_open(state)
|
local function smart_open(state)
|
||||||
local node = state.tree:get_node()
|
local node = state.tree:get_node()
|
||||||
if not node then
|
if not node then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local path = node:get_id()
|
local path = node:get_id()
|
||||||
|
|
||||||
-- If the node is a directory, just toggle expand/collapse
|
-- If the node is a directory, just toggle expand/collapse
|
||||||
if node.type == 'directory' then
|
if node.type == 'directory' then
|
||||||
state.commands.toggle_node(state, node)
|
state.commands.toggle_node(state, node)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- --- File handling starts here ---
|
-- --- File handling starts here ---
|
||||||
-- Reuse already open buffer in any tab safely
|
-- Reuse already open buffer in any tab safely
|
||||||
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
||||||
if vim.api.nvim_tabpage_is_valid(tab) then
|
if vim.api.nvim_tabpage_is_valid(tab) then
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
||||||
if vim.api.nvim_win_is_valid(win) then
|
if vim.api.nvim_win_is_valid(win) then
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_buf_get_name(buf) == path then
|
if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_buf_get_name(buf) == path then
|
||||||
vim.api.nvim_set_current_tabpage(tab)
|
vim.api.nvim_set_current_tabpage(tab)
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
-- close Neo-tree if open
|
-- close Neo-tree if open
|
||||||
for _, w in ipairs(vim.api.nvim_list_wins()) do
|
for _, w in ipairs(vim.api.nvim_list_wins()) do
|
||||||
if vim.api.nvim_win_is_valid(w) then
|
if vim.api.nvim_win_is_valid(w) then
|
||||||
local b = vim.api.nvim_win_get_buf(w)
|
local b = vim.api.nvim_win_get_buf(w)
|
||||||
if vim.api.nvim_buf_is_valid(b) and vim.api.nvim_buf_get_option(b, 'filetype') == 'neo-tree' then
|
if vim.api.nvim_buf_is_valid(b) and vim.api.nvim_buf_get_option(b, 'filetype') == 'neo-tree' then
|
||||||
vim.api.nvim_win_close(w, true)
|
vim.api.nvim_win_close(w, true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Reuse empty buffer in current tab
|
-- Reuse empty buffer in current tab
|
||||||
local wins = vim.api.nvim_tabpage_list_wins(0)
|
local wins = vim.api.nvim_tabpage_list_wins(0)
|
||||||
local empty_buf = nil
|
local empty_buf = nil
|
||||||
for _, win in ipairs(wins) do
|
for _, win in ipairs(wins) do
|
||||||
if vim.api.nvim_win_is_valid(win) then
|
if vim.api.nvim_win_is_valid(win) then
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_is_valid(buf) then
|
if vim.api.nvim_buf_is_valid(buf) then
|
||||||
local bufname = vim.api.nvim_buf_get_name(buf)
|
local bufname = vim.api.nvim_buf_get_name(buf)
|
||||||
local buftype = vim.api.nvim_buf_get_option(buf, 'buftype')
|
local buftype = vim.api.nvim_buf_get_option(buf, 'buftype')
|
||||||
local modified = vim.api.nvim_buf_get_option(buf, 'modified')
|
local modified = vim.api.nvim_buf_get_option(buf, 'modified')
|
||||||
if bufname == '' and buftype == '' and not modified then
|
if bufname == '' and buftype == '' and not modified then
|
||||||
empty_buf = buf
|
empty_buf = buf
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if empty_buf then
|
if empty_buf then
|
||||||
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
||||||
else
|
else
|
||||||
vim.cmd('tabnew ' .. vim.fn.fnameescape(path))
|
vim.cmd('tabnew ' .. vim.fn.fnameescape(path))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Always close Neo-tree window if open
|
-- Always close Neo-tree window if open
|
||||||
for _, win in ipairs(vim.api.nvim_list_wins()) do
|
for _, win in ipairs(vim.api.nvim_list_wins()) do
|
||||||
if vim.api.nvim_win_is_valid(win) then
|
if vim.api.nvim_win_is_valid(win) then
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_buf_get_option(buf, 'filetype') == 'neo-tree' then
|
if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_buf_get_option(buf, 'filetype') == 'neo-tree' then
|
||||||
vim.api.nvim_win_close(win, true)
|
vim.api.nvim_win_close(win, true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Smart_open_split for split windows
|
-- Smart_open_split for split windows
|
||||||
local function smart_open_split(state, direction)
|
local function smart_open_split(state, direction)
|
||||||
local node = state.tree:get_node()
|
local node = state.tree:get_node()
|
||||||
if not node then
|
if not node then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local path = node:get_id()
|
local path = node:get_id()
|
||||||
|
|
||||||
if node.type == 'directory' then
|
if node.type == 'directory' then
|
||||||
state.commands.toggle_node(state, node)
|
state.commands.toggle_node(state, node)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Check if file is open in another tab
|
-- Check if file is open in another tab
|
||||||
local open_tab, open_win
|
local open_tab, open_win
|
||||||
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_buf_get_name(buf) == path then
|
if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_buf_get_name(buf) == path then
|
||||||
open_tab = tab
|
open_tab = tab
|
||||||
open_win = win
|
open_win = win
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if open_tab then
|
if open_tab then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if open_tab then
|
if open_tab then
|
||||||
local choice = vim.fn.confirm('File is already open in a tab. Open split here anyway?', '&Yes\n&No', 2)
|
local choice = vim.fn.confirm('File is already open in a tab. Open split here anyway?', '&Yes\n&No', 2)
|
||||||
if choice ~= 1 then
|
if choice ~= 1 then
|
||||||
-- User chose No → jump to the tab where file is open
|
-- User chose No → jump to the tab where file is open
|
||||||
vim.api.nvim_set_current_tabpage(open_tab)
|
vim.api.nvim_set_current_tabpage(open_tab)
|
||||||
vim.api.nvim_set_current_win(open_win)
|
vim.api.nvim_set_current_win(open_win)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- Else user chose Yes → continue to open split in current tab
|
-- Else user chose Yes → continue to open split in current tab
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Open split in current tab
|
-- Open split in current tab
|
||||||
if direction == 'v' then
|
if direction == 'v' then
|
||||||
state.commands.open_vsplit(state)
|
state.commands.open_vsplit(state)
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
vim.cmd 'wincmd L'
|
vim.cmd 'wincmd L'
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
state.commands.open_split(state)
|
state.commands.open_split(state)
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
vim.cmd 'wincmd J'
|
vim.cmd 'wincmd J'
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
||||||
end
|
end
|
||||||
|
|
||||||
require('neo-tree').setup {
|
require('neo-tree').setup {
|
||||||
close_if_last_window = true,
|
close_if_last_window = true,
|
||||||
popup_border_style = 'rounded',
|
popup_border_style = 'rounded',
|
||||||
enable_git_status = true,
|
enable_git_status = true,
|
||||||
enable_diagnostics = true,
|
enable_diagnostics = true,
|
||||||
default_component_configs = {
|
default_component_configs = {
|
||||||
indent = { padding = 1, indent_size = 2 },
|
indent = { padding = 1, indent_size = 2 },
|
||||||
icon = { folder_closed = '', folder_open = '', folder_empty = 'ﰊ' },
|
icon = { folder_closed = '', folder_open = '', folder_empty = 'ﰊ' },
|
||||||
},
|
},
|
||||||
window = {
|
window = {
|
||||||
position = 'float',
|
position = 'float',
|
||||||
width = 40,
|
width = 40,
|
||||||
mapping_options = { noremap = true, nowait = true },
|
mapping_options = { noremap = true, nowait = true },
|
||||||
mappings = {
|
mappings = {
|
||||||
['<cr>'] = smart_open,
|
['<cr>'] = smart_open,
|
||||||
['v'] = function(state)
|
['v'] = function(state)
|
||||||
smart_open_split(state, 'h')
|
smart_open_split(state, 'h')
|
||||||
end,
|
end,
|
||||||
['h'] = function(state)
|
['h'] = function(state)
|
||||||
smart_open_split(state, 'v')
|
smart_open_split(state, 'v')
|
||||||
end,
|
end,
|
||||||
['t'] = 'noop',
|
['t'] = 'noop',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
filesystem = {
|
filesystem = {
|
||||||
follow_current_file = {
|
follow_current_file = {
|
||||||
enabled = true, -- updated to table format
|
enabled = true, -- updated to table format
|
||||||
},
|
},
|
||||||
use_libuv_file_watcher = true,
|
use_libuv_file_watcher = true,
|
||||||
hijack_netrw_behavior = 'open_default',
|
hijack_netrw_behavior = 'open_default',
|
||||||
filtered_items = {
|
filtered_items = {
|
||||||
visible = true,
|
visible = true,
|
||||||
hide_dotfiles = false,
|
hide_dotfiles = false,
|
||||||
hide_gitignored = true,
|
hide_gitignored = true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,255 +1,255 @@
|
|||||||
return {
|
return {
|
||||||
-- Fuzzy Finder (files, lsp, etc)
|
-- Fuzzy Finder (files, lsp, etc)
|
||||||
'nvim-telescope/telescope.nvim',
|
'nvim-telescope/telescope.nvim',
|
||||||
branch = '0.1.x',
|
branch = '0.1.x',
|
||||||
dependencies = {
|
dependencies = {
|
||||||
'nvim-lua/plenary.nvim',
|
'nvim-lua/plenary.nvim',
|
||||||
-- Fuzzy Finder Algorithm which requires local dependencies to be built.
|
-- Fuzzy Finder Algorithm which requires local dependencies to be built.
|
||||||
-- Only load if `make` is available. Make sure you have the system
|
-- Only load if `make` is available. Make sure you have the system
|
||||||
-- requirements installed.
|
-- requirements installed.
|
||||||
{
|
{
|
||||||
'nvim-telescope/telescope-fzf-native.nvim',
|
'nvim-telescope/telescope-fzf-native.nvim',
|
||||||
-- NOTE: If you are having trouble with this installation,
|
-- NOTE: If you are having trouble with this installation,
|
||||||
-- refer to the README for telescope-fzf-native for more instructions.
|
-- refer to the README for telescope-fzf-native for more instructions.
|
||||||
build = 'make',
|
build = 'make',
|
||||||
cond = function()
|
cond = function()
|
||||||
return vim.fn.executable 'make' == 1
|
return vim.fn.executable 'make' == 1
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
config = function()
|
config = function()
|
||||||
-- [[ Configure Telescope ]]
|
-- [[ Configure Telescope ]]
|
||||||
-- See `:help telescope` and `:help telescope.setup()`
|
-- See `:help telescope` and `:help telescope.setup()`
|
||||||
require('telescope').setup {
|
require('telescope').setup {
|
||||||
defaults = {
|
defaults = {
|
||||||
mappings = {
|
mappings = {
|
||||||
i = {
|
i = {
|
||||||
['<C-u>'] = false,
|
['<C-u>'] = false,
|
||||||
['<C-d>'] = false,
|
['<C-d>'] = false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Enable telescope fzf native, if installed
|
-- Enable telescope fzf native, if installed
|
||||||
pcall(require('telescope').load_extension, 'fzf')
|
pcall(require('telescope').load_extension, 'fzf')
|
||||||
|
|
||||||
-- smart_open function for Telescope to check if the current tab has an empty "No Name" buffer. If it has, it replaces the empty buffer and open a file in the same tab
|
-- smart_open function for Telescope to check if the current tab has an empty "No Name" buffer. If it has, it replaces the empty buffer and open a file in the same tab
|
||||||
local actions = require 'telescope.actions'
|
local actions = require 'telescope.actions'
|
||||||
local action_state = require 'telescope.actions.state'
|
local action_state = require 'telescope.actions.state'
|
||||||
|
|
||||||
local function smart_open(prompt_bufnr)
|
local function smart_open(prompt_bufnr)
|
||||||
local entry = action_state.get_selected_entry()
|
local entry = action_state.get_selected_entry()
|
||||||
if not entry then
|
if not entry then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local path = entry.path or entry.filename
|
local path = entry.path or entry.filename
|
||||||
if not path then
|
if not path then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if prompt_bufnr and vim.api.nvim_buf_is_valid(prompt_bufnr) then
|
if prompt_bufnr and vim.api.nvim_buf_is_valid(prompt_bufnr) then
|
||||||
pcall(actions.close, prompt_bufnr)
|
pcall(actions.close, prompt_bufnr)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- 1. If file is already open → jump to it
|
-- 1. If file is already open → jump to it
|
||||||
local tabpages = vim.api.nvim_list_tabpages()
|
local tabpages = vim.api.nvim_list_tabpages()
|
||||||
for _, tab in ipairs(tabpages) do
|
for _, tab in ipairs(tabpages) do
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_get_name(buf) == path then
|
if vim.api.nvim_buf_get_name(buf) == path then
|
||||||
vim.api.nvim_set_current_tabpage(tab) -- jump to tab
|
vim.api.nvim_set_current_tabpage(tab) -- jump to tab
|
||||||
vim.api.nvim_set_current_win(win) -- jump to window
|
vim.api.nvim_set_current_win(win) -- jump to window
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- 2. If current tab has an empty "No Name" buffer → reuse it
|
-- 2. If current tab has an empty "No Name" buffer → reuse it
|
||||||
local wins = vim.api.nvim_tabpage_list_wins(0)
|
local wins = vim.api.nvim_tabpage_list_wins(0)
|
||||||
for _, win in ipairs(wins) do
|
for _, win in ipairs(wins) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
local name = vim.api.nvim_buf_get_name(buf)
|
local name = vim.api.nvim_buf_get_name(buf)
|
||||||
local buftype = vim.api.nvim_buf_get_option(buf, 'buftype')
|
local buftype = vim.api.nvim_buf_get_option(buf, 'buftype')
|
||||||
local modified = vim.api.nvim_buf_get_option(buf, 'modified')
|
local modified = vim.api.nvim_buf_get_option(buf, 'modified')
|
||||||
if name == '' and buftype == '' and not modified then
|
if name == '' and buftype == '' and not modified then
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- 3. Otherwise → open in a new tab
|
-- 3. Otherwise → open in a new tab
|
||||||
vim.cmd('tabnew ' .. vim.fn.fnameescape(path))
|
vim.cmd('tabnew ' .. vim.fn.fnameescape(path))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Split option in Telescope file picker with smart_open
|
-- Split option in Telescope file picker with smart_open
|
||||||
local actions = require 'telescope.actions'
|
local actions = require 'telescope.actions'
|
||||||
local action_state = require 'telescope.actions.state'
|
local action_state = require 'telescope.actions.state'
|
||||||
|
|
||||||
local function smart_open_split(prompt_bufnr, split_type)
|
local function smart_open_split(prompt_bufnr, split_type)
|
||||||
local entry = action_state.get_selected_entry()
|
local entry = action_state.get_selected_entry()
|
||||||
if not entry then
|
if not entry then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local path = entry.path or entry.filename
|
local path = entry.path or entry.filename
|
||||||
if not path then
|
if not path then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if prompt_bufnr and vim.api.nvim_buf_is_valid(prompt_bufnr) then
|
if prompt_bufnr and vim.api.nvim_buf_is_valid(prompt_bufnr) then
|
||||||
pcall(actions.close, prompt_bufnr)
|
pcall(actions.close, prompt_bufnr)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Check if file is already open
|
-- Check if file is already open
|
||||||
local open_tab, open_win
|
local open_tab, open_win
|
||||||
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_get_name(buf) == path then
|
if vim.api.nvim_buf_get_name(buf) == path then
|
||||||
open_tab = tab
|
open_tab = tab
|
||||||
open_win = win
|
open_win = win
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if open_tab then
|
if open_tab then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if open_tab then
|
if open_tab then
|
||||||
local choice = vim.fn.confirm('File is already open in a tab. Open split here anyway?', '&Yes\n&No', 2)
|
local choice = vim.fn.confirm('File is already open in a tab. Open split here anyway?', '&Yes\n&No', 2)
|
||||||
if choice ~= 1 then
|
if choice ~= 1 then
|
||||||
-- User chose No → jump to the tab where file is open
|
-- User chose No → jump to the tab where file is open
|
||||||
vim.api.nvim_set_current_tabpage(open_tab)
|
vim.api.nvim_set_current_tabpage(open_tab)
|
||||||
vim.api.nvim_set_current_win(open_win)
|
vim.api.nvim_set_current_win(open_win)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- Else user chose Yes → continue to open split in current tab
|
-- Else user chose Yes → continue to open split in current tab
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Open in split
|
-- Open in split
|
||||||
if split_type == 'v' then
|
if split_type == 'v' then
|
||||||
-- horizontal → always below
|
-- horizontal → always below
|
||||||
vim.cmd('belowright split ' .. vim.fn.fnameescape(path))
|
vim.cmd('belowright split ' .. vim.fn.fnameescape(path))
|
||||||
elseif split_type == 'h' then
|
elseif split_type == 'h' then
|
||||||
-- vertical → always right
|
-- vertical → always right
|
||||||
vim.cmd('vertical rightbelow split ' .. vim.fn.fnameescape(path))
|
vim.cmd('vertical rightbelow split ' .. vim.fn.fnameescape(path))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Telescope keymap using Smart Open
|
-- Telescope keymap using Smart Open
|
||||||
vim.keymap.set('n', '<leader>sf', function()
|
vim.keymap.set('n', '<leader>sf', function()
|
||||||
require('telescope.builtin').find_files {
|
require('telescope.builtin').find_files {
|
||||||
attach_mappings = function(_, map)
|
attach_mappings = function(_, map)
|
||||||
map('i', '<CR>', function(prompt_bufnr)
|
map('i', '<CR>', function(prompt_bufnr)
|
||||||
smart_open(prompt_bufnr)
|
smart_open(prompt_bufnr)
|
||||||
end)
|
end)
|
||||||
map('n', '<CR>', function(prompt_bufnr)
|
map('n', '<CR>', function(prompt_bufnr)
|
||||||
smart_open(prompt_bufnr)
|
smart_open(prompt_bufnr)
|
||||||
end)
|
end)
|
||||||
-- Horizontal split with 'h'
|
-- Horizontal split with 'h'
|
||||||
map('n', 'h', function(prompt_bufnr)
|
map('n', 'h', function(prompt_bufnr)
|
||||||
smart_open_split(prompt_bufnr, 'h')
|
smart_open_split(prompt_bufnr, 'h')
|
||||||
end)
|
end)
|
||||||
-- Vertical split with 'v'
|
-- Vertical split with 'v'
|
||||||
map('n', 'v', function(prompt_bufnr)
|
map('n', 'v', function(prompt_bufnr)
|
||||||
smart_open_split(prompt_bufnr, 'v')
|
smart_open_split(prompt_bufnr, 'v')
|
||||||
end)
|
end)
|
||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end, { desc = '[S]earch [F]iles (Smart Open)' })
|
end, { desc = '[S]earch [F]iles (Smart Open)' })
|
||||||
|
|
||||||
-- Telescope live_grep in git root
|
-- Telescope live_grep in git root
|
||||||
-- Function to find the git root directory based on the current buffer's path
|
-- Function to find the git root directory based on the current buffer's path
|
||||||
local function find_git_root()
|
local function find_git_root()
|
||||||
-- Use the current buffer's path as the starting point for the git search
|
-- 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_file = vim.api.nvim_buf_get_name(0)
|
||||||
local current_dir
|
local current_dir
|
||||||
local cwd = vim.fn.getcwd()
|
local cwd = vim.fn.getcwd()
|
||||||
-- If the buffer is not associated with a file, return nil
|
-- If the buffer is not associated with a file, return nil
|
||||||
if current_file == '' then
|
if current_file == '' then
|
||||||
current_dir = cwd
|
current_dir = cwd
|
||||||
else
|
else
|
||||||
-- Extract the directory from the current file's path
|
-- Extract the directory from the current file's path
|
||||||
current_dir = vim.fn.fnamemodify(current_file, ':h')
|
current_dir = vim.fn.fnamemodify(current_file, ':h')
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Find the Git root directory from the current file's path
|
-- 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]
|
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
|
if vim.v.shell_error ~= 0 then
|
||||||
print 'Not a git repository. Searching on current working directory'
|
print 'Not a git repository. Searching on current working directory'
|
||||||
return cwd
|
return cwd
|
||||||
end
|
end
|
||||||
return git_root
|
return git_root
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Custom live_grep function to search in git root
|
-- Custom live_grep function to search in git root
|
||||||
local function live_grep_git_root()
|
local function live_grep_git_root()
|
||||||
local git_root = find_git_root()
|
local git_root = find_git_root()
|
||||||
if git_root then
|
if git_root then
|
||||||
require('telescope.builtin').live_grep {
|
require('telescope.builtin').live_grep {
|
||||||
search_dirs = { git_root },
|
search_dirs = { git_root },
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
vim.api.nvim_create_user_command('LiveGrepGitRoot', live_grep_git_root, {})
|
vim.api.nvim_create_user_command('LiveGrepGitRoot', live_grep_git_root, {})
|
||||||
|
|
||||||
-- See `:help telescope.builtin`
|
-- See `:help telescope.builtin`
|
||||||
vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' })
|
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><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' })
|
||||||
vim.keymap.set('n', '<leader>/', function()
|
vim.keymap.set('n', '<leader>/', function()
|
||||||
-- You can pass additional configuration to telescope to change theme, layout, etc.
|
-- You can pass additional configuration to telescope to change theme, layout, etc.
|
||||||
require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
|
require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
|
||||||
winblend = 10,
|
winblend = 10,
|
||||||
previewer = false,
|
previewer = false,
|
||||||
})
|
})
|
||||||
end, { desc = '[/] Fuzzily search in current buffer' })
|
end, { desc = '[/] Fuzzily search in current buffer' })
|
||||||
|
|
||||||
local function telescope_live_grep_open_files()
|
local function telescope_live_grep_open_files()
|
||||||
require('telescope.builtin').live_grep {
|
require('telescope.builtin').live_grep {
|
||||||
grep_open_files = true,
|
grep_open_files = true,
|
||||||
prompt_title = 'Live Grep in Open Files',
|
prompt_title = 'Live Grep in Open Files',
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
vim.keymap.set('n', '<leader>s/', telescope_live_grep_open_files, { desc = '[S]earch [/] in Open Files' })
|
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>ss', require('telescope.builtin').builtin, { desc = '[S]earch [S]elect Telescope' })
|
||||||
vim.keymap.set('n', '<leader>gf', function()
|
vim.keymap.set('n', '<leader>gf', function()
|
||||||
local is_git_dir = vim.fn.system('git rev-parse --is-inside-work-tree'):gsub('%s+', '') == 'true'
|
local is_git_dir = vim.fn.system('git rev-parse --is-inside-work-tree'):gsub('%s+', '') == 'true'
|
||||||
if not is_git_dir then
|
if not is_git_dir then
|
||||||
vim.notify('Not a git repository', vim.log.levels.WARN, { title = 'Telescope Git Files' })
|
vim.notify('Not a git repository', vim.log.levels.WARN, { title = 'Telescope Git Files' })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
require('telescope.builtin').git_files {
|
require('telescope.builtin').git_files {
|
||||||
attach_mappings = function(_, map)
|
attach_mappings = function(_, map)
|
||||||
local actions = require 'telescope.actions'
|
local actions = require 'telescope.actions'
|
||||||
local action_state = require 'telescope.actions.state'
|
local action_state = require 'telescope.actions.state'
|
||||||
|
|
||||||
local function open_smart(prompt_bufnr)
|
local function open_smart(prompt_bufnr)
|
||||||
local entry = action_state.get_selected_entry()
|
local entry = action_state.get_selected_entry()
|
||||||
if not entry then
|
if not entry then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
pcall(actions.close, prompt_bufnr)
|
pcall(actions.close, prompt_bufnr)
|
||||||
smart_open(prompt_bufnr)
|
smart_open(prompt_bufnr)
|
||||||
end
|
end
|
||||||
|
|
||||||
map('i', '<CR>', open_smart)
|
map('i', '<CR>', open_smart)
|
||||||
map('n', '<CR>', open_smart)
|
map('n', '<CR>', open_smart)
|
||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end, { desc = 'Search [G]it [F]iles (Smart Open)' })
|
end, { desc = 'Search [G]it [F]iles (Smart Open)' })
|
||||||
vim.keymap.set('n', '<leader>si', require('telescope.builtin').help_tags, { desc = '[S]earch [I]nfo' })
|
vim.keymap.set('n', '<leader>si', require('telescope.builtin').help_tags, { desc = '[S]earch [I]nfo' })
|
||||||
vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' })
|
vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' })
|
||||||
vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' })
|
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' })
|
vim.keymap.set('n', '<leader>sG', ':LiveGrepGitRoot<cr>', { desc = '[S]earch by [G]rep on Git Root' })
|
||||||
vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' })
|
vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' })
|
||||||
vim.keymap.set('n', '<leader>sr', require('telescope.builtin').resume, { desc = '[S]earch [R]esume' })
|
vim.keymap.set('n', '<leader>sr', require('telescope.builtin').resume, { desc = '[S]earch [R]esume' })
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
-- lua/custom/plugins/undotree.lua
|
-- lua/custom/plugins/undotree.lua
|
||||||
return {
|
return {
|
||||||
'mbbill/undotree',
|
'mbbill/undotree',
|
||||||
keys = {
|
keys = {
|
||||||
{ '<leader>u', vim.cmd.UndotreeToggle, desc = 'Toggle UndoTree' },
|
{ '<leader>u', vim.cmd.UndotreeToggle, desc = 'Toggle UndoTree' },
|
||||||
},
|
},
|
||||||
config = function()
|
config = function()
|
||||||
-- Optional settings
|
-- Optional settings
|
||||||
vim.g.undotree_WindowLayout = 2 -- vertical split
|
vim.g.undotree_WindowLayout = 2 -- vertical split
|
||||||
vim.g.undotree_SplitWidth = 30 -- width of undo tree window
|
vim.g.undotree_SplitWidth = 30 -- width of undo tree window
|
||||||
vim.g.undotree_SetFocusWhenToggle = 1
|
vim.g.undotree_SetFocusWhenToggle = 1
|
||||||
vim.g.undotree_EnableDiff = 1
|
vim.g.undotree_EnableDiff = 1
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
390
lua/keymaps.lua
390
lua/keymaps.lua
@@ -9,19 +9,19 @@ vim.keymap.set('n', 'N', 'Nzzzv')
|
|||||||
|
|
||||||
-- [[ Replace all occurrences of the word under cursor ]]
|
-- [[ Replace all occurrences of the word under cursor ]]
|
||||||
vim.keymap.set('n', '<leader>F', function()
|
vim.keymap.set('n', '<leader>F', function()
|
||||||
-- Save current cursor position
|
-- Save current cursor position
|
||||||
local pos = vim.api.nvim_win_get_cursor(0)
|
local pos = vim.api.nvim_win_get_cursor(0)
|
||||||
-- Get the word under the cursor
|
-- Get the word under the cursor
|
||||||
local word = vim.fn.expand '<cword>'
|
local word = vim.fn.expand '<cword>'
|
||||||
-- Ask user for the replacement
|
-- Ask user for the replacement
|
||||||
local replacement = vim.fn.input("Replace '" .. word .. "' with: ")
|
local replacement = vim.fn.input("Replace '" .. word .. "' with: ")
|
||||||
-- If user typed something, do the substitution
|
-- If user typed something, do the substitution
|
||||||
if replacement ~= '' then
|
if replacement ~= '' then
|
||||||
-- %%s/.../.../gI = substitute globally, case-insensitive
|
-- %%s/.../.../gI = substitute globally, case-insensitive
|
||||||
vim.cmd(string.format('%%s/\\<%s\\>/%s/gI', word, replacement))
|
vim.cmd(string.format('%%s/\\<%s\\>/%s/gI', word, replacement))
|
||||||
end
|
end
|
||||||
-- Restore cursor position
|
-- Restore cursor position
|
||||||
vim.api.nvim_win_set_cursor(0, pos)
|
vim.api.nvim_win_set_cursor(0, pos)
|
||||||
end, { desc = 'Replace all occurrences of word under cursor' })
|
end, { desc = 'Replace all occurrences of word under cursor' })
|
||||||
|
|
||||||
-- [[ Basic Keymaps ]]
|
-- [[ Basic Keymaps ]]
|
||||||
@@ -48,79 +48,79 @@ vim.keymap.set('n', '<leader>t', '<Cmd>tabnew +term<CR>i')
|
|||||||
|
|
||||||
-- [[ Create an empty buffer in a new tab ]]
|
-- [[ Create an empty buffer in a new tab ]]
|
||||||
vim.keymap.set('n', '<Leader>e', function()
|
vim.keymap.set('n', '<Leader>e', function()
|
||||||
vim.cmd 'tabnew' -- create a new tab
|
vim.cmd 'tabnew' -- create a new tab
|
||||||
vim.cmd 'enew' -- create a new empty buffer in it
|
vim.cmd 'enew' -- create a new empty buffer in it
|
||||||
end, { noremap = true, silent = true })
|
end, { noremap = true, silent = true })
|
||||||
|
|
||||||
-- [[ Horizontal split with new empty buffer below ]]
|
-- [[ Horizontal split with new empty buffer below ]]
|
||||||
vim.keymap.set('n', '<leader>sv', function()
|
vim.keymap.set('n', '<leader>sv', function()
|
||||||
vim.cmd 'split' -- create horizontal split (above by default)
|
vim.cmd 'split' -- create horizontal split (above by default)
|
||||||
vim.cmd 'wincmd j' -- move to the new split below
|
vim.cmd 'wincmd j' -- move to the new split below
|
||||||
vim.cmd 'enew' -- open new empty buffer
|
vim.cmd 'enew' -- open new empty buffer
|
||||||
end, { desc = 'New buffer in horizontal split (below)' })
|
end, { desc = 'New buffer in horizontal split (below)' })
|
||||||
|
|
||||||
-- [[ Vertical split with new empty buffer to the right ]]
|
-- [[ Vertical split with new empty buffer to the right ]]
|
||||||
vim.keymap.set('n', '<leader>sh', function()
|
vim.keymap.set('n', '<leader>sh', function()
|
||||||
vim.cmd 'vsplit' -- create vertical split (left by default)
|
vim.cmd 'vsplit' -- create vertical split (left by default)
|
||||||
vim.cmd 'wincmd l' -- move to the new split to the right
|
vim.cmd 'wincmd l' -- move to the new split to the right
|
||||||
vim.cmd 'enew' -- open new empty buffer
|
vim.cmd 'enew' -- open new empty buffer
|
||||||
end, { desc = 'New buffer in vertical split (right)' })
|
end, { desc = 'New buffer in vertical split (right)' })
|
||||||
|
|
||||||
-- [[ Save current buffer (asks for filename if new/unsaved) ]]
|
-- [[ Save current buffer (asks for filename if new/unsaved) ]]
|
||||||
vim.keymap.set('n', '<leader>w', function()
|
vim.keymap.set('n', '<leader>w', function()
|
||||||
if vim.api.nvim_buf_get_name(0) == '' then
|
if vim.api.nvim_buf_get_name(0) == '' then
|
||||||
-- Ask user for a filename
|
-- Ask user for a filename
|
||||||
local filename = vim.fn.input('Save as: ', '', 'file')
|
local filename = vim.fn.input('Save as: ', '', 'file')
|
||||||
if filename ~= '' then
|
if filename ~= '' then
|
||||||
vim.cmd('saveas ' .. vim.fn.fnameescape(filename))
|
vim.cmd('saveas ' .. vim.fn.fnameescape(filename))
|
||||||
else
|
else
|
||||||
print 'Save cancelled'
|
print 'Save cancelled'
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
vim.cmd 'w'
|
vim.cmd 'w'
|
||||||
end
|
end
|
||||||
end, { desc = 'Save buffer (prompt if new file)' })
|
end, { desc = 'Save buffer (prompt if new file)' })
|
||||||
|
|
||||||
-- [[ Close current window (asks if buffer is unsaved) ]]
|
-- [[ Close current window (asks if buffer is unsaved) ]]
|
||||||
vim.keymap.set('n', '<leader>q', function()
|
vim.keymap.set('n', '<leader>q', function()
|
||||||
if vim.bo.modified then
|
if vim.bo.modified then
|
||||||
local choice = vim.fn.input 'Buffer modified! Save (y), Discard (n), Cancel (any other key)? '
|
local choice = vim.fn.input 'Buffer modified! Save (y), Discard (n), Cancel (any other key)? '
|
||||||
if choice:lower() == 'y' then
|
if choice:lower() == 'y' then
|
||||||
if vim.api.nvim_buf_get_name(0) == '' then
|
if vim.api.nvim_buf_get_name(0) == '' then
|
||||||
local filename = vim.fn.input('Save as: ', '', 'file')
|
local filename = vim.fn.input('Save as: ', '', 'file')
|
||||||
if filename ~= '' then
|
if filename ~= '' then
|
||||||
vim.cmd('saveas ' .. vim.fn.fnameescape(filename))
|
vim.cmd('saveas ' .. vim.fn.fnameescape(filename))
|
||||||
vim.cmd 'q'
|
vim.cmd 'q'
|
||||||
else
|
else
|
||||||
print 'Save cancelled'
|
print 'Save cancelled'
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
vim.cmd 'wq'
|
vim.cmd 'wq'
|
||||||
end
|
end
|
||||||
elseif choice:lower() == 'n' then
|
elseif choice:lower() == 'n' then
|
||||||
vim.cmd 'q!'
|
vim.cmd 'q!'
|
||||||
else
|
else
|
||||||
print 'Quit cancelled'
|
print 'Quit cancelled'
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
vim.cmd 'q'
|
vim.cmd 'q'
|
||||||
end
|
end
|
||||||
end, { desc = 'Close buffer (prompt if modified)' })
|
end, { desc = 'Close buffer (prompt if modified)' })
|
||||||
|
|
||||||
-- [[ Save changes and close current window (asks for filename if new/unsaved) ]]
|
-- [[ Save changes and close current window (asks for filename if new/unsaved) ]]
|
||||||
vim.keymap.set('n', '<leader>qy', function()
|
vim.keymap.set('n', '<leader>qy', function()
|
||||||
if vim.api.nvim_buf_get_name(0) == '' then
|
if vim.api.nvim_buf_get_name(0) == '' then
|
||||||
-- Ask user for a filename
|
-- Ask user for a filename
|
||||||
local filename = vim.fn.input('Save as: ', '', 'file')
|
local filename = vim.fn.input('Save as: ', '', 'file')
|
||||||
if filename ~= '' then
|
if filename ~= '' then
|
||||||
vim.cmd('saveas ' .. vim.fn.fnameescape(filename))
|
vim.cmd('saveas ' .. vim.fn.fnameescape(filename))
|
||||||
vim.cmd 'q'
|
vim.cmd 'q'
|
||||||
else
|
else
|
||||||
print 'Save cancelled'
|
print 'Save cancelled'
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
vim.cmd 'wq'
|
vim.cmd 'wq'
|
||||||
end
|
end
|
||||||
end, { desc = 'Save & quit (prompt if new file)' })
|
end, { desc = 'Save & quit (prompt if new file)' })
|
||||||
|
|
||||||
-- [[ Discard changes and Close current window ]]
|
-- [[ Discard changes and Close current window ]]
|
||||||
@@ -137,77 +137,77 @@ vim.keymap.set('n', '<leader>ll', 'ggVG', { desc = 'Select all' })
|
|||||||
|
|
||||||
-- [[ Select all and copy to clipboard ]]
|
-- [[ Select all and copy to clipboard ]]
|
||||||
vim.keymap.set('n', '<leader>lY', function()
|
vim.keymap.set('n', '<leader>lY', function()
|
||||||
-- Get all lines from the buffer
|
-- Get all lines from the buffer
|
||||||
local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
|
local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
|
||||||
-- Join them without adding an extra newline
|
-- Join them without adding an extra newline
|
||||||
local content = table.concat(lines, '\n')
|
local content = table.concat(lines, '\n')
|
||||||
-- Set to system clipboard
|
-- Set to system clipboard
|
||||||
vim.fn.setreg('+', content)
|
vim.fn.setreg('+', content)
|
||||||
vim.fn.setreg('*', content)
|
vim.fn.setreg('*', content)
|
||||||
-- Notify
|
-- Notify
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
vim.notify('Copied all to clipboard', vim.log.levels.INFO)
|
vim.notify('Copied all to clipboard', vim.log.levels.INFO)
|
||||||
end)
|
end)
|
||||||
end, { desc = 'Copy all to clipboard' })
|
end, { desc = 'Copy all to clipboard' })
|
||||||
|
|
||||||
-- [[ Copy to clipboard ]]
|
-- [[ Copy to clipboard ]]
|
||||||
-- Normal mode: copy current line
|
-- Normal mode: copy current line
|
||||||
vim.keymap.set('n', 'Y', function()
|
vim.keymap.set('n', 'Y', function()
|
||||||
local line = vim.api.nvim_get_current_line()
|
local line = vim.api.nvim_get_current_line()
|
||||||
vim.fn.setreg('+', line)
|
vim.fn.setreg('+', line)
|
||||||
vim.fn.setreg('*', line)
|
vim.fn.setreg('*', line)
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
vim.notify('Copied line to clipboard', vim.log.levels.INFO)
|
vim.notify('Copied line to clipboard', vim.log.levels.INFO)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
-- Visual mode: copy selection, trim trailing newline if needed
|
-- Visual mode: copy selection, trim trailing newline if needed
|
||||||
vim.keymap.set('x', 'Y', [["+y<esc>:lua require("copy_to_clipboard_fix").trim_clipboard()<CR>]])
|
vim.keymap.set('x', 'Y', [["+y<esc>:lua require("copy_to_clipboard_fix").trim_clipboard()<CR>]])
|
||||||
|
|
||||||
-- [[ Paste from clipboard with line count ]]
|
-- [[ Paste from clipboard with line count ]]
|
||||||
local function paste_from_clipboard()
|
local function paste_from_clipboard()
|
||||||
local lines = vim.fn.getreg('+', 1, true)
|
local lines = vim.fn.getreg('+', 1, true)
|
||||||
local line_count = #lines
|
local line_count = #lines
|
||||||
local mode = vim.fn.mode()
|
local mode = vim.fn.mode()
|
||||||
if mode:match '[vV\22]' then
|
if mode:match '[vV\22]' then
|
||||||
-- Visual mode: get selection range reliably
|
-- Visual mode: get selection range reliably
|
||||||
local start_line = math.min(vim.fn.getpos('v')[2], vim.fn.getpos('.')[2]) - 1
|
local start_line = math.min(vim.fn.getpos('v')[2], vim.fn.getpos('.')[2]) - 1
|
||||||
local end_line = math.max(vim.fn.getpos('v')[2], vim.fn.getpos('.')[2])
|
local end_line = math.max(vim.fn.getpos('v')[2], vim.fn.getpos('.')[2])
|
||||||
-- Replace selection
|
-- Replace selection
|
||||||
vim.api.nvim_buf_set_lines(0, start_line, end_line, false, lines)
|
vim.api.nvim_buf_set_lines(0, start_line, end_line, false, lines)
|
||||||
-- Exit visual mode
|
-- Exit visual mode
|
||||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('<Esc>', true, false, true), 'n', true)
|
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('<Esc>', true, false, true), 'n', true)
|
||||||
-- Notify after visual mode exit
|
-- Notify after visual mode exit
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
vim.notify(line_count .. ' line' .. (line_count > 1 and 's' or '') .. ' pasted from clipboard', vim.log.levels.INFO)
|
vim.notify(line_count .. ' line' .. (line_count > 1 and 's' or '') .. ' pasted from clipboard', vim.log.levels.INFO)
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
-- Normal mode: paste at cursor, characterwise
|
-- Normal mode: paste at cursor, characterwise
|
||||||
vim.api.nvim_put(lines, 'c', true, true)
|
vim.api.nvim_put(lines, 'c', true, true)
|
||||||
-- Notify
|
-- Notify
|
||||||
vim.schedule(function()
|
vim.schedule(function()
|
||||||
vim.notify(line_count .. ' line' .. (line_count > 1 and 's' or '') .. ' pasted from clipboard', vim.log.levels.INFO)
|
vim.notify(line_count .. ' line' .. (line_count > 1 and 's' or '') .. ' pasted from clipboard', vim.log.levels.INFO)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
vim.keymap.set('n', '<leader>P', paste_from_clipboard, { desc = 'Paste from clipboard' })
|
vim.keymap.set('n', '<leader>P', paste_from_clipboard, { desc = 'Paste from clipboard' })
|
||||||
vim.keymap.set('x', '<leader>P', paste_from_clipboard, { desc = 'Paste from clipboard' })
|
vim.keymap.set('x', '<leader>P', paste_from_clipboard, { desc = 'Paste from clipboard' })
|
||||||
|
|
||||||
-- [[ Paste at cursor inline ]]
|
-- [[ Paste at cursor inline ]]
|
||||||
vim.keymap.set('n', '<leader>p', function()
|
vim.keymap.set('n', '<leader>p', function()
|
||||||
-- Get unnamed register
|
-- Get unnamed register
|
||||||
local content = vim.fn.getreg '"'
|
local content = vim.fn.getreg '"'
|
||||||
if content == '' then
|
if content == '' then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- Flatten multi-line content into a single string
|
-- Flatten multi-line content into a single string
|
||||||
content = content:gsub('\n', '') -- remove all newlines
|
content = content:gsub('\n', '') -- remove all newlines
|
||||||
-- Insert inline at cursor
|
-- Insert inline at cursor
|
||||||
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
|
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||||
local line = vim.api.nvim_get_current_line()
|
local line = vim.api.nvim_get_current_line()
|
||||||
local new_line = line:sub(1, col) .. content .. line:sub(col + 1)
|
local new_line = line:sub(1, col) .. content .. line:sub(col + 1)
|
||||||
vim.api.nvim_set_current_line(new_line)
|
vim.api.nvim_set_current_line(new_line)
|
||||||
-- Move cursor to end of pasted text
|
-- Move cursor to end of pasted text
|
||||||
vim.api.nvim_win_set_cursor(0, { row, col + #content })
|
vim.api.nvim_win_set_cursor(0, { row, col + #content })
|
||||||
end, { desc = 'Paste at cursor inline' })
|
end, { desc = 'Paste at cursor inline' })
|
||||||
|
|
||||||
-- [ In Visual Mode, paste over selection without yanking ]
|
-- [ In Visual Mode, paste over selection without yanking ]
|
||||||
@@ -221,92 +221,92 @@ local actions = require 'telescope.actions'
|
|||||||
local action_state = require 'telescope.actions.state'
|
local action_state = require 'telescope.actions.state'
|
||||||
local builtin = require 'telescope.builtin'
|
local builtin = require 'telescope.builtin'
|
||||||
local function smart_open_buffer()
|
local function smart_open_buffer()
|
||||||
builtin.buffers {
|
builtin.buffers {
|
||||||
attach_mappings = function(_, map)
|
attach_mappings = function(_, map)
|
||||||
local function open_selected(prompt_bufnr)
|
local function open_selected(prompt_bufnr)
|
||||||
local entry = action_state.get_selected_entry()
|
local entry = action_state.get_selected_entry()
|
||||||
if not entry then
|
if not entry then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
actions.close(prompt_bufnr)
|
actions.close(prompt_bufnr)
|
||||||
local bufname = vim.api.nvim_buf_get_name(entry.bufnr)
|
local bufname = vim.api.nvim_buf_get_name(entry.bufnr)
|
||||||
if bufname == '' then
|
if bufname == '' then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- Check all windows in current tab
|
-- Check all windows in current tab
|
||||||
local current_tab = vim.api.nvim_get_current_tabpage()
|
local current_tab = vim.api.nvim_get_current_tabpage()
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(current_tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(current_tab)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_get_name(buf) == bufname then
|
if vim.api.nvim_buf_get_name(buf) == bufname then
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Check other tabs
|
-- Check other tabs
|
||||||
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
||||||
if tab ~= current_tab then
|
if tab ~= current_tab then
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_get_name(buf) == bufname then
|
if vim.api.nvim_buf_get_name(buf) == bufname then
|
||||||
-- Switch tab first, then window
|
-- Switch tab first, then window
|
||||||
vim.api.nvim_set_current_tabpage(tab)
|
vim.api.nvim_set_current_tabpage(tab)
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Not open anywhere → open in current window
|
-- Not open anywhere → open in current window
|
||||||
vim.cmd('buffer ' .. entry.bufnr)
|
vim.cmd('buffer ' .. entry.bufnr)
|
||||||
end
|
end
|
||||||
map('i', '<CR>', open_selected)
|
map('i', '<CR>', open_selected)
|
||||||
map('n', '<CR>', open_selected)
|
map('n', '<CR>', open_selected)
|
||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
-- Map it to <leader><leader>
|
-- Map it to <leader><leader>
|
||||||
vim.keymap.set('n', '<leader><leader>', smart_open_buffer, { desc = 'Switch to Open Buffers' })
|
vim.keymap.set('n', '<leader><leader>', smart_open_buffer, { desc = 'Switch to Open Buffers' })
|
||||||
-- which-key, register it to show a description
|
-- which-key, register it to show a description
|
||||||
require('which-key').register {
|
require('which-key').register {
|
||||||
['<leader><leader>'] = { smart_open_buffer, 'Switch to Open Buffers' },
|
['<leader><leader>'] = { smart_open_buffer, 'Switch to Open Buffers' },
|
||||||
}
|
}
|
||||||
|
|
||||||
-- [[ Smart open a file path, reusing empty buffers or tabs if possible ]]
|
-- [[ Smart open a file path, reusing empty buffers or tabs if possible ]]
|
||||||
local function smart_open_file(path)
|
local function smart_open_file(path)
|
||||||
if not path or path == '' then
|
if not path or path == '' then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
path = vim.fn.fnamemodify(path, ':p') -- make absolute
|
path = vim.fn.fnamemodify(path, ':p') -- make absolute
|
||||||
-- 1. If file is already open → jump to it
|
-- 1. If file is already open → jump to it
|
||||||
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(tab)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
if vim.api.nvim_buf_get_name(buf) == path then
|
if vim.api.nvim_buf_get_name(buf) == path then
|
||||||
vim.api.nvim_set_current_tabpage(tab)
|
vim.api.nvim_set_current_tabpage(tab)
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- 2. If current tab has an empty "No Name" buffer → reuse it
|
-- 2. If current tab has an empty "No Name" buffer → reuse it
|
||||||
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
|
for _, win in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
local name = vim.api.nvim_buf_get_name(buf)
|
local name = vim.api.nvim_buf_get_name(buf)
|
||||||
local buftype = vim.api.nvim_buf_get_option(buf, 'buftype')
|
local buftype = vim.api.nvim_buf_get_option(buf, 'buftype')
|
||||||
local modified = vim.api.nvim_buf_get_option(buf, 'modified')
|
local modified = vim.api.nvim_buf_get_option(buf, 'modified')
|
||||||
if name == '' and buftype == '' and not modified then
|
if name == '' and buftype == '' and not modified then
|
||||||
vim.api.nvim_set_current_win(win)
|
vim.api.nvim_set_current_win(win)
|
||||||
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
vim.cmd('edit ' .. vim.fn.fnameescape(path))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- 3. Otherwise → open in a new tab
|
-- 3. Otherwise → open in a new tab
|
||||||
vim.cmd('tabedit ' .. vim.fn.fnameescape(path))
|
vim.cmd('tabedit ' .. vim.fn.fnameescape(path))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [[ Remap gf to use smart_open_file ]]
|
-- [[ Remap gf to use smart_open_file ]]
|
||||||
vim.keymap.set('n', 'gf', function()
|
vim.keymap.set('n', 'gf', function()
|
||||||
local path = vim.fn.expand '<cfile>' -- get file under cursor
|
local path = vim.fn.expand '<cfile>' -- get file under cursor
|
||||||
smart_open_file(path)
|
smart_open_file(path)
|
||||||
end, { desc = 'Smart gf: open file under cursor in new tab or reuse buffer' })
|
end, { desc = 'Smart gf: open file under cursor in new tab or reuse buffer' })
|
||||||
|
|||||||
@@ -4,76 +4,76 @@
|
|||||||
-- Adds additional commands as well to manage the behavior
|
-- Adds additional commands as well to manage the behavior
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'neovim/nvim-lspconfig',
|
'neovim/nvim-lspconfig',
|
||||||
config = function()
|
config = function()
|
||||||
-- Skip setting up LSP autoformatting if conform.nvim is being used
|
-- Skip setting up LSP autoformatting if conform.nvim is being used
|
||||||
if package.loaded['conform'] then
|
if package.loaded['conform'] then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Switch for controlling whether you want autoformatting.
|
-- Switch for controlling whether you want autoformatting.
|
||||||
-- Use :KickstartFormatToggle to toggle autoformatting on or off
|
-- Use :KickstartFormatToggle to toggle autoformatting on or off
|
||||||
local format_is_enabled = true
|
local format_is_enabled = true
|
||||||
vim.api.nvim_create_user_command('KickstartFormatToggle', function()
|
vim.api.nvim_create_user_command('KickstartFormatToggle', function()
|
||||||
format_is_enabled = not format_is_enabled
|
format_is_enabled = not format_is_enabled
|
||||||
print('Setting autoformatting to: ' .. tostring(format_is_enabled))
|
print('Setting autoformatting to: ' .. tostring(format_is_enabled))
|
||||||
end, {})
|
end, {})
|
||||||
|
|
||||||
-- Create an augroup that is used for managing our formatting autocmds.
|
-- Create an augroup that is used for managing our formatting autocmds.
|
||||||
-- We need one augroup per client to make sure that multiple clients
|
-- We need one augroup per client to make sure that multiple clients
|
||||||
-- can attach to the same buffer without interfering with each other.
|
-- can attach to the same buffer without interfering with each other.
|
||||||
local _augroups = {}
|
local _augroups = {}
|
||||||
local get_augroup = function(client)
|
local get_augroup = function(client)
|
||||||
if not _augroups[client.id] then
|
if not _augroups[client.id] then
|
||||||
local group_name = 'kickstart-lsp-format-' .. client.name
|
local group_name = 'kickstart-lsp-format-' .. client.name
|
||||||
local id = vim.api.nvim_create_augroup(group_name, { clear = true })
|
local id = vim.api.nvim_create_augroup(group_name, { clear = true })
|
||||||
_augroups[client.id] = id
|
_augroups[client.id] = id
|
||||||
end
|
end
|
||||||
|
|
||||||
return _augroups[client.id]
|
return _augroups[client.id]
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Whenever an LSP attaches to a buffer, we will run this function.
|
-- Whenever an LSP attaches to a buffer, we will run this function.
|
||||||
--
|
--
|
||||||
-- See `:help LspAttach` for more information about this autocmd event.
|
-- See `:help LspAttach` for more information about this autocmd event.
|
||||||
vim.api.nvim_create_autocmd('LspAttach', {
|
vim.api.nvim_create_autocmd('LspAttach', {
|
||||||
group = vim.api.nvim_create_augroup('kickstart-lsp-attach-format', { clear = true }),
|
group = vim.api.nvim_create_augroup('kickstart-lsp-attach-format', { clear = true }),
|
||||||
-- This is where we attach the autoformatting for reasonable clients
|
-- This is where we attach the autoformatting for reasonable clients
|
||||||
callback = function(args)
|
callback = function(args)
|
||||||
local client_id = args.data.client_id
|
local client_id = args.data.client_id
|
||||||
local client = vim.lsp.get_client_by_id(client_id)
|
local client = vim.lsp.get_client_by_id(client_id)
|
||||||
local bufnr = args.buf
|
local bufnr = args.buf
|
||||||
|
|
||||||
-- Only attach to clients that support document formatting
|
-- Only attach to clients that support document formatting
|
||||||
if not client.server_capabilities.documentFormattingProvider then
|
if not client.server_capabilities.documentFormattingProvider then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Tsserver usually works poorly. Sorry you work with bad languages
|
-- Tsserver usually works poorly. Sorry you work with bad languages
|
||||||
-- You can remove this line if you know what you're doing :)
|
-- You can remove this line if you know what you're doing :)
|
||||||
if client.name == 'tsserver' then
|
if client.name == 'tsserver' then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Create an autocmd that will run *before* we save the buffer.
|
-- Create an autocmd that will run *before* we save the buffer.
|
||||||
-- Run the formatting command for the LSP that has just attached.
|
-- Run the formatting command for the LSP that has just attached.
|
||||||
vim.api.nvim_create_autocmd('BufWritePre', {
|
vim.api.nvim_create_autocmd('BufWritePre', {
|
||||||
group = get_augroup(client),
|
group = get_augroup(client),
|
||||||
buffer = bufnr,
|
buffer = bufnr,
|
||||||
callback = function()
|
callback = function()
|
||||||
if not format_is_enabled then
|
if not format_is_enabled then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
vim.lsp.buf.format {
|
vim.lsp.buf.format {
|
||||||
async = false,
|
async = false,
|
||||||
filter = function(c)
|
filter = function(c)
|
||||||
return c.id == client.id
|
return c.id == client.id
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,81 +7,81 @@
|
|||||||
-- kickstart.nvim and not kitchen-sink.nvim ;)
|
-- kickstart.nvim and not kitchen-sink.nvim ;)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
-- NOTE: Yes, you can install new plugins here!
|
-- NOTE: Yes, you can install new plugins here!
|
||||||
'mfussenegger/nvim-dap',
|
'mfussenegger/nvim-dap',
|
||||||
-- NOTE: And you can specify dependencies as well
|
-- NOTE: And you can specify dependencies as well
|
||||||
dependencies = {
|
dependencies = {
|
||||||
-- Creates a beautiful debugger UI
|
-- Creates a beautiful debugger UI
|
||||||
'rcarriga/nvim-dap-ui',
|
'rcarriga/nvim-dap-ui',
|
||||||
|
|
||||||
-- Installs the debug adapters for you
|
-- Installs the debug adapters for you
|
||||||
'williamboman/mason.nvim',
|
'williamboman/mason.nvim',
|
||||||
'jay-babu/mason-nvim-dap.nvim',
|
'jay-babu/mason-nvim-dap.nvim',
|
||||||
|
|
||||||
-- Add your own debuggers here
|
-- Add your own debuggers here
|
||||||
'leoluz/nvim-dap-go',
|
'leoluz/nvim-dap-go',
|
||||||
},
|
},
|
||||||
config = function()
|
config = function()
|
||||||
local dap = require 'dap'
|
local dap = require 'dap'
|
||||||
local dapui = require 'dapui'
|
local dapui = require 'dapui'
|
||||||
|
|
||||||
require('mason-nvim-dap').setup {
|
require('mason-nvim-dap').setup {
|
||||||
-- Makes a best effort to setup the various debuggers with
|
-- Makes a best effort to setup the various debuggers with
|
||||||
-- reasonable debug configurations
|
-- reasonable debug configurations
|
||||||
automatic_setup = true,
|
automatic_setup = true,
|
||||||
|
|
||||||
-- You can provide additional configuration to the handlers,
|
-- You can provide additional configuration to the handlers,
|
||||||
-- see mason-nvim-dap README for more information
|
-- see mason-nvim-dap README for more information
|
||||||
handlers = {},
|
handlers = {},
|
||||||
|
|
||||||
-- You'll need to check that you have the required things installed
|
-- You'll need to check that you have the required things installed
|
||||||
-- online, please don't ask me how to install them :)
|
-- online, please don't ask me how to install them :)
|
||||||
ensure_installed = {
|
ensure_installed = {
|
||||||
-- Update this to ensure that you have the debuggers for the langs you want
|
-- Update this to ensure that you have the debuggers for the langs you want
|
||||||
'delve',
|
'delve',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Basic debugging keymaps, feel free to change to your liking!
|
-- Basic debugging keymaps, feel free to change to your liking!
|
||||||
vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
|
vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
|
||||||
vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
|
vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
|
||||||
vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
|
vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
|
||||||
vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
|
vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
|
||||||
vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
|
vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
|
||||||
vim.keymap.set('n', '<leader>B', function()
|
vim.keymap.set('n', '<leader>B', function()
|
||||||
dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
|
dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
|
||||||
end, { desc = 'Debug: Set Breakpoint' })
|
end, { desc = 'Debug: Set Breakpoint' })
|
||||||
|
|
||||||
-- Dap UI setup
|
-- Dap UI setup
|
||||||
-- For more information, see |:help nvim-dap-ui|
|
-- For more information, see |:help nvim-dap-ui|
|
||||||
dapui.setup {
|
dapui.setup {
|
||||||
-- Set icons to characters that are more likely to work in every terminal.
|
-- Set icons to characters that are more likely to work in every terminal.
|
||||||
-- Feel free to remove or use ones that you like more! :)
|
-- Feel free to remove or use ones that you like more! :)
|
||||||
-- Don't feel like these are good choices.
|
-- Don't feel like these are good choices.
|
||||||
icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
|
icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
|
||||||
controls = {
|
controls = {
|
||||||
icons = {
|
icons = {
|
||||||
pause = '⏸',
|
pause = '⏸',
|
||||||
play = '▶',
|
play = '▶',
|
||||||
step_into = '⏎',
|
step_into = '⏎',
|
||||||
step_over = '⏭',
|
step_over = '⏭',
|
||||||
step_out = '⏮',
|
step_out = '⏮',
|
||||||
step_back = 'b',
|
step_back = 'b',
|
||||||
run_last = '▶▶',
|
run_last = '▶▶',
|
||||||
terminate = '⏹',
|
terminate = '⏹',
|
||||||
disconnect = '⏏',
|
disconnect = '⏏',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
|
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
|
||||||
vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result.' })
|
vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result.' })
|
||||||
|
|
||||||
dap.listeners.after.event_initialized['dapui_config'] = dapui.open
|
dap.listeners.after.event_initialized['dapui_config'] = dapui.open
|
||||||
dap.listeners.before.event_terminated['dapui_config'] = dapui.close
|
dap.listeners.before.event_terminated['dapui_config'] = dapui.close
|
||||||
dap.listeners.before.event_exited['dapui_config'] = dapui.close
|
dap.listeners.before.event_exited['dapui_config'] = dapui.close
|
||||||
|
|
||||||
-- Install golang specific config
|
-- Install golang specific config
|
||||||
require('dap-go').setup()
|
require('dap-go').setup()
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user