-- ======================================================================== -- CORE EDITOR PLUGINS -- ======================================================================== -- Essential editing tools that are always loaded -- - Telescope: Fuzzy finder -- - Which-key: Keybinding helper -- - Neo-tree: File explorer -- - guess-indent: Auto-detect indentation -- ======================================================================== return { -- Detect tabstop and shiftwidth automatically 'NMAC427/guess-indent.nvim', -- Telescope: Fuzzy finder (files, LSP, etc) { 'nvim-telescope/telescope.nvim', event = 'VimEnter', dependencies = { 'nvim-lua/plenary.nvim', { 'nvim-telescope/telescope-fzf-native.nvim', build = 'make', cond = function() return vim.fn.executable 'make' == 1 end, }, { 'nvim-telescope/telescope-ui-select.nvim' }, { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font }, }, config = function() require('telescope').setup { defaults = { mappings = { i = { -- Navigation (consistent with Neo-tree) [''] = require('telescope.actions').move_selection_next, [''] = require('telescope.actions').move_selection_previous, -- Preview scrolling [''] = require('telescope.actions').preview_scrolling_down, [''] = require('telescope.actions').preview_scrolling_up, -- Open actions (consistent with Neo-tree) [''] = require('telescope.actions').select_default, -- Open in current window [''] = require('telescope.actions').select_horizontal, -- Open in horizontal split [''] = require('telescope.actions').select_vertical, -- Open in vertical split [''] = require('telescope.actions').select_tab, -- Open in new tab -- Close [''] = require('telescope.actions').close, [''] = require('telescope.actions').close, -- Cycle history [''] = require('telescope.actions').cycle_history_next, [''] = require('telescope.actions').cycle_history_prev, -- Selection [''] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_worse, [''] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_better, -- Send to quickfix [''] = require('telescope.actions').send_to_qflist + require('telescope.actions').open_qflist, [''] = require('telescope.actions').send_selected_to_qflist + require('telescope.actions').open_qflist, }, n = { -- Same mappings in normal mode [''] = require('telescope.actions').move_selection_next, [''] = require('telescope.actions').move_selection_previous, [''] = require('telescope.actions').preview_scrolling_down, [''] = require('telescope.actions').preview_scrolling_up, [''] = require('telescope.actions').select_default, [''] = require('telescope.actions').select_horizontal, [''] = require('telescope.actions').select_vertical, [''] = require('telescope.actions').select_tab, ['q'] = require('telescope.actions').close, [''] = require('telescope.actions').close, [''] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_worse, [''] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_better, [''] = require('telescope.actions').send_to_qflist + require('telescope.actions').open_qflist, [''] = require('telescope.actions').send_selected_to_qflist + require('telescope.actions').open_qflist, -- Vim-like navigation ['j'] = require('telescope.actions').move_selection_next, ['k'] = require('telescope.actions').move_selection_previous, ['gg'] = require('telescope.actions').move_to_top, ['G'] = require('telescope.actions').move_to_bottom, ['?'] = require('telescope.actions').which_key, -- Show help }, }, }, extensions = { ['ui-select'] = { require('telescope.themes').get_dropdown(), }, }, } pcall(require('telescope').load_extension, 'fzf') pcall(require('telescope').load_extension, 'ui-select') local builtin = require 'telescope.builtin' vim.keymap.set('n', 'sh', builtin.help_tags, { desc = '[S]earch [H]elp' }) vim.keymap.set('n', 'sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' }) vim.keymap.set('n', 'sf', builtin.find_files, { desc = '[S]earch [F]iles' }) vim.keymap.set('n', 'ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' }) vim.keymap.set('n', 'sw', builtin.grep_string, { desc = '[S]earch current [W]ord' }) vim.keymap.set('n', 'sg', builtin.live_grep, { desc = '[S]earch by [G]rep' }) vim.keymap.set('n', 'sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' }) vim.keymap.set('n', 'sr', builtin.resume, { desc = '[S]earch [R]esume' }) vim.keymap.set('n', 's.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' }) vim.keymap.set('n', '', builtin.buffers, { desc = '[ ] Find existing buffers' }) vim.keymap.set('n', '/', function() builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { winblend = 10, previewer = false, }) end, { desc = '[/] Fuzzily search in current buffer' }) vim.keymap.set('n', 's/', function() builtin.live_grep { grep_open_files = true, prompt_title = 'Live Grep in Open Files', } end, { desc = '[S]earch [/] in Open Files' }) vim.keymap.set('n', 'sn', function() builtin.find_files { cwd = vim.fn.stdpath 'config' } end, { desc = '[S]earch [N]eovim files' }) end, }, -- Which-key: Shows pending keybinds { 'folke/which-key.nvim', event = 'VimEnter', opts = { delay = 0, -- Floating window configuration (bottom right) win = { width = { min = 30, max = 60 }, -- Width range for the popup height = { min = 4, max = 0.9 }, -- Max 90% of screen height - fits all items col = 0.99, -- Position close to right edge row = 0.95, -- Position close to bottom border = 'rounded', -- Border style padding = { 1, 2 }, -- Padding inside window title = true, -- Show title title_pos = 'center', -- Center the title wo = { winblend = 0, -- No transparency (0-100) }, }, layout = { width = { min = 30 }, -- Minimum column width spacing = 3, -- Spacing between columns }, icons = { mappings = vim.g.have_nerd_font, keys = vim.g.have_nerd_font and {} or { Up = ' ', Down = ' ', Left = ' ', Right = ' ', C = ' ', M = ' ', D = ' ', S = ' ', CR = ' ', Esc = ' ', ScrollWheelDown = ' ', ScrollWheelUp = ' ', NL = ' ', BS = ' ', Space = ' ', Tab = ' ', F1 = '', F2 = '', F3 = '', F4 = '', F5 = '', F6 = '', F7 = '', F8 = '', F9 = '', F10 = '', F11 = '', F12 = '', }, }, spec = { -- Core groups with icons { 'b', group = '󰊄 buffer', icon = '󰊄' }, { 'c', group = ' code', icon = '' }, { 'd', group = ' debug', icon = '' }, { 'f', group = ' flutter', icon = '' }, -- Only visible in Dart files { 'g', group = ' git', icon = '' }, { 'p', group = ' python', icon = '' }, -- Only visible in Python files { 'r', group = '󱘗 rust', icon = '󱘗' }, -- Only visible in Rust files { 's', group = ' search', icon = '' }, { 'S', group = '󱂬 session', icon = '󱂬' }, { 't', group = '󰔡 toggle', icon = '󰔡' }, { 'u', group = ' ui', icon = '' }, { 'v', group = ' svelte', icon = '' }, -- Only visible in Svelte files { 'w', group = ' window', icon = '' }, { 'x', group = '󱖫 diagnostics', icon = '󱖫' }, -- Special groups { 'q', desc = '󰁨 Quickfix diagnostics' }, { 'Q', desc = '󰗼 Quit all' }, -- Git hunks (normal and visual mode) { 'h', group = ' git hunk', mode = { 'n', 'v' }, icon = '' }, }, }, }, -- Neo-tree: File explorer -- Imported from kickstart/plugins/neo-tree.lua }