diff --git a/DATABASE_SETUP_GUIDE.md b/DATABASE_SETUP_GUIDE.md deleted file mode 100644 index 5f59e83..0000000 --- a/DATABASE_SETUP_GUIDE.md +++ /dev/null @@ -1,83 +0,0 @@ -# Database Setup Guide - -## Current Status: ✅ **FIXED** - -The database error has been resolved! The database plugins are now configured to prevent automatic connections that were causing the startup error. - -## What Was Fixed - -1. **Disabled Auto-Connections**: Set `db_ui_auto_execute_table_helpers = 0` to prevent automatic database connections -2. **Removed Keymap Conflicts**: Temporarily disabled database keymaps to prevent accidental triggers -3. **Safe Configuration**: Database plugins are loaded but won't attempt to connect automatically - -## To Re-Enable Database Functionality - -When you want to use database features, you can: - -### 1. Re-enable Database Keymaps -Uncomment the database keymaps in `lua/cargdev/core/keymaps/plugins.lua`: - -```lua --- Change from: --- keymap.set("n", "du", "DBUI", { desc = "Open Database UI" }) - --- To: -keymap.set("n", "du", "DBUI", { desc = "Open Database UI" }) -``` - -### 2. Manual Database Usage -You can still use database features manually: - -- **Open Database UI**: `:DBUI` -- **Add Connection**: `:DBUIAddConnection` -- **Execute SQL**: `:DBExecute` -- **Format SQL**: `:SQLFormat` - -### 3. Database Keymaps (when re-enabled) -- **`du`** - Open Database UI -- **`dua`** - Add database connection -- **`due`** - Execute SQL query -- **`dus`** - Select SQL query -- **`dut`** - Create table -- **`duf`** - Format SQL query - -## Supported Databases - -- **SQLite**: `sqlite3` -- **MySQL**: `mysql` -- **PostgreSQL**: `psql` -- **Redis**: `redis-cli` - -## Installation Requirements - -Make sure you have the database clients installed: - -```bash -# macOS -brew install mysql redis mongodb/brew/mongodb-community - -# Ubuntu/Debian -sudo apt install mysql-client postgresql-client redis-tools - -# CentOS/RHEL -sudo yum install mysql postgresql redis -``` - -## Troubleshooting - -If you encounter database errors again: - -1. **Check for saved connections**: Look for `.dadbod` files in your project directories -2. **Clear database cache**: Remove any saved database sessions -3. **Verify adapters**: Ensure database clients are properly installed -4. **Check keymaps**: Make sure there are no conflicting keymaps - -## Current Configuration - -The database plugins are configured with: -- ✅ **No automatic connections** -- ✅ **Manual trigger only** -- ✅ **Proper adapters configured** -- ✅ **No startup errors** - -Your Neovim should now start cleanly without any database errors! 🎉 \ No newline at end of file diff --git a/keybind.json b/keybind.json index 3582b68..9e0b3f5 100644 --- a/keybind.json +++ b/keybind.json @@ -1,4 +1,8 @@ [ + { + "key": "cmd+i", + "command": "composerMode.agent" + }, { "key": "ctrl-h", "command": "workbench.action.navigateLeft" @@ -35,121 +39,13 @@ "workbench.action.focusActiveEditorGroup" ] }, - "when": "sideBarFocus && !inputFocus" + "when": "vim.mode == 'Normal' && sideBarFocus && !inputFocus" }, { "key": "space e", "when": "vim.mode == 'Normal' && editorTextFocus && foldersViewVisible", "command": "workbench.action.toggleSidebarVisibility" }, - { - "key": "s h", - "command": "workbench.action.splitEditor", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "s v", - "command": "workbench.action.splitEditorDown", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "space c a", - "command": "editor.action.codeAction", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "shift-k", - "command": "editor.action.moveLinesUpAction", - "when": "vim.mode == 'VisualLine' && editorTextFocus" - }, - { - "key": "shift-j", - "command": "editor.action.moveLinesDownAction", - "when": "vim.mode == 'VisualLine' && editorTextFocus" - }, - { - "key": "shift-k", - "command": "editor.action.showHover", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "space c r", - "command": "editor.action.rename", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "space c s", - "command": "workbench.action.gotoSymbol", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "space b d", - "command": "workbench.action.closeActiveEditor", - "when": "(vim.mode == 'Normal' && editorTextFocus) || !inputFocus" - }, - { - "key": "space b o", - "command": "workbench.action.closeOtherEditors", - "when": "(vim.mode == 'Normal' && editorTextFocus) || !inputFocus" - }, - { - "key": "space space", - "command": "workbench.action.quickOpen", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "space g d", - "command": "editor.action.revealDefinition", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "space g r", - "command": "editor.action.goToReferences", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "space g i", - "command": "editor.action.goToImplementation", - "when": "vim.mode == 'Normal' && editorTextFocus" - }, - { - "key": "space s g", - "command": "workbench.action.findInFiles", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "space g g", - "command": "runCommands", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)", - "args": { - "commands": ["workbench.view.scm", "workbench.scm.focus"] - } - }, - { - "key": "ctrl-n", - "command": "editor.action.addSelectionToNextFindMatch", - "when": "(vim.mode == 'Normal' || vim.mode == 'Visual') && (editorTextFocus || !inputFocus)" - }, - { - "key": "ctrl-n", - "command": "workbench.action.toggleSidebarVisibility", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "space f s", - "command": "workbench.action.findInFiles", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "n", - "command": "search.action.focusNextSearchResult", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "shift-n", - "command": "search.action.focusPreviousSearchResult", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, { "key": "ctrl-w h", "command": "workbench.action.navigateLeft", @@ -171,51 +67,39 @@ "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" }, { - "key": "r", + "key": "space r", "command": "renameFile", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { - "key": "x", + "key": "space x", "command": "filesExplorer.cut", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { - "key": "d", + "key": "space d", "command": "deleteFile", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { - "key": "a", + "key": "space a", "command": "explorer.newFile", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { - "key": "s", + "key": "space s", "command": "explorer.openToSide", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus" - }, - { - "key": "shift-s", - "command": "runCommands", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus", - "args": { - "commands": [ - "workbench.action.splitEditorDown", - "explorer.openAndPassFocus", - "workbench.action.closeOtherEditors" - ] - } + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { "key": "enter", "command": "explorer.openAndPassFocus", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceIsFolder && !inputFocus" + "when": "filesExplorerFocus && !explorerResourceIsFolder && !inputFocus" }, { "key": "enter", "command": "list.toggleExpand", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && explorerResourceIsFolder && !inputFocus" + "when": "filesExplorerFocus && explorerResourceIsFolder && !inputFocus" }, { "key": "space d a", @@ -227,6 +111,18 @@ "command": "workbench.action.debug.stop", "when": "vim.mode == 'Normal' && editorTextFocus && inDebugMode && !focusedSessionIsAttached" }, + { + "key": "space shift-s", + "command": "runCommands", + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus", + "args": { + "commands": [ + "workbench.action.splitEditorDown", + "explorer.openAndPassFocus", + "workbench.action.closeOtherEditors" + ] + } + }, { "key": "space d o", "command": "workbench.action.debug.stepOver", @@ -247,11 +143,6 @@ "command": "workbench.action.debug.continue", "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus) && inDebugMode && debugState == 'stopped'" }, - { - "key": "space u", - "command": "editor.action.selectAll", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, { "key": "space w", "command": "workbench.action.files.save", @@ -267,21 +158,6 @@ "command": "workbench.action.closeAllEditors", "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" }, - { - "key": "y", - "command": "editor.action.clipboardCopyAction", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "d d", - "command": "editor.action.deleteLines", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, - { - "key": "p", - "command": "editor.action.clipboardPasteAction", - "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" - }, { "key": "ctrl-e", "command": "editorScroll", @@ -296,18 +172,18 @@ }, { "key": "space n t", - "command": "workbench.files.action.showActiveFileInExplorer", + "command": "workbench.view.explorer", "when": "vim.mode == 'Normal' && (editorTextFocus || !inputFocus)" }, { - "key": "o", + "key": "space o", "command": "workbench.action.splitEditorRight", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !inputFocus" + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { - "key": "i", + "key": "space i", "command": "workbench.action.splitEditorDown", - "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !inputFocus" + "when": "vim.mode == 'Normal' && filesExplorerFocus && !inputFocus" }, { "key": "ctrl-p", diff --git a/lua/cargdev/core/function/notification_manager.lua b/lua/cargdev/core/function/notification_manager.lua new file mode 100644 index 0000000..fbb477a --- /dev/null +++ b/lua/cargdev/core/function/notification_manager.lua @@ -0,0 +1,313 @@ +-- Custom notification manager to handle overlapping and improve UX +local M = {} + +-- Track active notifications to prevent overlapping +local active_notifications = {} +local notification_queue = {} + +-- Function to show a notification without overlapping +function M.show_notification(message, level, opts) + level = level or vim.log.levels.INFO + opts = opts or {} + + -- Default options + local default_opts = { + timeout = 3000, + title = "CarGDev Neovim", + render = "minimal", + stages = "fade_in_slide_out", + position = "top_right", + max_width = 50, + max_height = 8, + background_colour = "#000000", + border_style = "rounded", + } + + -- Merge options + for k, v in pairs(default_opts) do + if opts[k] == nil then + opts[k] = v + end + end + + -- Check if we're in alpha dashboard + local current_buf = vim.api.nvim_get_current_buf() + local current_ft = vim.api.nvim_buf_get_option(current_buf, "filetype") + + if current_ft == "alpha" then + -- If in dashboard, use a different approach + M.show_dashboard_notification(message, level, opts) + return + end + + -- Use nvim-notify if available + local notify_available = pcall(require, "notify") + if notify_available then + local notify = require("notify") + + -- Position notification to avoid overlapping + opts.on_open = function(win) + -- Calculate position to avoid overlapping with other notifications + local row = 2 + local col = vim.o.columns - 60 + + -- Adjust position if there are other notifications + for _, notif in ipairs(active_notifications) do + if notif.win and vim.api.nvim_win_is_valid(notif.win) then + row = row + 10 -- Stack notifications vertically + end + end + + -- Ensure notification doesn't go off-screen + if row > vim.o.lines - 15 then + row = 2 + col = col - 20 + end + + vim.api.nvim_win_set_config(win, { + row = row, + col = col, + relative = "editor", + width = opts.max_width, + height = opts.max_height, + }) + + -- Track this notification + table.insert(active_notifications, { + win = win, + message = message, + timestamp = vim.loop.now(), + }) + end + + opts.on_close = function(win) + -- Remove from active notifications + for i, notif in ipairs(active_notifications) do + if notif.win == win then + table.remove(active_notifications, i) + break + end + end + end + + -- Show notification + local notification_id = notify(message, level, opts) + return notification_id + else + -- Fallback to echo instead of vim.notify to avoid circular dependency + local icon = "💬" + if level == vim.log.levels.ERROR then + icon = "❌" + elseif level == vim.log.levels.WARN then + icon = "⚠️" + elseif level == vim.log.levels.INFO then + icon = "ℹ️" + end + + -- Use echo for fallback notifications + vim.cmd("echo '" .. icon .. " " .. message .. "'") + + -- Clear message after a delay + vim.defer_fn(function() + vim.cmd("echo ''") + end, opts.timeout or 3000) + end +end + +-- Function to show notifications specifically for dashboard +function M.show_dashboard_notification(message, level, opts) + -- In dashboard, show minimal notifications + local icon = "💬" + if level == vim.log.levels.ERROR then + icon = "❌" + elseif level == vim.log.levels.WARN then + icon = "⚠️" + elseif level == vim.log.levels.INFO then + icon = "ℹ️" + end + + -- Show message in status line or use echo + local short_message = message:sub(1, 50) + if #message > 50 then + short_message = short_message .. "..." + end + + -- Use echo for dashboard notifications to avoid overlapping + vim.cmd("echo '" .. icon .. " " .. short_message .. "'") + + -- Clear message after a delay + vim.defer_fn(function() + vim.cmd("echo ''") + end, opts.timeout or 3000) +end + +-- Function to clear all notifications +function M.clear_all_notifications() + for _, notif in ipairs(active_notifications) do + if notif.win and vim.api.nvim_win_is_valid(notif.win) then + vim.api.nvim_win_close(notif.win, true) + end + end + active_notifications = {} +end + +-- Function to show performance notification +function M.show_performance_notification(message, level) + M.show_notification("📊 " .. message, level, { + title = "Performance Monitor", + timeout = 4000, + position = "top_right", + }) +end + +-- Function to show LSP notification +function M.show_lsp_notification(message, level) + M.show_notification("🔧 " .. message, level, { + title = "LSP Status", + timeout = 3000, + position = "top_right", + }) +end + +-- Function to show file operation notification +function M.show_file_notification(message, level) + M.show_notification("📁 " .. message, level, { + title = "File Operation", + timeout = 2500, + position = "top_right", + }) +end + +-- Function to show plugin notification +function M.show_plugin_notification(message, level) + M.show_notification("🦥 " .. message, level, { + title = "Plugin Manager", + timeout = 3000, + position = "top_right", + }) +end + +-- Function to show startup notification +function M.show_startup_notification(message, level) + M.show_notification("🚀 " .. message, level, { + title = "Startup", + timeout = 2000, + position = "top_right", + }) +end + +-- Function to handle startup messages aggressively +function M.handle_startup_messages() + -- Clear any existing messages immediately + vim.cmd("redraw!") + vim.cmd("echo ''") + + -- Suppress all startup messages + vim.opt.shortmess = vim.opt.shortmess + "I" -- No intro message + vim.opt.shortmess = vim.opt.shortmess + "c" -- No completion messages + vim.opt.shortmess = vim.opt.shortmess + "F" -- No file info message + vim.opt.shortmess = vim.opt.shortmess + "W" -- No "written" message + vim.opt.shortmess = vim.opt.shortmess + "A" -- No attention message + vim.opt.shortmess = vim.opt.shortmess + "o" -- No overwrite messages + vim.opt.shortmess = vim.opt.shortmess + "t" -- No truncation messages + vim.opt.shortmess = vim.opt.shortmess + "T" -- No truncation messages + vim.opt.shortmess = vim.opt.shortmess + "f" -- No file info messages + vim.opt.shortmess = vim.opt.shortmess + "i" -- No intro messages + vim.opt.shortmess = vim.opt.shortmess + "l" -- No line number messages + vim.opt.shortmess = vim.opt.shortmess + "m" -- No modification messages + vim.opt.shortmess = vim.opt.shortmess + "n" -- No line number messages + vim.opt.shortmess = vim.opt.shortmess + "r" -- No read messages + vim.opt.shortmess = vim.opt.shortmess + "s" -- No search messages + vim.opt.shortmess = vim.opt.shortmess + "x" -- No truncation messages + vim.opt.shortmess = vim.opt.shortmess + "O" -- No overwrite messages + + -- Disable command line messages + vim.opt.cmdheight = 0 + vim.opt.showmode = false + + -- Clear any existing messages + vim.cmd("echo ''") + + -- Force clear any pending messages + vim.defer_fn(function() + vim.cmd("redraw!") + vim.cmd("echo ''") + end, 100) +end + +-- Function to eliminate "Press ENTER" prompts completely +function M.eliminate_enter_prompts() + -- Override the message display to prevent "Press ENTER" prompts + local original_echo = vim.cmd.echo + vim.cmd.echo = function(msg) + local msg_str = tostring(msg) + -- Block any messages that might cause "Press ENTER" prompts + if msg_str:match("Press ENTER") or + msg_str:match("lazyredraw") or + msg_str:match("You have enabled") or + msg_str:match("This is only meant") or + msg_str:match("You'll experience issues") then + return -- Don't show these messages + end + -- Allow other messages + original_echo(msg) + end + + -- Create autocmd to handle any remaining prompts + vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + -- Clear any startup messages immediately + vim.cmd("redraw!") + vim.cmd("echo ''") + + -- Force clear any pending messages multiple times + for i = 1, 5 do + vim.defer_fn(function() + vim.cmd("redraw!") + vim.cmd("echo ''") + end, i * 50) + end + end, + once = true, + }) + + -- Create autocmd to handle message events - use valid events + vim.api.nvim_create_autocmd("BufReadPost", { + callback = function() + -- Clear messages that might cause prompts + vim.cmd("redraw!") + end, + }) +end + +-- Function to setup notification system +function M.setup() + -- Create autocmd to handle startup messages + vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + M.handle_startup_messages() + end, + once = true, + }) + + -- Create autocmd to handle alpha dashboard + vim.api.nvim_create_autocmd("FileType", { + pattern = "alpha", + callback = function() + M.handle_startup_messages() + end, + }) + + -- Eliminate "Press ENTER" prompts + M.eliminate_enter_prompts() + + -- Don't override vim.notify here to avoid circular dependency + -- Let the system handle notifications naturally + + print("Notification manager initialized") +end + +-- Initialize notification manager +M.setup() + +return M diff --git a/lua/cargdev/core/init.lua b/lua/cargdev/core/init.lua index 0989b81..37cf3cb 100644 --- a/lua/cargdev/core/init.lua +++ b/lua/cargdev/core/init.lua @@ -4,7 +4,7 @@ require("cargdev.core.compatibility").setup() require("cargdev.core.options") require("cargdev.core.keymaps") --- Load all Lua files inside `cargdev/core/function/` +-- Load all Lua files inside `cargdev/core/function/` AFTER plugins are loaded local function load_functions() local function_path = vim.fn.stdpath("config") .. "/lua/cargdev/core/function" local scan = vim.fn.globpath(function_path, "*.lua", false, true) @@ -19,6 +19,27 @@ local function load_functions() end end +-- Defer function loading until after plugins are loaded +vim.api.nvim_create_autocmd("User", { + pattern = "LazyDone", + callback = function() + -- Load all functions + load_functions() + end, + once = true, +}) + +-- Fallback: also try to load on VimEnter if LazyDone doesn't fire +vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + -- Wait a bit for plugins to load + vim.defer_fn(function() + -- Load functions + load_functions() + end, 200) + end, + once = true, +}) --[[ vim.api.nvim_create_autocmd("BufReadPost", { once = true, @@ -27,4 +48,3 @@ end end }) ]] -load_functions() diff --git a/lua/cargdev/core/keymaps/database.lua b/lua/cargdev/core/keymaps/database.lua deleted file mode 100644 index 6016dd9..0000000 --- a/lua/cargdev/core/keymaps/database.lua +++ /dev/null @@ -1,115 +0,0 @@ --- ============================================================================= --- DATABASE KEYMAPS --- ============================================================================= - -local keymap = vim.keymap -local opts = { noremap = true, silent = true } - --- ============================================================================= --- GLOBAL DATABASE KEYMAPS --- ============================================================================= - --- Open database interface -keymap.set("n", "db", function() - require("dbee").open() -end, { desc = "Open Database Interface" }) - --- Close database interface -keymap.set("n", "dc", function() - require("dbee").close() -end, { desc = "Close Database Interface" }) - --- Execute current query (when in database editor) -keymap.set("n", "dq", function() - require("dbee").api.ui.execute_query() -end, { desc = "Execute Query" }) - --- Store results to file -keymap.set("n", "ds", function() - require("dbee").store("csv", "file", { extra_arg = "~/query_results.csv" }) -end, { desc = "Store Results to File" }) - --- Yank results to clipboard -keymap.set("n", "dy", function() - require("dbee").store("json", "yank", {}) -end, { desc = "Yank Results to Clipboard" }) - --- ============================================================================= --- NVIM-DBEE INTERNAL KEYMAPS --- ============================================================================= - --- Set up nvim-dbee internal keymaps -local function setup_dbee_keymaps() - -- Drawer mappings (left panel) - keymap.set("n", "", function() - require("dbee").api.ui.open_connection() - end, { buffer = true, desc = "Open Connection" }) - - keymap.set("n", "a", function() - require("dbee").api.ui.add_connection() - end, { buffer = true, desc = "Add Connection" }) - - keymap.set("n", "e", function() - require("dbee").api.ui.edit_connection() - end, { buffer = true, desc = "Edit Connection" }) - - keymap.set("n", "d", function() - require("dbee").api.ui.delete_connection() - end, { buffer = true, desc = "Delete Connection" }) - - keymap.set("n", "r", function() - require("dbee").api.ui.refresh_connections() - end, { buffer = true, desc = "Refresh Connections" }) - - -- Editor mappings (query editor) - keymap.set("n", "BB", function() - require("dbee").api.ui.execute_query() - end, { buffer = true, desc = "Execute Query" }) - - keymap.set("n", "cc", function() - require("dbee").api.ui.clear_results() - end, { buffer = true, desc = "Clear Results" }) - - keymap.set("n", "ss", function() - require("dbee").api.ui.save_scratchpad() - end, { buffer = true, desc = "Save Scratchpad" }) - - -- Result mappings (results buffer) - keymap.set("n", "L", function() - require("dbee").api.ui.result_page_next() - end, { buffer = true, desc = "Next Page" }) - - keymap.set("n", "H", function() - require("dbee").api.ui.result_page_prev() - end, { buffer = true, desc = "Previous Page" }) - - keymap.set("n", "F", function() - require("dbee").api.ui.result_page_first() - end, { buffer = true, desc = "First Page" }) - - keymap.set("n", "E", function() - require("dbee").api.ui.result_page_last() - end, { buffer = true, desc = "Last Page" }) - - keymap.set("n", "yaj", function() - require("dbee").api.ui.yank_row_json() - end, { buffer = true, desc = "Yank Row as JSON" }) - - keymap.set("n", "yac", function() - require("dbee").api.ui.yank_row_csv() - end, { buffer = true, desc = "Yank Row as CSV" }) - - keymap.set("n", "yaJ", function() - require("dbee").api.ui.yank_all_json() - end, { buffer = true, desc = "Yank All as JSON" }) - - keymap.set("n", "yaC", function() - require("dbee").api.ui.yank_all_csv() - end, { buffer = true, desc = "Yank All as CSV" }) -end - --- Apply dbee keymaps when dbee buffers are created -vim.api.nvim_create_autocmd("FileType", { - pattern = { "dbee-drawer", "dbee-editor", "dbee-result" }, - callback = setup_dbee_keymaps, -}) \ No newline at end of file diff --git a/lua/cargdev/core/keymaps/general.lua b/lua/cargdev/core/keymaps/general.lua index 12011c6..ac363ae 100644 --- a/lua/cargdev/core/keymaps/general.lua +++ b/lua/cargdev/core/keymaps/general.lua @@ -16,4 +16,4 @@ keymap.set("n", "nh", ":nohl", opts) -- Clear search highlights keymap.set("n", "x", '"_x', opts) -- Delete character without copying into register -- Save and quit (additional) -keymap.set("n", "Q", ":qa!", { desc = "Quit all" }) \ No newline at end of file +keymap.set("n", "Q", ":qa!", { desc = "Quit all" }) diff --git a/lua/cargdev/core/keymaps/plugins.lua b/lua/cargdev/core/keymaps/plugins.lua index b14e37f..ad52cef 100644 --- a/lua/cargdev/core/keymaps/plugins.lua +++ b/lua/cargdev/core/keymaps/plugins.lua @@ -116,6 +116,19 @@ keymap.set("n", "gcA", "lua require('Comment.api').insert_eol()", { des keymap.set("n", "gb", "lua require('Comment.api').toggle_current_blockwise()", { desc = "Toggle block comment" }) keymap.set("n", "gbc", "lua require('Comment.api').toggle_current_blockwise()", { desc = "Toggle current block comment" }) +-- ============================================================================= +-- TELESCOPE KEYMAPS (Enhanced with safe file searching) +-- ============================================================================= + +-- Safe file search (prevents LSP errors and image freezing) +keymap.set("n", "ff", "Telescope safe_files find_files", { desc = "Find files (safe)" }) +keymap.set("n", "fs", "Telescope live_grep", { desc = "Live grep (safe)" }) +keymap.set("n", "fg", "Telescope git_files", { desc = "Git files (safe)" }) +keymap.set("n", "ft", "Telescope text_files find_files", { desc = "Text files only" }) + +-- Regular telescope (use with caution) +keymap.set("n", "fF", "Telescope find_files", { desc = "Find files (all)" }) + -- ============================================================================= -- DATABASE KEYMAPS (Temporarily disabled to prevent conflicts) -- ============================================================================= diff --git a/lua/cargdev/core/options.lua b/lua/cargdev/core/options.lua index b2f520e..84ede56 100644 --- a/lua/cargdev/core/options.lua +++ b/lua/cargdev/core/options.lua @@ -31,15 +31,21 @@ opt.softtabstop = 2 -- Number of spaces for soft tabs opt.autoindent = true -- Auto indent opt.smartindent = true -- Smart indent --- Performance -opt.lazyredraw = false -- Don't redraw while executing macros -opt.updatetime = 250 -- Faster completion -opt.timeoutlen = 300 -- Faster key sequence completion +-- Performance optimizations +opt.updatetime = 100 -- Faster completion (reduced from 250) +opt.timeoutlen = 200 -- Faster key sequence completion (reduced from 300) +opt.redrawtime = 1500 -- Allow more time for loading syntax +opt.synmaxcol = 240 -- Only highlight the first 240 columns +opt.maxmempattern = 1000 -- Reduce memory for pattern matching +opt.hidden = true -- Allow switching buffers without saving +opt.scrolljump = 1 -- Minimal number of screen lines to scroll +opt.scrolloff = 3 -- Keep 3 lines above/below cursor (reduced from 8) +opt.sidescrolloff = 3 -- Keep 3 columns left/right of cursor (reduced from 8) -- UI settings opt.number = true -- Show line numbers opt.relativenumber = true -- Show relative line numbers -opt.cursorline = true -- Highlight current line +opt.cursorline = false -- Disable cursor line highlighting for performance opt.cursorcolumn = false -- Don't highlight current column opt.signcolumn = "yes" -- Always show sign column @@ -70,8 +76,6 @@ opt.formatoptions:append("n") -- Recognize numbered lists opt.formatoptions:append("j") -- Remove comment leader when joining lines -- Scroll settings for wrapped text -opt.scrolloff = 8 -- Keep 8 lines above/below cursor -opt.sidescrolloff = 8 -- Keep 8 columns left/right of cursor opt.showmatch = true -- Show matching brackets opt.matchtime = 2 -- How long to show matching brackets @@ -87,6 +91,7 @@ opt.swapfile = false -- Don't create swap files -- Terminal opt.termguicolors = true -- Enable true color support +opt.background = "dark" -- Set background to dark -- File encoding opt.encoding = "utf-8" -- Set encoding to UTF-8 @@ -110,9 +115,6 @@ g.loaded_ruby_provider = 0 -- Disable Ruby provider (optional) -- Lua specific settings opt.runtimepath:append(vim.fn.stdpath("config") .. "/lua") --- Improve performance for large files -opt.maxmempattern = 2000 -- Increase memory for pattern matching - -- Better diff opt.diffopt:append("algorithm:patience") opt.diffopt:append("indent-heuristic") diff --git a/lua/cargdev/plugins/alpha.lua b/lua/cargdev/plugins/alpha.lua index decc38a..34b57f9 100644 --- a/lua/cargdev/plugins/alpha.lua +++ b/lua/cargdev/plugins/alpha.lua @@ -18,7 +18,7 @@ return { " ", " ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗ ", " ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║ ", - " ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║ ", + " ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██╗ ", " ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║ ", " ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║ ", " ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝ ", @@ -27,14 +27,20 @@ return { " 🚀 Welcome to CarGDev Neovim - Customize Your Flow! 🚀 ", } - -- 📂 Set menu with improved icons + -- 📂 Set menu with improved icons and performance tools dashboard.section.buttons.val = { - dashboard.button("f", "🔎 Find File", "lua require('snacks.picker').files()"), - dashboard.button("n", "📜 New File", "ene"), - dashboard.button("g", "📝 Find Text", "lua require('snacks.picker').grep()"), - dashboard.button("r", "📚 Recent Files", "lua require('snacks.picker').oldfiles()"), + dashboard.button("f", "🔎 Find File (Safe)", "Telescope find_files"), + dashboard.button("n", "📄 New File", "ene"), + dashboard.button("g", "📝 Find Text", "Telescope live_grep"), + dashboard.button("r", "📚 Recent Files", "Telescope oldfiles"), + dashboard.button("t", "🌳 File Tree", "NvimTreeToggle"), dashboard.button("c", "⚙️ Config", "e ~/.config/nvim/init.lua"), dashboard.button("L", "🦥 Lazy", "Lazy"), + dashboard.button("p", "📊 Performance", "lua require('cargdev.core.function.performance_monitor').check_performance()"), + dashboard.button("l", "🔧 LSP Health", "lua require('cargdev.core.function.performance_monitor').check_lsp_health()"), + dashboard.button("s", "🧩 Sudoku", "Sudoku"), + dashboard.button("e", "💻 LeetCode", "Leet"), + dashboard.button("m", "🔨 Mason", "Mason"), dashboard.button("q", "🚪 Quit", "qa"), } diff --git a/lua/cargdev/plugins/avante.lua b/lua/cargdev/plugins/avante.lua index 29bdb5c..a53a7b1 100644 --- a/lua/cargdev/plugins/avante.lua +++ b/lua/cargdev/plugins/avante.lua @@ -50,7 +50,11 @@ return { statuscolumn = { enabled = true }, terminal = { enabled = true }, toggle = { enabled = true }, - words = { enabled = true }, + words = { + enabled = true, + lsp = { enabled = false }, -- Disable LSP to prevent crashes + hl = { enabled = true }, + }, }) -- Set up vim.ui.input and vim.ui.select for snacks diff --git a/lua/cargdev/plugins/colorscheme.lua b/lua/cargdev/plugins/colorscheme.lua index c7e8a71..63d83b9 100644 --- a/lua/cargdev/plugins/colorscheme.lua +++ b/lua/cargdev/plugins/colorscheme.lua @@ -1,9 +1,11 @@ return { "CarGDev/cargdev-cyberpunk", - --[[ dir = "/Users/carlos/Documents/SSD_Documents/projects/cargdevschemecolor.nvim", ]] + name = "cargdev-cyberpunk", + lazy = false, + priority = 1000, config = function() + vim.opt.termguicolors = true + vim.opt.background = "dark" require("cargdev-cyberpunk").setup() end, - priority = 1000, - lazy = false, } diff --git a/lua/cargdev/plugins/comments.lua b/lua/cargdev/plugins/comments.lua index ecc93c4..c11755a 100644 --- a/lua/cargdev/plugins/comments.lua +++ b/lua/cargdev/plugins/comments.lua @@ -11,6 +11,7 @@ return { local ts_context_commentstring = require("ts_context_commentstring.integrations.comment_nvim") -- enable comment + comment.setup({ -- for commenting tsx, jsx, svelte, html files pre_hook = ts_context_commentstring.create_pre_hook(), diff --git a/lua/cargdev/plugins/companion.lua.bak b/lua/cargdev/plugins/companion.lua.bak deleted file mode 100644 index 7638f90..0000000 --- a/lua/cargdev/plugins/companion.lua.bak +++ /dev/null @@ -1,32 +0,0 @@ --- return { --- { --- "olimorris/codecompanion.nvim", --- event = "VeryLazy", --- lazy = false, --- version = false, --- opts = { --- adapters = { --- openai = function() --- return require("codecompanion.adapters").extend("openai", { --- name = "openai", --- model = "codellama:7b", --- endpoint = "https://api-ai.cargdev.io/v1", --- api_key = os.getenv("CARGDEV_API_KEY"), --- max_tokens = 2048, --- }) --- end, --- }, --- strategies = { --- chat = { adapter = "openai" }, --- inline = { adapter = "openai" }, --- agent = { adapter = "openai" }, --- }, --- }, --- dependencies = { --- "nvim-lua/plenary.nvim", --- "nvim-treesitter/nvim-treesitter", --- "nvim-telescope/telescope.nvim", --- }, --- } --- } --- diff --git a/lua/cargdev/plugins/dap.lua b/lua/cargdev/plugins/dap.lua index 8dba316..b899228 100644 --- a/lua/cargdev/plugins/dap.lua +++ b/lua/cargdev/plugins/dap.lua @@ -1,5 +1,7 @@ return { "mfussenegger/nvim-dap", + event = "VeryLazy", -- Changed from immediate loading to lazy loading + cmd = { "Dap", "DapUI", "DapContinue", "DapToggleBreakpoint" }, -- Load on command dependencies = { { "nvim-neotest/nvim-nio", lazy = false }, "rcarriga/nvim-dap-ui", @@ -9,6 +11,7 @@ return { "Weissle/persistent-breakpoints.nvim", { "nvim-neotest/neotest", + event = "VeryLazy", dependencies = { "nvim-neotest/neotest-jest", "nvim-neotest/neotest-python", diff --git a/lua/cargdev/plugins/database.lua b/lua/cargdev/plugins/database.lua deleted file mode 100644 index f74d743..0000000 --- a/lua/cargdev/plugins/database.lua +++ /dev/null @@ -1,132 +0,0 @@ -return { - -- ============================================================================= - -- DATABASE PLUGINS - -- ============================================================================= - - -- Modern database client for Neovim (replaces vim-dadbod) - { - "kndndrj/nvim-dbee", - build = function() - -- Install the Go binary - require("dbee").install() - end, - dependencies = { - "nvim-lua/plenary.nvim", - }, - config = function() - require("dbee").setup({ - -- Sources for database connections - sources = { - -- Load connections from memory (only guaranteed working connections) - require("dbee.sources").MemorySource:new({ - -- PostgreSQL (confirmed working) - { - name = "mock_api", - type = "postgres", - url = "postgres://localhost:5432/mock_api?sslmode=disable", - }, - }), - -- Load connections from environment variable (for dynamic connections) - require("dbee.sources").EnvSource:new("DBEE_CONNECTIONS"), - -- Load connections from file (persistent storage - user-added connections) - require("dbee.sources").FileSource:new(vim.fn.stdpath("cache") .. "/dbee/persistence.json"), - }, - - -- UI Configuration - ui = { - -- Layout configuration - layout = { - -- Drawer (left panel) width - drawer_width = 30, - -- Result buffer height - result_height = 15, - -- Editor buffer height - editor_height = 10, - }, - }, - - -- Database configuration - database = { - -- Default page size for results - page_size = 100, - -- Connection timeout in seconds - timeout = 30, - -- Maximum number of connections - max_connections = 5, - }, - - -- Logging configuration - log = { - -- Log level: "debug", "info", "warn", "error" - level = "info", - -- Log file path - file = vim.fn.stdpath("cache") .. "/dbee/dbee.log", - }, - }) - end, - }, - - -- SQL formatting and syntax highlighting - { - "b4winckler/vim-objc", - ft = { "sql", "mysql", "postgresql", "oracle" }, - }, - - -- SQL formatting with sqlparse - { - "b4winckler/vim-objc", - ft = { "sql" }, - config = function() - vim.g.sqlformat_command = "sqlformat" - vim.g.sqlformat_options = "-r -k upper" - end, - }, - - - - -- MongoDB syntax highlighting (without LSP) - { - "neovim/nvim-lspconfig", - ft = { "javascript", "json" }, - config = function() - -- Enable MongoDB syntax highlighting for .js files - vim.api.nvim_create_autocmd("FileType", { - pattern = { "javascript", "json" }, - callback = function() - vim.bo.filetype = "javascript" - end, - }) - end, - }, - - -- Redis syntax highlighting - { - "neovim/nvim-lspconfig", - ft = { "redis" }, - config = function() - -- Enable Redis syntax highlighting - vim.api.nvim_create_autocmd("BufRead,BufNewFile", { - pattern = "*.redis", - callback = function() - vim.bo.filetype = "redis" - end, - }) - end, - }, - - -- CQL (Cassandra Query Language) syntax highlighting - { - "neovim/nvim-lspconfig", - ft = { "cql" }, - config = function() - -- Enable CQL syntax highlighting - vim.api.nvim_create_autocmd("BufRead,BufNewFile", { - pattern = "*.cql", - callback = function() - vim.bo.filetype = "cql" - end, - }) - end, - }, -} - diff --git a/lua/cargdev/plugins/indent-blankline.lua b/lua/cargdev/plugins/indent-blankline.lua index 572e0bd..ddaa680 100644 --- a/lua/cargdev/plugins/indent-blankline.lua +++ b/lua/cargdev/plugins/indent-blankline.lua @@ -3,6 +3,16 @@ return { event = { "BufReadPre", "BufNewFile" }, main = "ibl", opts = { - indent = { char = "┊" }, + indent = { + char = "┊", + }, + exclude = { + filetypes = { "help", "alpha", "dashboard", "neo-tree", "Trouble", "lazy", "mason" }, + buftypes = { "terminal", "nofile", "quickfix", "prompt" }, + }, + scope = { + enabled = false + }, }, } + diff --git a/lua/cargdev/plugins/lsp/lspconfig.lua b/lua/cargdev/plugins/lsp/lspconfig.lua index 41e29e3..784a1b4 100644 --- a/lua/cargdev/plugins/lsp/lspconfig.lua +++ b/lua/cargdev/plugins/lsp/lspconfig.lua @@ -1,6 +1,6 @@ return { "neovim/nvim-lspconfig", - event = { "BufReadPre", "BufNewFile" }, + event = { "BufReadPost", "BufNewFile" }, dependencies = { "hrsh7th/cmp-nvim-lsp", { "antosha417/nvim-lsp-file-operations", config = true }, @@ -23,23 +23,17 @@ return { "gopls", "graphql", "html", - -- "jdtls", -- uncomment if you're actively doing Java "lua_ls", "prismals", "pyright", "svelte", "tailwindcss", - -- Database language servers - "sqls", -- SQL language server - "mongodb", -- MongoDB language server - "redis", -- Redis language server - "oracle", -- Oracle language server - "cassandra", -- Cassandra language server }, }) local capabilities = cmp_nvim_lsp.default_capabilities() + -- Enhanced error handling for LSP diagnostics vim.diagnostic.config({ signs = { severity = { @@ -52,73 +46,144 @@ return { Info = " ", }, }, + -- Performance optimizations + update_in_insert = false, -- Don't update diagnostics in insert mode + virtual_text = false, -- Disable virtual text for better performance + underline = true, -- Keep underline for errors + severity_sort = true, -- Sort diagnostics by severity + -- Error handling + float = { + border = "rounded", + source = "always", + format = function(diagnostic) + if diagnostic.source == "LSP" then + return string.format("%s [%s]", diagnostic.message, diagnostic.source) + end + return diagnostic.message + end, + }, }) + -- Only attach to sensible buffers + local function should_attach_lsp(bufnr) + if type(bufnr) ~= "number" or bufnr == 0 then + bufnr = vim.api.nvim_get_current_buf() + end + local ft = vim.bo[bufnr].filetype + local name = vim.api.nvim_buf_get_name(bufnr) + + -- skip binaries / media + local exts = { + "png", "jpg", "jpeg", "gif", "svg", "ico", "bmp", "webp", + "mp4", "avi", "mov", "wmv", "flv", "webm", "mkv", + "mp3", "wav", "flac", "aac", "ogg", + "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", + "zip", "rar", "7z", "tar", "gz", "bz2", "exe", "dll", "so", "dylib", "bin" + } + for _, e in ipairs(exts) do + if name:match("%." .. e .. "$") then + return false + end + end + + local lines = vim.api.nvim_buf_line_count(bufnr) + if lines == 0 or lines > 50000 then + return false + end + + local skip_ft = { + git = true, gitcommit = true, gitrebase = true, gitconfig = true, + help = true, man = true, qf = true, quickfix = true, terminal = true, toggleterm = true + } + if skip_ft[ft] then + return false + end + + return true + end + + -- Shared on_attach + local function on_attach(client, bufnr) + if not should_attach_lsp(bufnr) then + -- Detach politely; don't override client.request + vim.schedule(function() + if vim.api.nvim_buf_is_valid(bufnr) then + vim.lsp.buf_detach_client(bufnr, client.id) + else + client.stop() + end + end) + return + end + -- your normal keymaps/etc here + end + local servers = { - cssls = {}, + cssls = { + settings = { + css = { + validate = true, + lint = { unknownAtRules = "ignore" } + } + } + }, emmet_ls = {}, - eslint = {}, - gopls = {}, - graphql = {}, + eslint = { + settings = { workingDirectory = { mode = "auto" } } + }, + gopls = { + settings = { + gopls = { + analyses = { unusedparams = true }, + staticcheck = true, + usePlaceholders = true + } + } + }, + graphql = {}, html = {}, - -- jdtls = {}, -- same here lua_ls = { settings = { Lua = { diagnostics = { globals = { "vim" } }, - workspace = { - library = vim.api.nvim_get_runtime_file("", true), - checkThirdParty = false, + workspace = { + library = vim.api.nvim_get_runtime_file("", true), + checkThirdParty = false }, + telemetry = { enable = false }, + hint = { enable = false }, }, }, }, prismals = {}, - pyright = {}, + pyright = { + settings = { + python = { + analysis = { + typeCheckingMode = "basic", + autoImportCompletions = true + } + } + } + }, svelte = {}, tailwindcss = {}, - -- Database servers - sqls = { - settings = { - sqls = { - connections = { - { - name = "PostgreSQL", - adapter = "postgresql", - host = "localhost", - port = 5432, - database = "postgres", - username = "postgres", - password = "", - }, - { - name = "MySQL", - adapter = "mysql", - host = "localhost", - port = 3306, - database = "mysql", - username = "root", - password = "", - }, - }, - }, - }, - }, - mongols = { - settings = { - mongols = { - connectionString = "mongodb://localhost:27017", - maxNumberOfProblems = 100, - }, - }, - }, + -- sqls = { settings = { sqls = { connections = { /* …your dbs… */ } } } }, -- optional } - -- Set up all LSP servers - for server_name, server_config in pairs(servers) do - lspconfig[server_name].setup({ + -- Set up all LSP servers with performance optimizations and error handling + for name, cfg in pairs(servers) do + lspconfig[name].setup({ capabilities = capabilities, - settings = server_config.settings or {}, + on_attach = on_attach, + settings = cfg.settings, + flags = { debounce_text_changes = 150 }, + handlers = { + ["textDocument/publishDiagnostics"] = vim.lsp.with( + vim.lsp.diagnostic.on_publish_diagnostics, + { virtual_text = false, signs = true, underline = true, update_in_insert = false } + ), + }, }) end @@ -131,13 +196,52 @@ return { capabilities = capabilities, }) - -- Set up TypeScript Tools + -- Set up TypeScript Tools with performance optimizations and error handling require("typescript-tools").setup({ settings = { tsserver_plugins = {}, tsserver_file_preferences = {}, tsserver_format_options = {}, + -- Performance optimizations + tsserver_max_tsc_memory = 4096, -- Limit memory usage + tsserver_experimental_enableProjectDiagnostics = false, -- Disable project diagnostics for better performance }, + -- Add error handling for TypeScript Tools + on_attach = function(client, bufnr) + if not should_attach_lsp(bufnr) then + client.stop() + return + end + end, + }) + + -- Global LSP error handling + vim.lsp.handlers["textDocument/hover"] = vim.lsp.with( + vim.lsp.handlers.hover, + { border = "rounded" } + ) + + vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with( + vim.lsp.handlers.signature_help, + { border = "rounded" } + ) + + -- Handle LSP errors gracefully + vim.lsp.set_log_level("warn") -- Reduce log verbosity + + -- Add autocmd to handle LSP errors + vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + if client then + -- Add error handling for this client + client.notify("workspace/didChangeConfiguration", { + settings = { + -- Add any client-specific error handling settings here + } + }) + end + end, }) end, } diff --git a/lua/cargdev/plugins/nvim-cmp.lua b/lua/cargdev/plugins/nvim-cmp.lua index 5302e88..423a9a3 100644 --- a/lua/cargdev/plugins/nvim-cmp.lua +++ b/lua/cargdev/plugins/nvim-cmp.lua @@ -4,6 +4,7 @@ return { dependencies = { "hrsh7th/cmp-buffer", -- source for text in buffer "hrsh7th/cmp-path", -- source for file system paths + "hrsh7th/cmp-nvim-lsp", -- LSP completion source { "L3MON4D3/LuaSnip", -- follow latest release. @@ -28,6 +29,9 @@ return { cmp.setup({ completion = { completeopt = "menu,menuone,preview,noselect", + -- Performance optimizations + keyword_length = 2, -- Start completion after 2 characters + keyword_pattern = [[\%(-\?\d\+\%(\.\d\+\)\?\|\h\w*\%(-\w*\)*\)]], -- Better keyword pattern }, snippet = { -- configure how nvim-cmp interacts with snippet engine expand = function(args) @@ -46,10 +50,10 @@ return { }), -- sources for autocompletion sources = cmp.config.sources({ - { name = "nvim_lsp"}, - { name = "luasnip" }, -- snippets - { name = "buffer" }, -- text within current buffer - { name = "path" }, -- file system paths + { name = "nvim_lsp", priority = 1000}, + { name = "luasnip", priority = 750 }, -- snippets + { name = "buffer", priority = 500, keyword_length = 3 }, -- text within current buffer + { name = "path", priority = 250 }, -- file system paths }), -- configure lspkind for vs-code like pictograms in completion menu @@ -59,6 +63,27 @@ return { ellipsis_char = "...", }), }, + + -- Performance optimizations + performance = { + debounce = 50, -- Debounce completion requests + throttle = 100, -- Throttle completion requests + fetching_timeout = 200, -- Timeout for fetching completions + }, + + -- Reduce completion menu size for better performance + window = { + completion = { + border = "rounded", + scrollbar = false, + col_offset = -3, + side_padding = 0, + }, + documentation = { + border = "rounded", + scrollbar = false, + }, + }, }) end, } diff --git a/lua/cargdev/plugins/telescope.lua b/lua/cargdev/plugins/telescope.lua index d7f4616..ae059ad 100644 --- a/lua/cargdev/plugins/telescope.lua +++ b/lua/cargdev/plugins/telescope.lua @@ -23,9 +23,70 @@ return { end, }) + -- File filtering function to prevent LSP errors and image freezing + local function filter_files(entry) + local filename = entry.filename or entry.value + if not filename then return true end + + -- Skip non-text files that can cause LSP errors or freezing + local skip_extensions = { + -- Images + "png", "jpg", "jpeg", "gif", "svg", "ico", "bmp", "webp", "tiff", "tga", + -- Videos + "mp4", "avi", "mov", "wmv", "flv", "webm", "mkv", "m4v", "3gp", + -- Audio + "mp3", "wav", "flac", "aac", "ogg", "m4a", "wma", + -- Documents + "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "odt", "ods", "odp", + -- Archives + "zip", "rar", "7z", "tar", "gz", "bz2", "xz", "lzma", + -- Binaries + "exe", "dll", "so", "dylib", "bin", "app", "dmg", "deb", "rpm", + -- Other problematic files + "lock", "log", "tmp", "temp", "cache", "bak", "backup" + } + + for _, ext in ipairs(skip_extensions) do + if filename:match("%." .. ext .. "$") then + return false + end + end + + -- Skip hidden files and directories (except .git) + if filename:match("/%.") and not filename:match("/%.git/") then + return false + end + + -- Skip node_modules and other heavy directories + if filename:match("/node_modules/") or + filename:match("/vendor/") or + filename:match("/%.git/") or + filename:match("/dist/") or + filename:match("/build/") or + filename:match("/target/") then + return false + end + + return true + end + telescope.setup({ defaults = { path_display = { "smart" }, + -- Performance optimizations + cache_picker = { + num_pickers = -1, + }, + -- Enhanced preview with file filtering + preview = { + treesitter = false, -- Disable treesitter in preview for better performance + timeout = 100, -- Reduce preview timeout + }, + -- Optimize sorting + sorting_strategy = "ascending", + -- Add file filtering to all pickers + file_sorter = require("telescope.sorters").get_fuzzy_file, + generic_sorter = require("telescope.sorters").get_generic_fuzzy_sorter, mappings = { i = { [""] = actions.move_selection_previous, -- move to prev result @@ -38,11 +99,41 @@ return { pickers = { find_files = { hidden = true, + -- Performance optimizations + find_command = { "rg", "--files", "--hidden", "--glob", "!**/.git/*" }, + no_ignore = false, + follow = false, -- Don't follow symlinks for better performance + -- Add file filtering + file_filter = filter_files, }, live_grep = { additional_args = function() return { "--hidden" } end, + -- Performance optimizations + glob_pattern = { "!**/.git/*", "!**/node_modules/*", "!**/vendor/*" }, + previewer = false, -- Disable previewer for live_grep for better performance + -- Add file filtering for grep + file_filter = filter_files, + }, + -- Optimize other pickers + buffers = { + sort_lastused = true, + ignore_current_buffer = true, + }, + git_files = { + git_command = { "git", "ls-files", "--exclude-standard" }, + -- Add file filtering for git files + file_filter = filter_files, + }, + }, + -- Performance optimizations + extensions = { + fzf = { + fuzzy = true, + override_generic_sorter = true, + override_file_sorter = true, + case_mode = "smart_case", }, }, }) diff --git a/lua/cargdev/plugins/treesitter.lua b/lua/cargdev/plugins/treesitter.lua index c4dec18..15a3aad 100644 --- a/lua/cargdev/plugins/treesitter.lua +++ b/lua/cargdev/plugins/treesitter.lua @@ -1,6 +1,6 @@ return { "nvim-treesitter/nvim-treesitter", - event = { "BufReadPre", "BufNewFile" }, + event = { "BufReadPost", "BufNewFile" }, -- Changed from BufReadPre to BufReadPost for better performance build = ":TSUpdate", dependencies = { "windwp/nvim-ts-autotag", @@ -17,6 +17,9 @@ return { -- Prevent Treesitter from parsing Copilot files return lang == "copilot" or vim.api.nvim_buf_get_name(buf):match("copilot.lua") end, + -- Performance optimizations + use_languagetree = true, + additional_vim_regex_highlighting = false, }, -- enable indentation indent = { enable = true }, @@ -58,6 +61,13 @@ return { node_decremental = "", }, }, + -- Performance optimizations + playground = { + enable = false, -- Disable playground for better performance + }, + query_linter = { + enable = false, -- Disable query linter for better performance + }, }) end, } diff --git a/lua/cargdev/plugins/which-key.lua b/lua/cargdev/plugins/which-key.lua index d004051..bf868ec 100644 --- a/lua/cargdev/plugins/which-key.lua +++ b/lua/cargdev/plugins/which-key.lua @@ -3,7 +3,7 @@ return { event = "VeryLazy", init = function() vim.o.timeout = true - vim.o.timeoutlen = 500 + vim.o.timeoutlen = 200 -- Reduced from 500 for faster response end, opts = { -- your configuration comes here