migration complete
This commit is contained in:
parent
c0c1148fde
commit
88d84fee4c
34 changed files with 4641 additions and 281 deletions
|
|
@ -56,3 +56,37 @@ vim.keymap.set('n', '<leader>Q', '<cmd>qa<CR>', { desc = '[Q]uit [A]ll' })
|
|||
-- vim.keymap.set("n", "<C-S-l>", "<C-w>L", { desc = "Move window to the right" })
|
||||
-- vim.keymap.set("n", "<C-S-j>", "<C-w>J", { desc = "Move window to the lower" })
|
||||
-- vim.keymap.set("n", "<C-S-k>", "<C-w>K", { desc = "Move window to the upper" })
|
||||
|
||||
-- ========================================================================
|
||||
-- BUFFER OPERATIONS (<leader>b)
|
||||
-- ========================================================================
|
||||
vim.keymap.set('n', '<leader>bd', '<cmd>bd<CR>', { desc = 'Delete buffer' })
|
||||
vim.keymap.set('n', '<leader>bD', '<cmd>bd!<CR>', { desc = 'Delete buffer (force)' })
|
||||
vim.keymap.set('n', '<leader>bn', '<cmd>bnext<CR>', { desc = 'Next buffer' })
|
||||
vim.keymap.set('n', '<leader>bp', '<cmd>bprevious<CR>', { desc = 'Previous buffer' })
|
||||
vim.keymap.set('n', '<leader>bo', '<cmd>%bd|e#|bd#<CR>', { desc = 'Delete other buffers' })
|
||||
|
||||
-- ========================================================================
|
||||
-- WINDOW OPERATIONS (<leader>w)
|
||||
-- ========================================================================
|
||||
vim.keymap.set('n', '<leader>ww', '<C-w>w', { desc = 'Other window' })
|
||||
vim.keymap.set('n', '<leader>wd', '<C-w>c', { desc = 'Delete window' })
|
||||
vim.keymap.set('n', '<leader>ws', '<C-w>s', { desc = 'Split window below' })
|
||||
vim.keymap.set('n', '<leader>wv', '<C-w>v', { desc = 'Split window right' })
|
||||
vim.keymap.set('n', '<leader>wm', '<C-w>_<C-w>|', { desc = 'Maximize window' })
|
||||
vim.keymap.set('n', '<leader>w=', '<C-w>=', { desc = 'Balance windows' })
|
||||
vim.keymap.set('n', '<leader>wh', '<C-w>h', { desc = 'Go to left window' })
|
||||
vim.keymap.set('n', '<leader>wj', '<C-w>j', { desc = 'Go to lower window' })
|
||||
vim.keymap.set('n', '<leader>wk', '<C-w>k', { desc = 'Go to upper window' })
|
||||
vim.keymap.set('n', '<leader>wl', '<C-w>l', { desc = 'Go to right window' })
|
||||
|
||||
-- ========================================================================
|
||||
-- UI OPERATIONS (<leader>u)
|
||||
-- ========================================================================
|
||||
vim.keymap.set('n', '<leader>ul', '<cmd>Lazy<CR>', { desc = 'Open Lazy' })
|
||||
vim.keymap.set('n', '<leader>um', '<cmd>Mason<CR>', { desc = 'Open Mason' })
|
||||
vim.keymap.set('n', '<leader>ui', vim.show_pos, { desc = 'Inspect position' })
|
||||
vim.keymap.set('n', '<leader>uI', '<cmd>InspectTree<CR>', { desc = 'Inspect tree' })
|
||||
vim.keymap.set('n', '<leader>un', function()
|
||||
require('noice').cmd 'dismiss'
|
||||
end, { desc = 'Dismiss notifications' })
|
||||
|
|
|
|||
485
lua/custom/plugins/flutter.lua
Normal file
485
lua/custom/plugins/flutter.lua
Normal file
|
|
@ -0,0 +1,485 @@
|
|||
-- ========================================================================
|
||||
-- FLUTTER/DART PROFILE - Language-specific plugins and LSP configuration
|
||||
-- ========================================================================
|
||||
--
|
||||
-- This file contains all Flutter and Dart-specific plugins and configurations.
|
||||
-- These plugins will ONLY load when you open a .dart file, keeping your
|
||||
-- startup time fast and avoiding conflicts with other languages.
|
||||
--
|
||||
-- Key features to configure here:
|
||||
-- - Flutter tools (hot reload, device management, widget inspector)
|
||||
-- - Dart LSP (dartls via flutter-tools)
|
||||
-- - Dart-specific formatters and linters
|
||||
-- - Flutter-specific keymaps (e.g., <leader>fr for Flutter Run)
|
||||
--
|
||||
-- Usage: Just open a .dart file and these plugins will automatically load!
|
||||
-- ========================================================================
|
||||
|
||||
return {
|
||||
-- ========================================================================
|
||||
-- NVIM-DAP - Debug Adapter Protocol for Flutter debugging
|
||||
-- ========================================================================
|
||||
-- Load DAP when opening Dart files to enable breakpoint debugging
|
||||
{
|
||||
'mfussenegger/nvim-dap',
|
||||
ft = 'dart',
|
||||
dependencies = {
|
||||
'rcarriga/nvim-dap-ui',
|
||||
'nvim-neotest/nvim-nio',
|
||||
},
|
||||
},
|
||||
|
||||
-- ========================================================================
|
||||
-- FLUTTER TOOLS - Complete Flutter development environment
|
||||
-- ========================================================================
|
||||
-- Provides Flutter-specific features like hot reload, device management,
|
||||
-- widget inspector, and integrates the Dart LSP server.
|
||||
--
|
||||
-- Flutter-specific keymaps (available in .dart files):
|
||||
-- <Space>fr - Flutter Run (start app)
|
||||
-- <Space>fq - Flutter Quit (stop app)
|
||||
-- <Space>fR - Flutter Hot Restart
|
||||
-- <Space>fh - Flutter Hot Reload
|
||||
-- <Space>fd - Flutter Devices (show connected devices)
|
||||
-- <Space>fe - Flutter Emulators (launch emulator)
|
||||
-- <Space>fo - Flutter Outline (toggle outline/widget tree)
|
||||
-- <Space>ft - Flutter DevTools (start DevTools server)
|
||||
-- <Space>fa - Flutter Attach (attach to running app)
|
||||
-- <Space>fD - Flutter Detach (detach from running app)
|
||||
-- <Space>fL - Flutter Log Toggle (show/hide logs)
|
||||
-- <Space>fc - Flutter Copy Profiler URL (for DevTools)
|
||||
--
|
||||
-- Debug keymaps:
|
||||
-- <F5> - Start/Continue debugging
|
||||
-- <F10> - Step over
|
||||
-- <F11> - Step into
|
||||
-- <F12> - Step out
|
||||
-- <leader>db - Toggle breakpoint
|
||||
-- <leader>dB - Set conditional breakpoint
|
||||
-- <leader>dc - Continue
|
||||
-- <leader>dt - Terminate debugging
|
||||
-- ========================================================================
|
||||
{
|
||||
'nvim-flutter/flutter-tools.nvim',
|
||||
ft = 'dart', -- Only load when opening Dart files
|
||||
dependencies = {
|
||||
'nvim-lua/plenary.nvim',
|
||||
'stevearc/dressing.nvim', -- Optional: better UI for Flutter commands
|
||||
'mfussenegger/nvim-dap',
|
||||
'rcarriga/nvim-dap-ui',
|
||||
'nvim-neotest/nvim-nio',
|
||||
},
|
||||
config = function()
|
||||
-- Get shared LSP capabilities from blink.cmp
|
||||
local capabilities = require('blink.cmp').get_lsp_capabilities()
|
||||
|
||||
require('flutter-tools').setup {
|
||||
-- UI configuration
|
||||
ui = {
|
||||
border = 'rounded', -- border type for floating windows
|
||||
notification_style = 'native', -- 'native' or 'plugin' (native uses vim.notify)
|
||||
},
|
||||
|
||||
-- Flutter SDK path (usually auto-detected, but you can specify if needed)
|
||||
-- flutter_path = '/path/to/flutter/bin/flutter',
|
||||
-- flutter_lookup_cmd = nil, -- example: "dirname $(which flutter)" or "asdf where flutter"
|
||||
|
||||
-- FVM support - takes priority over path, uses <workspace>/.fvm/flutter_sdk if enabled
|
||||
fvm = false,
|
||||
|
||||
-- Root patterns to find the root of your flutter project
|
||||
root_patterns = { '.git', 'pubspec.yaml' },
|
||||
|
||||
-- Uncomment to set a default device (get ID from `flutter devices`)
|
||||
-- device = {
|
||||
-- id = 'chrome', -- or 'macos', 'emulator-5554', etc.
|
||||
-- },
|
||||
|
||||
lsp = {
|
||||
capabilities = capabilities,
|
||||
|
||||
-- Suppress didChange errors during snippet expansion
|
||||
on_attach = function(client, bufnr)
|
||||
-- Reduce didChange notification frequency to prevent errors with snippets
|
||||
client.server_capabilities.textDocumentSync = vim.tbl_deep_extend('force', client.server_capabilities.textDocumentSync or {}, {
|
||||
change = 2, -- 2 = Incremental (less prone to errors than full sync)
|
||||
})
|
||||
|
||||
-- Filter out didChange error notifications (they're harmless during snippet expansion)
|
||||
-- We'll use an autocmd to do this after noice.nvim is loaded
|
||||
vim.api.nvim_create_autocmd('User', {
|
||||
pattern = 'VeryLazy',
|
||||
once = true,
|
||||
callback = function()
|
||||
local notify = vim.notify
|
||||
vim.notify = function(msg, level, opts)
|
||||
if type(msg) == 'string' and msg:match('textDocument/didChange') then
|
||||
return -- Suppress this specific error
|
||||
end
|
||||
notify(msg, level, opts)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end,
|
||||
|
||||
-- Color preview for dart variables (Colors.red, Color(0xFF...), etc.)
|
||||
-- This shows the actual Material Design colors inline!
|
||||
color = {
|
||||
enabled = true, -- whether or not to highlight color variables at all, only supported on flutter >= 2.10
|
||||
background = true, -- highlight the background
|
||||
background_color = nil, -- required, when background is transparent (i.e. background_color = { r = 19, g = 17, b = 24},)
|
||||
foreground = false, -- highlight the foreground
|
||||
virtual_text = true, -- show the highlight using virtual text
|
||||
virtual_text_str = '■', -- the virtual text character to highlight
|
||||
},
|
||||
-- Settings passed to the Dart LSP
|
||||
settings = {
|
||||
-- Show TODOs in the problems pane
|
||||
showTodos = true,
|
||||
-- Completion settings
|
||||
completeFunctionCalls = true,
|
||||
-- Enable/disable specific lints
|
||||
-- analysisExcludedFolders = {},
|
||||
renameFilesWithClasses = 'prompt', -- "always" or "prompt"
|
||||
enableSnippets = true,
|
||||
updateImportsOnRename = true, -- Whether to update imports and other directives when files are renamed
|
||||
},
|
||||
},
|
||||
|
||||
-- Flutter-specific settings
|
||||
decorations = {
|
||||
statusline = {
|
||||
-- Set to true to show Flutter app info in statusline
|
||||
app_version = false,
|
||||
device = true, -- Show device name
|
||||
},
|
||||
},
|
||||
|
||||
widget_guides = {
|
||||
enabled = true, -- Show visual guides for widget nesting
|
||||
},
|
||||
|
||||
closing_tags = {
|
||||
highlight = 'Comment', -- Highlight color for closing tags
|
||||
prefix = '// ', -- Text to show before closing tag
|
||||
enabled = true, -- Show closing tags for widgets
|
||||
},
|
||||
|
||||
dev_log = {
|
||||
enabled = true,
|
||||
notify_errors = false, -- Don't show error notifications for log buffer issues
|
||||
open_cmd = 'tabedit', -- Open logs in a new tab
|
||||
focus_on_open = false, -- Don't auto-focus the log window
|
||||
},
|
||||
|
||||
dev_tools = {
|
||||
autostart = false, -- autostart devtools server if not detected
|
||||
auto_open_browser = false, -- Automatically opens devtools in the browser
|
||||
},
|
||||
|
||||
outline = {
|
||||
open_cmd = '30vnew', -- command to use to open the outline buffer
|
||||
auto_open = false, -- if true this will open the outline automatically when it is first populated
|
||||
},
|
||||
|
||||
debugger = {
|
||||
enabled = true, -- Enable Flutter debugger integration
|
||||
run_via_dap = true, -- Use DAP for debugging
|
||||
-- if empty dap will not stop on any exceptions, otherwise it will stop on those specified
|
||||
-- see |:help dap.set_exception_breakpoints()| for more info
|
||||
exception_breakpoints = {},
|
||||
-- Whether to call toString() on objects in debug views like hovers and the variables list.
|
||||
-- Invoking toString() has a performance cost and may introduce side-effects,
|
||||
-- although users may expected this functionality. null is treated like false.
|
||||
evaluate_to_string_in_debug_views = true,
|
||||
-- Flutter tools will automatically register DAP configurations
|
||||
-- No need to manually configure launch.json
|
||||
},
|
||||
}
|
||||
|
||||
-- ========================================================================
|
||||
-- DAP UI SETUP - Beautiful debugging interface
|
||||
-- ========================================================================
|
||||
local dap, dapui = require 'dap', require 'dapui'
|
||||
|
||||
-- Configure DAP UI to open in tabs for better half-width screen support
|
||||
dapui.setup {
|
||||
icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
|
||||
controls = {
|
||||
icons = {
|
||||
pause = '⏸',
|
||||
play = '▶',
|
||||
step_into = '⏎',
|
||||
step_over = '⏭',
|
||||
step_out = '⏮',
|
||||
step_back = 'b',
|
||||
run_last = '▶▶',
|
||||
terminate = '⏹',
|
||||
disconnect = '⏏',
|
||||
},
|
||||
},
|
||||
-- Open each element in a new tab instead of side panels
|
||||
-- This prevents layout issues on small/half-width screens
|
||||
layouts = {
|
||||
{
|
||||
elements = {
|
||||
{ id = 'scopes', size = 0.25 },
|
||||
{ id = 'breakpoints', size = 0.25 },
|
||||
{ id = 'stacks', size = 0.25 },
|
||||
{ id = 'watches', size = 0.25 },
|
||||
},
|
||||
size = 40,
|
||||
position = 'right',
|
||||
},
|
||||
{
|
||||
elements = {
|
||||
{ id = 'repl', size = 0.5 },
|
||||
{ id = 'console', size = 0.5 },
|
||||
},
|
||||
size = 10,
|
||||
position = 'bottom',
|
||||
},
|
||||
},
|
||||
-- Override element window commands to open in tabs
|
||||
element_mappings = {},
|
||||
windows = { indent = 1 },
|
||||
}
|
||||
|
||||
-- Custom function to open DAP UI elements in tabs
|
||||
local function open_dapui_in_tabs()
|
||||
-- Save current tab to return to it
|
||||
local current_tab = vim.fn.tabpagenr()
|
||||
|
||||
-- Create new tab with a named buffer for debug views
|
||||
vim.cmd 'tabnew'
|
||||
local debug_buf = vim.api.nvim_create_buf(false, true)
|
||||
vim.api.nvim_buf_set_name(debug_buf, 'Flutter Debug')
|
||||
vim.api.nvim_set_current_buf(debug_buf)
|
||||
|
||||
-- Open DAP UI in this tab
|
||||
dapui.open()
|
||||
|
||||
-- Return to original tab so user continues coding there
|
||||
vim.cmd('tabnext ' .. current_tab)
|
||||
end
|
||||
|
||||
-- Custom function to close DAP UI tabs
|
||||
local function close_dapui_tabs()
|
||||
dapui.close()
|
||||
|
||||
-- Find and close the Flutter Debug tab
|
||||
local current_tab = vim.fn.tabpagenr()
|
||||
for i = 1, vim.fn.tabpagenr '$' do
|
||||
vim.cmd('tabnext ' .. i)
|
||||
local bufname = vim.api.nvim_buf_get_name(0)
|
||||
if bufname:match('Flutter Debug') then
|
||||
vim.cmd 'tabclose'
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- Return to original tab
|
||||
if vim.fn.tabpagenr '$' >= current_tab then
|
||||
vim.cmd('tabnext ' .. current_tab)
|
||||
end
|
||||
end
|
||||
|
||||
-- Automatically open/close DAP UI in tabs
|
||||
dap.listeners.after.event_initialized['dapui_config'] = open_dapui_in_tabs
|
||||
dap.listeners.before.event_terminated['dapui_config'] = close_dapui_tabs
|
||||
dap.listeners.before.event_exited['dapui_config'] = close_dapui_tabs
|
||||
|
||||
-- Fix for Flutter Tools log buffer - make it non-saveable
|
||||
-- This prevents Vim from asking to save changes to the log file on exit
|
||||
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWinEnter' }, {
|
||||
pattern = '*',
|
||||
callback = function(args)
|
||||
local bufname = vim.api.nvim_buf_get_name(args.buf)
|
||||
-- Check if this is a Flutter log buffer
|
||||
if bufname:match('__FLUTTER_DEV_LOG__') or vim.bo[args.buf].filetype == 'log' then
|
||||
vim.bo[args.buf].modifiable = true -- Allow Flutter to write to it
|
||||
vim.bo[args.buf].modified = false -- Mark as unmodified
|
||||
vim.bo[args.buf].buftype = 'nofile' -- Don't associate with a file (prevents save prompt)
|
||||
vim.bo[args.buf].swapfile = false -- Don't create swap file
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Keep log buffer marked as unmodified whenever it changes
|
||||
-- This prevents the "save changes?" prompt on exit
|
||||
vim.api.nvim_create_autocmd('BufModifiedSet', {
|
||||
pattern = '*',
|
||||
callback = function(args)
|
||||
local bufname = vim.api.nvim_buf_get_name(args.buf)
|
||||
if bufname:match('__FLUTTER_DEV_LOG__') then
|
||||
vim.bo[args.buf].modifiable = true
|
||||
vim.bo[args.buf].modified = false -- Keep it marked as unmodified
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- ========================================================================
|
||||
-- ENABLE TREESITTER FOLDING FOR DART FILES
|
||||
-- ========================================================================
|
||||
-- Set fold method to use Treesitter for Flutter widgets
|
||||
-- Using multiple autocmds to ensure it sticks (some plugins override it)
|
||||
local fold_augroup = vim.api.nvim_create_augroup('DartFolding', { clear = true })
|
||||
|
||||
vim.api.nvim_create_autocmd({ 'BufRead', 'BufEnter', 'BufWinEnter' }, {
|
||||
group = fold_augroup,
|
||||
pattern = '*.dart',
|
||||
callback = function()
|
||||
vim.opt_local.foldmethod = 'expr'
|
||||
vim.opt_local.foldexpr = 'nvim_treesitter#foldexpr()'
|
||||
vim.opt_local.foldlevel = 99 -- High level = everything unfolded
|
||||
vim.opt_local.foldlevelstart = 99 -- Start with everything unfolded
|
||||
|
||||
-- Hide fold column (no extra column, folds still work!)
|
||||
vim.opt_local.foldcolumn = '0'
|
||||
|
||||
-- Minimal fold display (VS Code style - just shows first line)
|
||||
vim.opt_local.foldtext = ''
|
||||
end,
|
||||
})
|
||||
|
||||
-- Also set after LSP attaches (flutter-tools might reset it)
|
||||
vim.api.nvim_create_autocmd('LspAttach', {
|
||||
group = fold_augroup,
|
||||
callback = function(args)
|
||||
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
||||
if client and client.name == 'dartls' then
|
||||
vim.opt_local.foldmethod = 'expr'
|
||||
vim.opt_local.foldexpr = 'nvim_treesitter#foldexpr()'
|
||||
vim.opt_local.foldlevel = 99 -- Everything unfolded
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- ========================================================================
|
||||
-- FLUTTER-SPECIFIC KEYMAPS
|
||||
-- ========================================================================
|
||||
-- These keymaps are only available when editing Dart files
|
||||
-- They provide quick access to common Flutter commands
|
||||
-- ========================================================================
|
||||
vim.api.nvim_create_autocmd('FileType', {
|
||||
pattern = 'dart',
|
||||
callback = function()
|
||||
local opts = { buffer = true, silent = true }
|
||||
|
||||
-- ========================================================================
|
||||
-- ENABLE TREESITTER FOLDING FOR DART FILES
|
||||
-- ========================================================================
|
||||
-- Set fold method to use Treesitter for Flutter widgets
|
||||
vim.opt_local.foldmethod = 'expr'
|
||||
vim.opt_local.foldexpr = 'nvim_treesitter#foldexpr()'
|
||||
vim.opt_local.foldenable = false -- Start with folds open
|
||||
vim.opt_local.foldlevel = 99
|
||||
vim.opt_local.foldlevelstart = 99
|
||||
|
||||
-- Flutter run/quit
|
||||
-- WORKFLOW:
|
||||
-- 1. First time: <leader>fd to select device
|
||||
-- 2. Then: <leader>fr to run (uses selected device)
|
||||
-- 3. Subsequent runs: <leader>fr uses same device
|
||||
vim.keymap.set('n', '<leader>fr', '<cmd>FlutterRun<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Run app' }))
|
||||
vim.keymap.set('n', '<leader>fR', '<cmd>FlutterRestart<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Hot restart' }))
|
||||
vim.keymap.set('n', '<leader>fh', '<cmd>FlutterReload<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Hot reload' }))
|
||||
vim.keymap.set('n', '<leader>fq', '<cmd>FlutterQuit<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Quit app' }))
|
||||
|
||||
-- Code Actions (Cmd+. equivalent) - wrap, remove, extract widgets, etc.
|
||||
vim.keymap.set('n', '<leader>.', vim.lsp.buf.code_action, vim.tbl_extend('force', opts, { desc = 'Flutter: Code actions (Cmd+.)' }))
|
||||
vim.keymap.set('v', '<leader>.', vim.lsp.buf.code_action, vim.tbl_extend('force', opts, { desc = 'Flutter: Code actions (Cmd+.)' }))
|
||||
-- Alternative: use the default LSP keymap
|
||||
vim.keymap.set('n', 'gra', vim.lsp.buf.code_action, vim.tbl_extend('force', opts, { desc = '[G]oto Code [A]ction' }))
|
||||
vim.keymap.set('v', 'gra', vim.lsp.buf.code_action, vim.tbl_extend('force', opts, { desc = '[G]oto Code [A]ction' }))
|
||||
|
||||
-- Device management
|
||||
-- Use <leader>fd to see/select devices FIRST, then <leader>fr will use that device
|
||||
vim.keymap.set('n', '<leader>fd', '<cmd>FlutterDevices<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Select device' }))
|
||||
vim.keymap.set('n', '<leader>fe', '<cmd>FlutterEmulators<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Launch emulator' }))
|
||||
|
||||
-- Dev tools and debugging
|
||||
vim.keymap.set('n', '<leader>fo', '<cmd>FlutterOutlineToggle<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Toggle outline' }))
|
||||
vim.keymap.set('n', '<leader>ft', '<cmd>FlutterDevTools<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Start DevTools' }))
|
||||
vim.keymap.set(
|
||||
'n',
|
||||
'<leader>fc',
|
||||
'<cmd>FlutterCopyProfilerUrl<cr>',
|
||||
vim.tbl_extend('force', opts, { desc = 'Flutter: Copy profiler URL' })
|
||||
)
|
||||
|
||||
-- Attach/Detach
|
||||
vim.keymap.set('n', '<leader>fa', '<cmd>FlutterAttach<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Attach to app' }))
|
||||
vim.keymap.set('n', '<leader>fD', '<cmd>FlutterDetach<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Detach from app' }))
|
||||
|
||||
-- Logs
|
||||
vim.keymap.set('n', '<leader>fL', '<cmd>FlutterLogToggle<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Toggle logs' }))
|
||||
|
||||
-- LSP
|
||||
vim.keymap.set('n', '<leader>fl', '<cmd>FlutterLspRestart<cr>', vim.tbl_extend('force', opts, { desc = 'Flutter: Restart LSP' }))
|
||||
|
||||
-- ========================================================================
|
||||
-- DEBUG KEYMAPS - Available only in Dart files
|
||||
-- ========================================================================
|
||||
-- Function key shortcuts (standard debugging)
|
||||
vim.keymap.set('n', '<F5>', function()
|
||||
require('dap').continue()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Start/Continue' }))
|
||||
|
||||
vim.keymap.set('n', '<F10>', function()
|
||||
require('dap').step_over()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Step Over' }))
|
||||
|
||||
vim.keymap.set('n', '<F11>', function()
|
||||
require('dap').step_into()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Step Into' }))
|
||||
|
||||
vim.keymap.set('n', '<F12>', function()
|
||||
require('dap').step_out()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Step Out' }))
|
||||
|
||||
-- Leader-based debug commands
|
||||
vim.keymap.set('n', '<leader>db', function()
|
||||
require('dap').toggle_breakpoint()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: Toggle [B]reakpoint' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>dB', function()
|
||||
require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ')
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: Set Conditional [B]reakpoint' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>dc', function()
|
||||
require('dap').continue()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: [C]ontinue' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>dt', function()
|
||||
require('dap').terminate()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: [T]erminate' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>du', function()
|
||||
require('dapui').toggle()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: Toggle [U]I' }))
|
||||
|
||||
-- Register groups with which-key
|
||||
require('which-key').add {
|
||||
{ '<leader>f', group = '[F]lutter', mode = 'n' },
|
||||
{ '<leader>d', group = '[D]ebug', mode = 'n' },
|
||||
}
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- ========================================================================
|
||||
-- DART TREESITTER - Ensure dart parser is installed for proper folding
|
||||
-- ========================================================================
|
||||
{
|
||||
'nvim-treesitter/nvim-treesitter',
|
||||
ft = 'dart',
|
||||
opts = function(_, opts)
|
||||
-- Ensure Dart parser is installed
|
||||
opts.ensure_installed = opts.ensure_installed or {}
|
||||
vim.list_extend(opts.ensure_installed, { 'dart' })
|
||||
return opts
|
||||
end,
|
||||
},
|
||||
}
|
||||
396
lua/plugins/core/cheatsheet.lua
Normal file
396
lua/plugins/core/cheatsheet.lua
Normal file
|
|
@ -0,0 +1,396 @@
|
|||
-- ========================================================================
|
||||
-- CHEATSHEET - Comprehensive keymap reference
|
||||
-- ========================================================================
|
||||
-- Complete cheatsheet including:
|
||||
-- - Vim default keymaps
|
||||
-- - Custom leader keymaps
|
||||
-- - Plugin-specific keymaps (Telescope, Neo-tree, etc.)
|
||||
-- - LSP keymaps
|
||||
-- - Language-specific keymaps
|
||||
-- ========================================================================
|
||||
|
||||
return {
|
||||
-- Enhanced cheatsheet with custom data
|
||||
{
|
||||
'nvim-telescope/telescope.nvim',
|
||||
keys = {
|
||||
{
|
||||
'<leader>sc',
|
||||
function()
|
||||
-- Create a custom cheatsheet picker
|
||||
local pickers = require 'telescope.pickers'
|
||||
local finders = require 'telescope.finders'
|
||||
local conf = require('telescope.config').values
|
||||
local actions = require 'telescope.actions'
|
||||
local action_state = require 'telescope.actions.state'
|
||||
|
||||
-- Comprehensive keymap data
|
||||
local cheatsheet = {
|
||||
-- ============================================================
|
||||
-- VIM ESSENTIALS
|
||||
-- ============================================================
|
||||
{ category = 'Vim: Motion', key = 'h/j/k/l', desc = 'Left/Down/Up/Right' },
|
||||
{ category = 'Vim: Motion', key = 'w/b/e', desc = 'Word forward/backward/end' },
|
||||
{ category = 'Vim: Motion', key = '0/$', desc = 'Start/end of line' },
|
||||
{ category = 'Vim: Motion', key = 'gg/G', desc = 'First/last line' },
|
||||
{ category = 'Vim: Motion', key = '{/}', desc = 'Previous/next paragraph' },
|
||||
{ category = 'Vim: Motion', key = '%', desc = 'Jump to matching bracket' },
|
||||
{ category = 'Vim: Motion', key = 'f/F{char}', desc = 'Find char forward/backward' },
|
||||
{ category = 'Vim: Motion', key = 't/T{char}', desc = 'Till char forward/backward' },
|
||||
{ category = 'Vim: Motion', key = ';/,', desc = 'Repeat f/t forward/backward' },
|
||||
{ category = 'Vim: Motion', key = '*/#', desc = 'Search word under cursor' },
|
||||
{ category = 'Vim: Motion', key = 'n/N', desc = 'Next/previous search result' },
|
||||
|
||||
{ category = 'Vim: Editing', key = 'i/a', desc = 'Insert before/after cursor' },
|
||||
{ category = 'Vim: Editing', key = 'I/A', desc = 'Insert at line start/end' },
|
||||
{ category = 'Vim: Editing', key = 'o/O', desc = 'New line below/above' },
|
||||
{ category = 'Vim: Editing', key = 'x/X', desc = 'Delete char under/before cursor' },
|
||||
{ category = 'Vim: Editing', key = 'd{motion}', desc = 'Delete (dw, dd, d$)' },
|
||||
{ category = 'Vim: Editing', key = 'c{motion}', desc = 'Change (cw, cc, c$)' },
|
||||
{ category = 'Vim: Editing', key = 'y{motion}', desc = 'Yank/copy (yw, yy, y$)' },
|
||||
{ category = 'Vim: Editing', key = 'p/P', desc = 'Paste after/before cursor' },
|
||||
{ category = 'Vim: Editing', key = 'u/Ctrl-r', desc = 'Undo/redo' },
|
||||
{ category = 'Vim: Editing', key = '.', desc = 'Repeat last change' },
|
||||
{ category = 'Vim: Editing', key = 'r{char}', desc = 'Replace character' },
|
||||
{ category = 'Vim: Editing', key = 'J', desc = 'Join lines' },
|
||||
{ category = 'Vim: Editing', key = '~', desc = 'Toggle case' },
|
||||
{ category = 'Vim: Editing', key = '>>/<<', desc = 'Indent/unindent line' },
|
||||
|
||||
{ category = 'Vim: Visual', key = 'v/V/Ctrl-v', desc = 'Visual/line/block mode' },
|
||||
{ category = 'Vim: Visual', key = 'o', desc = 'Go to other end of selection' },
|
||||
{ category = 'Vim: Visual', key = 'gv', desc = 'Reselect last visual' },
|
||||
|
||||
{ category = 'Vim: Search', key = '/{pattern}', desc = 'Search forward' },
|
||||
{ category = 'Vim: Search', key = '?{pattern}', desc = 'Search backward' },
|
||||
{ category = 'Vim: Search', key = ':s/old/new/g', desc = 'Substitute in line' },
|
||||
{ category = 'Vim: Search', key = ':%s/old/new/g', desc = 'Substitute in file' },
|
||||
{ category = 'Vim: Search', key = ':noh', desc = 'Clear search highlight' },
|
||||
|
||||
{ category = 'Vim: Windows', key = 'Ctrl-w s', desc = 'Split horizontal' },
|
||||
{ category = 'Vim: Windows', key = 'Ctrl-w v', desc = 'Split vertical' },
|
||||
{ category = 'Vim: Windows', key = 'Ctrl-w c', desc = 'Close window' },
|
||||
{ category = 'Vim: Windows', key = 'Ctrl-w o', desc = 'Close other windows' },
|
||||
{ category = 'Vim: Windows', key = 'Ctrl-w =', desc = 'Balance windows' },
|
||||
{ category = 'Vim: Windows', key = 'Ctrl-h/j/k/l', desc = 'Navigate windows' },
|
||||
|
||||
{ category = 'Vim: Tabs', key = ':tabnew', desc = 'New tab' },
|
||||
{ category = 'Vim: Tabs', key = ':tabc', desc = 'Close tab' },
|
||||
{ category = 'Vim: Tabs', key = 'gt/gT', desc = 'Next/previous tab' },
|
||||
|
||||
{ category = 'Vim: Files', key = ':w', desc = 'Save file' },
|
||||
{ category = 'Vim: Files', key = ':q', desc = 'Quit' },
|
||||
{ category = 'Vim: Files', key = ':wq or ZZ', desc = 'Save and quit' },
|
||||
{ category = 'Vim: Files', key = ':q! or ZQ', desc = 'Quit without saving' },
|
||||
|
||||
-- ============================================================
|
||||
-- LEADER KEYMAPS (CORE)
|
||||
-- ============================================================
|
||||
{ category = 'Core: Quit', key = '<Space>Q', desc = 'Quit all' },
|
||||
{ category = 'Core: Quit', key = '<Space>q', desc = 'Quickfix diagnostics' },
|
||||
{ category = 'Core: Files', key = '\\', desc = 'Toggle Neo-tree' },
|
||||
{ category = 'Core: Terminal', key = 'Esc Esc', desc = 'Exit terminal mode (in terminal)' },
|
||||
|
||||
-- ============================================================
|
||||
-- BUFFER OPERATIONS
|
||||
-- ============================================================
|
||||
{ category = 'Buffer', key = '<Space>bd', desc = 'Delete buffer' },
|
||||
{ category = 'Buffer', key = '<Space>bD', desc = 'Delete buffer (force)' },
|
||||
{ category = 'Buffer', key = '<Space>bn', desc = 'Next buffer' },
|
||||
{ category = 'Buffer', key = '<Space>bp', desc = 'Previous buffer' },
|
||||
{ category = 'Buffer', key = '<Space>bo', desc = 'Delete other buffers' },
|
||||
{ category = 'Buffer', key = '<Space><Space>', desc = 'Find buffers (Telescope)' },
|
||||
|
||||
-- ============================================================
|
||||
-- WINDOW OPERATIONS
|
||||
-- ============================================================
|
||||
{ category = 'Window', key = '<Space>ww', desc = 'Other window' },
|
||||
{ category = 'Window', key = '<Space>wd', desc = 'Delete window' },
|
||||
{ category = 'Window', key = '<Space>ws', desc = 'Split below' },
|
||||
{ category = 'Window', key = '<Space>wv', desc = 'Split right' },
|
||||
{ category = 'Window', key = '<Space>wm', desc = 'Maximize' },
|
||||
{ category = 'Window', key = '<Space>w=', desc = 'Balance windows' },
|
||||
{ category = 'Window', key = '<Space>wh/j/k/l', desc = 'Navigate windows' },
|
||||
|
||||
-- ============================================================
|
||||
-- SEARCH (TELESCOPE)
|
||||
-- ============================================================
|
||||
{ category = 'Search', key = '<Space>sh', desc = 'Help' },
|
||||
{ category = 'Search', key = '<Space>sk', desc = 'Keymaps' },
|
||||
{ category = 'Search', key = '<Space>sf', desc = 'Files' },
|
||||
{ category = 'Search', key = '<Space>ss', desc = 'Select Telescope' },
|
||||
{ category = 'Search', key = '<Space>sw', desc = 'Current word' },
|
||||
{ category = 'Search', key = '<Space>sg', desc = 'Grep' },
|
||||
{ category = 'Search', key = '<Space>sd', desc = 'Diagnostics' },
|
||||
{ category = 'Search', key = '<Space>sr', desc = 'Resume' },
|
||||
{ category = 'Search', key = '<Space>s.', desc = 'Recent files' },
|
||||
{ category = 'Search', key = '<Space>s/', desc = 'In open files' },
|
||||
{ category = 'Search', key = '<Space>sn', desc = 'Neovim config' },
|
||||
{ category = 'Search', key = '<Space>sc', desc = 'Cheatsheet (this!)' },
|
||||
{ category = 'Search', key = '<Space>sK', desc = 'All keymaps (which-key)' },
|
||||
{ category = 'Search', key = '<Space>/', desc = 'Fuzzy find in buffer' },
|
||||
|
||||
-- ============================================================
|
||||
-- SESSION
|
||||
-- ============================================================
|
||||
{ category = 'Session', key = '<Space>Ss', desc = 'Save session' },
|
||||
{ category = 'Session', key = '<Space>Sr', desc = 'Restore session' },
|
||||
{ category = 'Session', key = '<Space>Sd', desc = 'Delete session' },
|
||||
|
||||
-- ============================================================
|
||||
-- UI OPERATIONS
|
||||
-- ============================================================
|
||||
{ category = 'UI', key = '<Space>ul', desc = 'Open Lazy' },
|
||||
{ category = 'UI', key = '<Space>um', desc = 'Open Mason' },
|
||||
{ category = 'UI', key = '<Space>ui', desc = 'Inspect position' },
|
||||
{ category = 'UI', key = '<Space>uI', desc = 'Inspect tree' },
|
||||
{ category = 'UI', key = '<Space>un', desc = 'Dismiss notifications' },
|
||||
|
||||
-- ============================================================
|
||||
-- TOGGLE
|
||||
-- ============================================================
|
||||
{ category = 'Toggle', key = '<Space>th', desc = 'Inlay hints' },
|
||||
|
||||
-- ============================================================
|
||||
-- DIAGNOSTICS
|
||||
-- ============================================================
|
||||
{ category = 'Diagnostics', key = '<Space>xx', desc = 'Toggle diagnostics (Trouble)' },
|
||||
{ category = 'Diagnostics', key = '<Space>xX', desc = 'Buffer diagnostics (Trouble)' },
|
||||
{ category = 'Diagnostics', key = '<Space>xs', desc = 'Symbols (Trouble)' },
|
||||
|
||||
-- ============================================================
|
||||
-- GIT
|
||||
-- ============================================================
|
||||
{ category = 'Git', key = '<Space>hs', desc = 'Stage hunk' },
|
||||
{ category = 'Git', key = '<Space>hr', desc = 'Reset hunk' },
|
||||
{ category = 'Git', key = '<Space>hS', desc = 'Stage buffer' },
|
||||
{ category = 'Git', key = '<Space>hu', desc = 'Undo stage hunk' },
|
||||
{ category = 'Git', key = '<Space>hR', desc = 'Reset buffer' },
|
||||
{ category = 'Git', key = '<Space>hp', desc = 'Preview hunk' },
|
||||
{ category = 'Git', key = '<Space>hb', desc = 'Blame line' },
|
||||
{ category = 'Git', key = '<Space>hd', desc = 'Diff this' },
|
||||
{ category = 'Git', key = '<Space>hD', desc = 'Diff this ~' },
|
||||
|
||||
-- ============================================================
|
||||
-- LSP (ALL LANGUAGES)
|
||||
-- ============================================================
|
||||
{ category = 'LSP', key = 'K', desc = 'Hover documentation' },
|
||||
{ category = 'LSP', key = 'grd', desc = 'Go to definition' },
|
||||
{ category = 'LSP', key = 'grD', desc = 'Go to declaration' },
|
||||
{ category = 'LSP', key = 'gri', desc = 'Go to implementation' },
|
||||
{ category = 'LSP', key = 'grr', desc = 'Go to references' },
|
||||
{ category = 'LSP', key = 'grt', desc = 'Go to type definition' },
|
||||
{ category = 'LSP', key = 'grn', desc = 'Rename' },
|
||||
{ category = 'LSP', key = 'gra', desc = 'Code action' },
|
||||
{ category = 'LSP', key = 'gO', desc = 'Document symbols' },
|
||||
{ category = 'LSP', key = 'gW', desc = 'Workspace symbols' },
|
||||
|
||||
-- ============================================================
|
||||
-- DEBUG (ALL LANGUAGES)
|
||||
-- ============================================================
|
||||
{ category = 'Debug', key = 'F5 or <Space>dc', desc = 'Start/Continue' },
|
||||
{ category = 'Debug', key = 'F10 or <Space>dO', desc = 'Step over' },
|
||||
{ category = 'Debug', key = 'F11 or <Space>di', desc = 'Step into' },
|
||||
{ category = 'Debug', key = 'F12 or <Space>do', desc = 'Step out' },
|
||||
{ category = 'Debug', key = '<Space>db', desc = 'Toggle breakpoint' },
|
||||
{ category = 'Debug', key = '<Space>dB', desc = 'Conditional breakpoint' },
|
||||
{ category = 'Debug', key = '<Space>dc or F5', desc = 'Continue' },
|
||||
{ category = 'Debug', key = '<Space>di or F11', desc = 'Step into' },
|
||||
{ category = 'Debug', key = '<Space>do or F12', desc = 'Step out' },
|
||||
{ category = 'Debug', key = '<Space>dO or F10', desc = 'Step over' },
|
||||
{ category = 'Debug', key = '<Space>dt', desc = 'Terminate' },
|
||||
{ category = 'Debug', key = '<Space>dr', desc = 'Toggle REPL' },
|
||||
{ category = 'Debug', key = '<Space>dl', desc = 'Run last' },
|
||||
{ category = 'Debug', key = '<Space>dC', desc = 'Run to cursor' },
|
||||
{ category = 'Debug', key = '<Space>du', desc = 'Toggle UI' },
|
||||
{ category = 'Debug', key = '<Space>de', desc = 'Eval expression' },
|
||||
|
||||
-- ============================================================
|
||||
-- FLUTTER (DART FILES)
|
||||
-- ============================================================
|
||||
{ category = 'Flutter', key = '<Space>fr', desc = 'Run app' },
|
||||
{ category = 'Flutter', key = '<Space>fR', desc = 'Hot restart' },
|
||||
{ category = 'Flutter', key = '<Space>fh', desc = 'Hot reload' },
|
||||
{ category = 'Flutter', key = '<Space>fq', desc = 'Quit app' },
|
||||
{ category = 'Flutter', key = '<Space>fd', desc = 'Select device' },
|
||||
{ category = 'Flutter', key = '<Space>fe', desc = 'Launch emulator' },
|
||||
{ category = 'Flutter', key = '<Space>fo', desc = 'Toggle outline' },
|
||||
{ category = 'Flutter', key = '<Space>ft', desc = 'Start DevTools' },
|
||||
{ category = 'Flutter', key = '<Space>fa', desc = 'Attach to app' },
|
||||
{ category = 'Flutter', key = '<Space>fD', desc = 'Detach from app' },
|
||||
{ category = 'Flutter', key = '<Space>fL', desc = 'Toggle logs' },
|
||||
{ category = 'Flutter', key = '<Space>fc', desc = 'Copy profiler URL' },
|
||||
{ category = 'Flutter', key = '<Space>fl', desc = 'Restart LSP' },
|
||||
{ category = 'Flutter', key = '<Space>. or gra', desc = 'Code actions (Cmd+.)' },
|
||||
|
||||
-- ============================================================
|
||||
-- RUST (RUST FILES)
|
||||
-- ============================================================
|
||||
{ category = 'Rust', key = '<Space>rh', desc = 'Hover actions' },
|
||||
{ category = 'Rust', key = '<Space>ra', desc = 'Code actions' },
|
||||
{ category = 'Rust', key = '<Space>re', desc = 'Explain error' },
|
||||
{ category = 'Rust', key = '<Space>rC', desc = 'Open Cargo.toml' },
|
||||
{ category = 'Rust', key = '<Space>rp', desc = 'Parent module' },
|
||||
{ category = 'Rust', key = '<Space>rj', desc = 'Join lines' },
|
||||
{ category = 'Rust', key = '<Space>rr', desc = 'Runnables' },
|
||||
{ category = 'Rust', key = '<Space>rd', desc = 'Debuggables' },
|
||||
{ category = 'Rust', key = '<Space>rm', desc = 'Expand macro' },
|
||||
|
||||
-- ============================================================
|
||||
-- RUST CRATES (CARGO.TOML)
|
||||
-- ============================================================
|
||||
{ category = 'Rust: Crates', key = '<Space>rct', desc = 'Toggle' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcr', desc = 'Reload' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcv', desc = 'Show versions' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcf', desc = 'Show features' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcd', desc = 'Show dependencies' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcu', desc = 'Update crate' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rca', desc = 'Update all' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcU', desc = 'Upgrade crate' },
|
||||
{ category = 'Rust: Crates', key = '<Space>rcA', desc = 'Upgrade all' },
|
||||
|
||||
-- ============================================================
|
||||
-- PYTHON (PYTHON FILES)
|
||||
-- ============================================================
|
||||
{ category = 'Python', key = '<Space>pr', desc = 'Run file' },
|
||||
{ category = 'Python', key = '<Space>pR', desc = 'Run with args' },
|
||||
{ category = 'Python', key = '<Space>pe', desc = 'Select venv' },
|
||||
{ category = 'Python', key = '<Space>pl', desc = 'Restart LSP' },
|
||||
{ category = 'Python', key = '<Space>pi', desc = 'Organize imports' },
|
||||
{ category = 'Python', key = '<Space>pf', desc = 'Format code' },
|
||||
|
||||
-- ============================================================
|
||||
-- SVELTE (SVELTE FILES)
|
||||
-- ============================================================
|
||||
{ category = 'Svelte', key = '<Space>vf', desc = 'Format with prettier' },
|
||||
{ category = 'Svelte', key = '<Space>vl', desc = 'Restart Svelte LSP' },
|
||||
{ category = 'Svelte', key = '<Space>vt', desc = 'Restart TypeScript LSP' },
|
||||
{ category = 'Svelte', key = '<Space>vo', desc = 'Open component in split' },
|
||||
|
||||
-- ============================================================
|
||||
-- TELESCOPE (INSIDE TELESCOPE)
|
||||
-- ============================================================
|
||||
{ category = 'Telescope', key = 'Ctrl-j/k or j/k', desc = 'Next/previous item' },
|
||||
{ category = 'Telescope', key = 'Ctrl-d/u', desc = 'Scroll preview down/up' },
|
||||
{ category = 'Telescope', key = 'Enter', desc = 'Open in current window' },
|
||||
{ category = 'Telescope', key = 'Ctrl-x', desc = 'Open in horizontal split' },
|
||||
{ category = 'Telescope', key = 'Ctrl-v', desc = 'Open in vertical split' },
|
||||
{ category = 'Telescope', key = 'Ctrl-t', desc = 'Open in new tab' },
|
||||
{ category = 'Telescope', key = 'Ctrl-c/Esc/q', desc = 'Close' },
|
||||
{ category = 'Telescope', key = 'Tab/Shift-Tab', desc = 'Toggle selection' },
|
||||
{ category = 'Telescope', key = 'Ctrl-q', desc = 'Send all to quickfix' },
|
||||
{ category = 'Telescope', key = 'Alt-q', desc = 'Send selected to quickfix' },
|
||||
{ category = 'Telescope', key = '? (normal)', desc = 'Show help' },
|
||||
{ category = 'Telescope', key = 'gg/G (normal)', desc = 'First/last item' },
|
||||
|
||||
-- ============================================================
|
||||
-- NEO-TREE (INSIDE NEO-TREE)
|
||||
-- ============================================================
|
||||
{ category = 'Neo-tree', key = '\\, q, or Esc', desc = 'Close Neo-tree' },
|
||||
{ category = 'Neo-tree', key = 'Enter, o, or 2-click', desc = 'Open file' },
|
||||
{ category = 'Neo-tree', key = 'Ctrl-x or S', desc = 'Open in horizontal split' },
|
||||
{ category = 'Neo-tree', key = 'Ctrl-v or s', desc = 'Open in vertical split' },
|
||||
{ category = 'Neo-tree', key = 'Ctrl-t or t', desc = 'Open in new tab' },
|
||||
{ category = 'Neo-tree', key = 'w', desc = 'Open with window picker' },
|
||||
{ category = 'Neo-tree', key = 'Ctrl-j or >', desc = 'Next source (files/buffers/git)' },
|
||||
{ category = 'Neo-tree', key = 'Ctrl-k or <', desc = 'Previous source' },
|
||||
{ category = 'Neo-tree', key = 'P', desc = 'Toggle preview (float)' },
|
||||
{ category = 'Neo-tree', key = 'l', desc = 'Focus preview' },
|
||||
{ category = 'Neo-tree', key = 'R', desc = 'Refresh' },
|
||||
{ category = 'Neo-tree', key = 'H', desc = 'Toggle hidden files' },
|
||||
{ category = 'Neo-tree', key = '-', desc = 'Navigate up (parent dir)' },
|
||||
{ category = 'Neo-tree', key = '.', desc = 'Set root (cd into directory)' },
|
||||
{ category = 'Neo-tree', key = 'C', desc = 'Close node (collapse folder)' },
|
||||
{ category = 'Neo-tree', key = 'z', desc = 'Close all nodes' },
|
||||
{ category = 'Neo-tree', key = 'e', desc = 'Toggle auto expand width' },
|
||||
{ category = 'Neo-tree', key = 'a', desc = 'Add file' },
|
||||
{ category = 'Neo-tree', key = 'A', desc = 'Add directory' },
|
||||
{ category = 'Neo-tree', key = 'd', desc = 'Delete' },
|
||||
{ category = 'Neo-tree', key = 'r', desc = 'Rename' },
|
||||
{ category = 'Neo-tree', key = 'y', desc = 'Copy to clipboard' },
|
||||
{ category = 'Neo-tree', key = 'x', desc = 'Cut to clipboard' },
|
||||
{ category = 'Neo-tree', key = 'p', desc = 'Paste from clipboard' },
|
||||
{ category = 'Neo-tree', key = 'c', desc = 'Copy (with path input)' },
|
||||
{ category = 'Neo-tree', key = 'm', desc = 'Move (with path input)' },
|
||||
{ category = 'Neo-tree', key = '?', desc = 'Show help (in Neo-tree)' },
|
||||
{ category = 'Neo-tree', key = '<Space>sf', desc = 'Telescope find from this dir' },
|
||||
{ category = 'Neo-tree', key = '<Space>sg', desc = 'Telescope grep from this dir' },
|
||||
|
||||
-- ============================================================
|
||||
-- MINI.AI (TEXT OBJECTS)
|
||||
-- ============================================================
|
||||
{ category = 'Text Objects', key = 'a/i + object', desc = 'Around/inside (w, p, [, {, ", \', `, t)' },
|
||||
{ category = 'Text Objects', key = 'daw', desc = 'Delete around word' },
|
||||
{ category = 'Text Objects', key = 'ciw', desc = 'Change inside word' },
|
||||
{ category = 'Text Objects', key = 'di"', desc = 'Delete inside quotes' },
|
||||
{ category = 'Text Objects', key = 'da(', desc = 'Delete around parentheses' },
|
||||
{ category = 'Text Objects', key = 'vit', desc = 'Visual inside tag' },
|
||||
|
||||
-- ============================================================
|
||||
-- MINI.SURROUND
|
||||
-- ============================================================
|
||||
{ category = 'Surround', key = 'sa{motion}{char}', desc = 'Add surround' },
|
||||
{ category = 'Surround', key = 'sd{char}', desc = 'Delete surround' },
|
||||
{ category = 'Surround', key = 'sr{old}{new}', desc = 'Replace surround' },
|
||||
{ category = 'Surround', key = 'sf{char}', desc = 'Find right surround' },
|
||||
{ category = 'Surround', key = 'sF{char}', desc = 'Find left surround' },
|
||||
{ category = 'Surround', key = 'sh', desc = 'Highlight surround' },
|
||||
}
|
||||
|
||||
-- Create picker
|
||||
pickers
|
||||
.new({}, {
|
||||
prompt_title = ' Complete Cheatsheet',
|
||||
finder = finders.new_table {
|
||||
results = cheatsheet,
|
||||
entry_maker = function(entry)
|
||||
return {
|
||||
value = entry,
|
||||
display = string.format('%-20s %-25s %s', entry.category, entry.key, entry.desc),
|
||||
ordinal = entry.category .. ' ' .. entry.key .. ' ' .. entry.desc,
|
||||
}
|
||||
end,
|
||||
},
|
||||
sorter = conf.generic_sorter {},
|
||||
attach_mappings = function(prompt_bufnr, map)
|
||||
actions.select_default:replace(function()
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
if selection then
|
||||
vim.notify(
|
||||
string.format('%s: %s\n%s', selection.value.category, selection.value.key, selection.value.desc),
|
||||
vim.log.levels.INFO,
|
||||
{ title = 'Keymap' }
|
||||
)
|
||||
end
|
||||
end)
|
||||
return true
|
||||
end,
|
||||
})
|
||||
:find()
|
||||
end,
|
||||
desc = 'Cheatsheet (complete reference)',
|
||||
},
|
||||
{
|
||||
'<leader>?',
|
||||
function()
|
||||
require('telescope.builtin').keymaps()
|
||||
end,
|
||||
desc = 'Search keymaps',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Which-key can also show a searchable list
|
||||
{
|
||||
'folke/which-key.nvim',
|
||||
keys = {
|
||||
{
|
||||
'<leader>sK',
|
||||
function()
|
||||
require('which-key').show { global = true }
|
||||
end,
|
||||
desc = 'All keymaps (which-key)',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
49
lua/plugins/core/debug.lua
Normal file
49
lua/plugins/core/debug.lua
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
-- ========================================================================
|
||||
-- DEBUG CONFIGURATION - Global DAP keymaps
|
||||
-- ========================================================================
|
||||
-- These keymaps are available whenever nvim-dap is loaded
|
||||
-- Works for all languages: Flutter, Rust, Python, etc.
|
||||
-- ========================================================================
|
||||
|
||||
return {
|
||||
-- nvim-dap: Debug Adapter Protocol client
|
||||
{
|
||||
'mfussenegger/nvim-dap',
|
||||
optional = true,
|
||||
keys = {
|
||||
-- Function key shortcuts (standard debugging across all editors)
|
||||
{ '<F5>', function() require('dap').continue() end, desc = 'Debug: Start/Continue' },
|
||||
{ '<F10>', function() require('dap').step_over() end, desc = 'Debug: Step over' },
|
||||
{ '<F11>', function() require('dap').step_into() end, desc = 'Debug: Step into' },
|
||||
{ '<F12>', function() require('dap').step_out() end, desc = 'Debug: Step out' },
|
||||
|
||||
-- Leader-based debug commands (more discoverable)
|
||||
{ '<leader>db', function() require('dap').toggle_breakpoint() end, desc = 'Toggle breakpoint' },
|
||||
{ '<leader>dB', function() require('dap').set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = 'Conditional breakpoint' },
|
||||
{ '<leader>dc', function() require('dap').continue() end, desc = 'Continue' },
|
||||
{ '<leader>di', function() require('dap').step_into() end, desc = 'Step into' },
|
||||
{ '<leader>do', function() require('dap').step_out() end, desc = 'Step out' },
|
||||
{ '<leader>dO', function() require('dap').step_over() end, desc = 'Step over' },
|
||||
{ '<leader>dt', function() require('dap').terminate() end, desc = 'Terminate' },
|
||||
{ '<leader>dr', function() require('dap').repl.toggle() end, desc = 'Toggle REPL' },
|
||||
{ '<leader>dl', function() require('dap').run_last() end, desc = 'Run last' },
|
||||
{ '<leader>dC', function() require('dap').run_to_cursor() end, desc = 'Run to cursor' },
|
||||
},
|
||||
config = function()
|
||||
-- Register which-key group
|
||||
require('which-key').add {
|
||||
{ '<leader>d', group = ' debug' },
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- nvim-dap-ui: UI for nvim-dap
|
||||
{
|
||||
'rcarriga/nvim-dap-ui',
|
||||
optional = true,
|
||||
keys = {
|
||||
{ '<leader>du', function() require('dapui').toggle() end, desc = 'Toggle UI' },
|
||||
{ '<leader>de', function() require('dapui').eval() end, desc = 'Eval', mode = { 'n', 'v' } },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
@ -33,10 +33,64 @@ return {
|
|||
defaults = {
|
||||
mappings = {
|
||||
i = {
|
||||
-- Navigation (consistent with Neo-tree)
|
||||
['<C-j>'] = require('telescope.actions').move_selection_next,
|
||||
['<C-k>'] = require('telescope.actions').move_selection_previous,
|
||||
|
||||
-- Preview scrolling
|
||||
['<C-d>'] = require('telescope.actions').preview_scrolling_down,
|
||||
['<C-u>'] = require('telescope.actions').preview_scrolling_up,
|
||||
|
||||
-- Open actions (consistent with Neo-tree)
|
||||
['<CR>'] = require('telescope.actions').select_default, -- Open in current window
|
||||
['<C-x>'] = require('telescope.actions').select_horizontal, -- Open in horizontal split
|
||||
['<C-v>'] = require('telescope.actions').select_vertical, -- Open in vertical split
|
||||
['<C-t>'] = require('telescope.actions').select_tab, -- Open in new tab
|
||||
|
||||
-- Close
|
||||
['<C-c>'] = require('telescope.actions').close,
|
||||
['<Esc>'] = require('telescope.actions').close,
|
||||
|
||||
-- Cycle history
|
||||
['<C-n>'] = require('telescope.actions').cycle_history_next,
|
||||
['<C-p>'] = require('telescope.actions').cycle_history_prev,
|
||||
|
||||
-- Selection
|
||||
['<Tab>'] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_worse,
|
||||
['<S-Tab>'] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_better,
|
||||
|
||||
-- Send to quickfix
|
||||
['<C-q>'] = require('telescope.actions').send_to_qflist + require('telescope.actions').open_qflist,
|
||||
['<M-q>'] = require('telescope.actions').send_selected_to_qflist + require('telescope.actions').open_qflist,
|
||||
},
|
||||
n = {
|
||||
-- Same mappings in normal mode
|
||||
['<C-j>'] = require('telescope.actions').move_selection_next,
|
||||
['<C-k>'] = require('telescope.actions').move_selection_previous,
|
||||
['<C-d>'] = require('telescope.actions').preview_scrolling_down,
|
||||
['<C-u>'] = require('telescope.actions').preview_scrolling_up,
|
||||
|
||||
['<CR>'] = require('telescope.actions').select_default,
|
||||
['<C-x>'] = require('telescope.actions').select_horizontal,
|
||||
['<C-v>'] = require('telescope.actions').select_vertical,
|
||||
['<C-t>'] = require('telescope.actions').select_tab,
|
||||
|
||||
['q'] = require('telescope.actions').close,
|
||||
['<Esc>'] = require('telescope.actions').close,
|
||||
|
||||
['<Tab>'] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_worse,
|
||||
['<S-Tab>'] = require('telescope.actions').toggle_selection + require('telescope.actions').move_selection_better,
|
||||
|
||||
['<C-q>'] = require('telescope.actions').send_to_qflist + require('telescope.actions').open_qflist,
|
||||
['<M-q>'] = 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
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -88,6 +142,24 @@ return {
|
|||
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 {
|
||||
|
|
@ -122,13 +194,28 @@ return {
|
|||
},
|
||||
},
|
||||
spec = {
|
||||
{ '<leader>Q', group = '[Q]uit' },
|
||||
{ '<leader>c', group = '[c]ode' },
|
||||
{ '<leader>s', group = '[s]earch' },
|
||||
{ '<leader>S', group = '[S]ession' },
|
||||
{ '<leader>t', group = '[T]oggle' },
|
||||
{ '<leader>x', group = 'diagnostics/quickfi[x]' },
|
||||
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } },
|
||||
-- Core groups with icons
|
||||
{ '<leader>b', group = ' buffer', icon = '' },
|
||||
{ '<leader>c', group = ' code', icon = '' },
|
||||
{ '<leader>d', group = ' debug', icon = '' },
|
||||
{ '<leader>f', group = ' flutter', icon = '' }, -- Only visible in Dart files
|
||||
{ '<leader>g', group = ' git', icon = '' },
|
||||
{ '<leader>p', group = ' python', icon = '' }, -- Only visible in Python files
|
||||
{ '<leader>r', group = ' rust', icon = '' }, -- Only visible in Rust files
|
||||
{ '<leader>s', group = ' search', icon = '' },
|
||||
{ '<leader>S', group = ' session', icon = '' },
|
||||
{ '<leader>t', group = ' toggle', icon = '' },
|
||||
{ '<leader>u', group = ' ui', icon = '' },
|
||||
{ '<leader>v', group = ' svelte', icon = '' }, -- Only visible in Svelte files
|
||||
{ '<leader>w', group = ' window', icon = '' },
|
||||
{ '<leader>x', group = ' diagnostics', icon = '' },
|
||||
|
||||
-- Special groups
|
||||
{ '<leader>q', desc = ' Quickfix diagnostics' },
|
||||
{ '<leader>Q', desc = ' Quit all' },
|
||||
|
||||
-- Git hunks (normal and visual mode)
|
||||
{ '<leader>h', group = ' git hunk', mode = { 'n', 'v' }, icon = '' },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -53,9 +53,50 @@ return {
|
|||
width = 30,
|
||||
mappings = {
|
||||
['\\'] = 'close_window',
|
||||
-- Make <leader>sf work the same in Neo-tree as in editor
|
||||
|
||||
-- Consistent with Telescope: <C-x> = split, <C-v> = vsplit, <C-t> = tabnew
|
||||
['<C-x>'] = 'split_with_window_picker',
|
||||
['<C-v>'] = 'vsplit_with_window_picker',
|
||||
['<C-t>'] = 'open_tabnew',
|
||||
|
||||
-- Open file (consistent with Telescope <CR>)
|
||||
['<CR>'] = 'open',
|
||||
['o'] = 'open',
|
||||
|
||||
-- Navigation
|
||||
['<C-j>'] = 'next_source', -- Match Telescope down navigation
|
||||
['<C-k>'] = 'prev_source', -- Match Telescope up navigation
|
||||
|
||||
-- Preview (like Telescope)
|
||||
['P'] = { 'toggle_preview', config = { use_float = true } },
|
||||
|
||||
-- Telescope integration from Neo-tree
|
||||
['<leader>sf'] = 'telescope_find',
|
||||
['<leader>sg'] = 'telescope_grep',
|
||||
|
||||
-- Refresh
|
||||
['R'] = 'refresh',
|
||||
|
||||
-- Toggle hidden files
|
||||
['H'] = 'toggle_hidden',
|
||||
|
||||
-- Navigation
|
||||
['-'] = 'navigate_up',
|
||||
['.'] = 'set_root',
|
||||
|
||||
-- File operations
|
||||
['a'] = 'add',
|
||||
['A'] = 'add_directory',
|
||||
['d'] = 'delete',
|
||||
['r'] = 'rename',
|
||||
['y'] = 'copy_to_clipboard',
|
||||
['x'] = 'cut_to_clipboard',
|
||||
['p'] = 'paste_from_clipboard',
|
||||
['c'] = 'copy', -- Copy (takes a path as input)
|
||||
['m'] = 'move', -- Move (takes a path as input)
|
||||
|
||||
-- Help
|
||||
['?'] = 'show_help',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ return {
|
|||
-- ========================================================================
|
||||
vim.api.nvim_create_autocmd('FileType', {
|
||||
pattern = 'dart',
|
||||
callback = function()
|
||||
callback = function(event)
|
||||
local opts = { buffer = true, silent = true }
|
||||
|
||||
-- ========================================================================
|
||||
|
|
@ -402,51 +402,9 @@ return {
|
|||
)
|
||||
vim.keymap.set('n', '<leader>fl', '<cmd>FlutterLspRestart<cr>', vim.tbl_extend('force', opts, { desc = '[F]lutter [L]SP Restart' }))
|
||||
|
||||
-- ========================================================================
|
||||
-- DEBUG KEYMAPS - Available only in Dart files
|
||||
-- ========================================================================
|
||||
-- Function key shortcuts (standard debugging)
|
||||
vim.keymap.set('n', '<F5>', function()
|
||||
require('dap').continue()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Start/Continue' }))
|
||||
|
||||
vim.keymap.set('n', '<F10>', function()
|
||||
require('dap').step_over()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Step Over' }))
|
||||
|
||||
vim.keymap.set('n', '<F11>', function()
|
||||
require('dap').step_into()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Step Into' }))
|
||||
|
||||
vim.keymap.set('n', '<F12>', function()
|
||||
require('dap').step_out()
|
||||
end, vim.tbl_extend('force', opts, { desc = 'Debug: Step Out' }))
|
||||
|
||||
-- Leader-based debug commands
|
||||
vim.keymap.set('n', '<leader>db', function()
|
||||
require('dap').toggle_breakpoint()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: Toggle [B]reakpoint' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>dB', function()
|
||||
require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ')
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: Set Conditional [B]reakpoint' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>dc', function()
|
||||
require('dap').continue()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: [C]ontinue' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>dt', function()
|
||||
require('dap').terminate()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: [T]erminate' }))
|
||||
|
||||
vim.keymap.set('n', '<leader>du', function()
|
||||
require('dapui').toggle()
|
||||
end, vim.tbl_extend('force', opts, { desc = '[D]ebug: Toggle [U]I' }))
|
||||
|
||||
-- Register groups with which-key
|
||||
-- Register which-key group for Flutter
|
||||
require('which-key').add {
|
||||
{ '<leader>f', group = '[F]lutter', mode = 'n' },
|
||||
{ '<leader>d', group = '[D]ebug', mode = 'n' },
|
||||
{ '<leader>f', group = ' flutter', mode = 'n', buffer = event.buf },
|
||||
}
|
||||
end,
|
||||
})
|
||||
|
|
|
|||
|
|
@ -173,4 +173,54 @@ return {
|
|||
return opts
|
||||
end,
|
||||
},
|
||||
|
||||
-- Python keymaps (loaded only for Python files)
|
||||
{
|
||||
'nvim-lspconfig',
|
||||
ft = 'python',
|
||||
config = function()
|
||||
vim.api.nvim_create_autocmd('FileType', {
|
||||
pattern = 'python',
|
||||
callback = function(event)
|
||||
local bufnr = event.buf
|
||||
|
||||
-- Register which-key group for Python
|
||||
require('which-key').add {
|
||||
{ '<leader>p', group = ' python', buffer = bufnr },
|
||||
}
|
||||
|
||||
-- Run current file
|
||||
vim.keymap.set('n', '<leader>pr', function()
|
||||
vim.cmd('!python3 %')
|
||||
end, { buffer = bufnr, desc = 'Run file' })
|
||||
|
||||
-- Run with arguments
|
||||
vim.keymap.set('n', '<leader>pR', function()
|
||||
local args = vim.fn.input 'Arguments: '
|
||||
vim.cmd('!python3 % ' .. args)
|
||||
end, { buffer = bufnr, desc = 'Run with args' })
|
||||
|
||||
-- Select virtual environment
|
||||
vim.keymap.set('n', '<leader>pe', function()
|
||||
vim.cmd 'PythonSelectVenv'
|
||||
end, { buffer = bufnr, desc = 'Select venv' })
|
||||
|
||||
-- Restart Python LSP
|
||||
vim.keymap.set('n', '<leader>pl', function()
|
||||
vim.cmd 'PythonRestart'
|
||||
end, { buffer = bufnr, desc = 'Restart LSP' })
|
||||
|
||||
-- Import organization (via Ruff)
|
||||
vim.keymap.set('n', '<leader>pi', function()
|
||||
require('conform').format { formatters = { 'ruff_organize_imports' } }
|
||||
end, { buffer = bufnr, desc = 'Organize imports' })
|
||||
|
||||
-- Format with Ruff
|
||||
vim.keymap.set('n', '<leader>pf', function()
|
||||
require('conform').format { formatters = { 'ruff_format' } }
|
||||
end, { buffer = bufnr, desc = 'Format code' })
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
|
|
|
|||
272
lua/plugins/lang/rust.lua
Normal file
272
lua/plugins/lang/rust.lua
Normal file
|
|
@ -0,0 +1,272 @@
|
|||
-- Rust Development Configuration
|
||||
-- Loaded only for Rust files (*.rs)
|
||||
|
||||
return {
|
||||
-- Rust Tools - Enhanced rust-analyzer integration
|
||||
{
|
||||
'mrcjkb/rustaceanvim',
|
||||
version = '^5',
|
||||
lazy = false, -- Already lazy-loaded by filetype
|
||||
ft = { 'rust' },
|
||||
opts = {
|
||||
server = {
|
||||
on_attach = function(client, bufnr)
|
||||
-- Register which-key group for Rust
|
||||
require('which-key').add {
|
||||
{ '<leader>r', group = ' rust', buffer = bufnr },
|
||||
}
|
||||
|
||||
-- Hover actions
|
||||
vim.keymap.set('n', '<leader>rh', function()
|
||||
vim.cmd.RustLsp { 'hover', 'actions' }
|
||||
end, { buffer = bufnr, desc = 'Hover actions' })
|
||||
|
||||
-- Code actions
|
||||
vim.keymap.set('n', '<leader>ra', function()
|
||||
vim.cmd.RustLsp('codeAction')
|
||||
end, { buffer = bufnr, desc = 'Code actions' })
|
||||
|
||||
-- Explain error
|
||||
vim.keymap.set('n', '<leader>re', function()
|
||||
vim.cmd.RustLsp('explainError')
|
||||
end, { buffer = bufnr, desc = 'Explain error' })
|
||||
|
||||
-- Open Cargo.toml
|
||||
vim.keymap.set('n', '<leader>rC', function()
|
||||
vim.cmd.RustLsp('openCargo')
|
||||
end, { buffer = bufnr, desc = 'Open Cargo.toml' })
|
||||
|
||||
-- Parent module
|
||||
vim.keymap.set('n', '<leader>rp', function()
|
||||
vim.cmd.RustLsp('parentModule')
|
||||
end, { buffer = bufnr, desc = 'Parent module' })
|
||||
|
||||
-- Join lines
|
||||
vim.keymap.set('n', '<leader>rj', function()
|
||||
vim.cmd.RustLsp('joinLines')
|
||||
end, { buffer = bufnr, desc = 'Join lines' })
|
||||
|
||||
-- Runnables
|
||||
vim.keymap.set('n', '<leader>rr', function()
|
||||
vim.cmd.RustLsp('runnables')
|
||||
end, { buffer = bufnr, desc = 'Runnables' })
|
||||
|
||||
-- Debuggables
|
||||
vim.keymap.set('n', '<leader>rd', function()
|
||||
vim.cmd.RustLsp('debuggables')
|
||||
end, { buffer = bufnr, desc = 'Debuggables' })
|
||||
|
||||
-- Expand macro
|
||||
vim.keymap.set('n', '<leader>rm', function()
|
||||
vim.cmd.RustLsp('expandMacro')
|
||||
end, { buffer = bufnr, desc = 'Expand macro' })
|
||||
end,
|
||||
default_settings = {
|
||||
-- rust-analyzer language server configuration
|
||||
['rust-analyzer'] = {
|
||||
cargo = {
|
||||
allFeatures = true,
|
||||
loadOutDirsFromCheck = true,
|
||||
buildScripts = {
|
||||
enable = true,
|
||||
},
|
||||
},
|
||||
-- Add clippy lints for Rust
|
||||
checkOnSave = {
|
||||
allFeatures = true,
|
||||
command = 'clippy',
|
||||
extraArgs = { '--no-deps' },
|
||||
},
|
||||
procMacro = {
|
||||
enable = true,
|
||||
ignored = {
|
||||
['async-trait'] = { 'async_trait' },
|
||||
['napi-derive'] = { 'napi' },
|
||||
['async-recursion'] = { 'async_recursion' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
-- DAP configuration
|
||||
dap = {
|
||||
adapter = {
|
||||
type = 'executable',
|
||||
command = 'lldb-vscode', -- or 'lldb-dap' on newer versions
|
||||
name = 'lldb',
|
||||
},
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
vim.g.rustaceanvim = vim.tbl_deep_extend('keep', vim.g.rustaceanvim or {}, opts or {})
|
||||
end,
|
||||
},
|
||||
|
||||
-- Crates.io integration
|
||||
{
|
||||
'saecki/crates.nvim',
|
||||
event = { 'BufRead Cargo.toml' },
|
||||
opts = {
|
||||
completion = {
|
||||
cmp = {
|
||||
enabled = true,
|
||||
},
|
||||
},
|
||||
lsp = {
|
||||
enabled = true,
|
||||
actions = true,
|
||||
completion = true,
|
||||
hover = true,
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
local crates = require 'crates'
|
||||
crates.setup(opts)
|
||||
|
||||
-- Crates keymaps (only in Cargo.toml)
|
||||
vim.api.nvim_create_autocmd('BufRead', {
|
||||
pattern = 'Cargo.toml',
|
||||
callback = function()
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
|
||||
-- Register which-key group for Rust Crates
|
||||
require('which-key').add {
|
||||
{ '<leader>rc', group = ' crates', buffer = bufnr },
|
||||
}
|
||||
|
||||
vim.keymap.set('n', '<leader>rct', function()
|
||||
crates.toggle()
|
||||
end, { buffer = bufnr, desc = 'Toggle crates' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcr', function()
|
||||
crates.reload()
|
||||
end, { buffer = bufnr, desc = 'Reload crates' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcv', function()
|
||||
crates.show_versions_popup()
|
||||
end, { buffer = bufnr, desc = 'Show versions' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcf', function()
|
||||
crates.show_features_popup()
|
||||
end, { buffer = bufnr, desc = 'Show features' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcd', function()
|
||||
crates.show_dependencies_popup()
|
||||
end, { buffer = bufnr, desc = 'Show dependencies' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcu', function()
|
||||
crates.update_crate()
|
||||
end, { buffer = bufnr, desc = 'Update crate' })
|
||||
|
||||
vim.keymap.set('v', '<leader>rcu', function()
|
||||
crates.update_crates()
|
||||
end, { buffer = bufnr, desc = 'Update selected' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rca', function()
|
||||
crates.update_all_crates()
|
||||
end, { buffer = bufnr, desc = 'Update all' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcU', function()
|
||||
crates.upgrade_crate()
|
||||
end, { buffer = bufnr, desc = 'Upgrade crate' })
|
||||
|
||||
vim.keymap.set('v', '<leader>rcU', function()
|
||||
crates.upgrade_crates()
|
||||
end, { buffer = bufnr, desc = 'Upgrade selected' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcA', function()
|
||||
crates.upgrade_all_crates()
|
||||
end, { buffer = bufnr, desc = 'Upgrade all' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rce', function()
|
||||
crates.expand_plain_crate_to_inline_table()
|
||||
end, { buffer = bufnr, desc = 'Expand to inline' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcE', function()
|
||||
crates.extract_crate_into_table()
|
||||
end, { buffer = bufnr, desc = 'Extract to table' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcH', function()
|
||||
crates.open_homepage()
|
||||
end, { buffer = bufnr, desc = 'Open homepage' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcR', function()
|
||||
crates.open_repository()
|
||||
end, { buffer = bufnr, desc = 'Open repository' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcD', function()
|
||||
crates.open_documentation()
|
||||
end, { buffer = bufnr, desc = 'Open documentation' })
|
||||
|
||||
vim.keymap.set('n', '<leader>rcC', function()
|
||||
crates.open_crates_io()
|
||||
end, { buffer = bufnr, desc = 'Open crates.io' })
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- Mason tool installations for Rust
|
||||
{
|
||||
'williamboman/mason.nvim',
|
||||
opts = function(_, opts)
|
||||
opts.ensure_installed = opts.ensure_installed or {}
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
'rust-analyzer',
|
||||
'codelldb', -- For debugging
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- Treesitter for Rust
|
||||
{
|
||||
'nvim-treesitter/nvim-treesitter',
|
||||
opts = function(_, opts)
|
||||
opts.ensure_installed = opts.ensure_installed or {}
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
'rust',
|
||||
'ron', -- Rusty Object Notation
|
||||
'toml', -- For Cargo.toml
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- DAP configuration for Rust
|
||||
{
|
||||
'mfussenegger/nvim-dap',
|
||||
optional = true,
|
||||
opts = function()
|
||||
local dap = require 'dap'
|
||||
|
||||
dap.configurations.rust = {
|
||||
{
|
||||
name = 'Launch',
|
||||
type = 'codelldb',
|
||||
request = 'launch',
|
||||
program = function()
|
||||
return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/target/debug/', 'file')
|
||||
end,
|
||||
cwd = '${workspaceFolder}',
|
||||
stopOnEntry = false,
|
||||
args = {},
|
||||
},
|
||||
{
|
||||
name = 'Attach to process',
|
||||
type = 'codelldb',
|
||||
request = 'attach',
|
||||
pid = require('dap.utils').pick_process,
|
||||
args = {},
|
||||
},
|
||||
}
|
||||
|
||||
dap.adapters.codelldb = {
|
||||
type = 'server',
|
||||
port = '${port}',
|
||||
executable = {
|
||||
command = vim.fn.exepath 'codelldb',
|
||||
args = { '--port', '${port}' },
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
}
|
||||
|
|
@ -180,4 +180,48 @@ return {
|
|||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- ========================================================================
|
||||
-- SVELTE-SPECIFIC KEYMAPS
|
||||
-- ========================================================================
|
||||
-- Additional Svelte-specific settings and keymaps
|
||||
-- ========================================================================
|
||||
{
|
||||
'nvim-lspconfig',
|
||||
ft = 'svelte',
|
||||
config = function()
|
||||
vim.api.nvim_create_autocmd('FileType', {
|
||||
pattern = 'svelte',
|
||||
callback = function(event)
|
||||
local bufnr = event.buf
|
||||
|
||||
-- Register which-key group for Svelte
|
||||
require('which-key').add {
|
||||
{ '<leader>v', group = ' svelte', buffer = bufnr },
|
||||
}
|
||||
|
||||
-- Format with Prettier
|
||||
vim.keymap.set('n', '<leader>vf', function()
|
||||
require('conform').format { formatters = { 'prettier' } }
|
||||
end, { buffer = bufnr, desc = 'Format with prettier' })
|
||||
|
||||
-- Restart Svelte LSP
|
||||
vim.keymap.set('n', '<leader>vl', function()
|
||||
vim.cmd 'LspRestart svelte'
|
||||
end, { buffer = bufnr, desc = 'Restart LSP' })
|
||||
|
||||
-- Restart TypeScript LSP (often needed in Svelte projects)
|
||||
vim.keymap.set('n', '<leader>vt', function()
|
||||
vim.cmd 'LspRestart ts_ls'
|
||||
end, { buffer = bufnr, desc = 'Restart TypeScript LSP' })
|
||||
|
||||
-- Open component in split
|
||||
vim.keymap.set('n', '<leader>vo', function()
|
||||
local word = vim.fn.expand '<cfile>'
|
||||
vim.cmd('split ' .. word)
|
||||
end, { buffer = bufnr, desc = 'Open component in split' })
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue