diff --git a/install.sh b/install.sh index 338bbe7..94ca663 100755 --- a/install.sh +++ b/install.sh @@ -272,14 +272,21 @@ install_oh_my_zsh() { install_cli_tools() { print_section "${PACKAGE} Installing CLI Tools" - - local tools=("fzf:FZF (Terminal fuzzy finder)" "ripgrep:ripgrep (Fast search tool)" "bat:bat (Enhanced cat with syntax highlighting)") - + local tools=( + "fzf:FZF (Terminal fuzzy finder)" + "ripgrep:ripgrep (Fast search tool)" + "bat:bat (Enhanced cat with syntax highlighting)" + "scooter:scooter (Interactive search and replace in the terminal)" + ) for tool_info in "${tools[@]}"; do IFS=':' read -r tool_name tool_desc <<< "$tool_info" install_with_brew "$tool_name" "$tool_desc" done + local scooter_config_target="$HOME/.config/scooter/config.toml" + mkdir -p "$(dirname "$scooter_config_target")" + create_symlink "$(pwd)/scooter.config.toml" "$HOME/.config/scooter/config.toml" "Scooter config" + echo "" print_success "All CLI tools installed successfully!" } diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json index ed2b334..44c05d4 100644 --- a/nvim/lazy-lock.json +++ b/nvim/lazy-lock.json @@ -1,24 +1,24 @@ { - "CopilotChat.nvim": { "branch": "main", "commit": "2f3e07398ba81ccc0cf3d1fca9805aaca126264e" }, + "CopilotChat.nvim": { "branch": "main", "commit": "1e06be97df058fa0bb4af54659c39918a4999c86" }, "ReplaceWithRegister": { "branch": "master", "commit": "832efc23111d19591d495dc72286de2fb0b09345" }, - "avante.nvim": { "branch": "main", "commit": "44db8eba870f6c123da5efa70384b2889f3e3495" }, + "avante.nvim": { "branch": "main", "commit": "5e4bb50ddaa8c4688675df6f437712c0e793a51c" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, - "catppuccin": { "branch": "main", "commit": "5af9374957a65be8770696da295dc9016b96f241" }, + "catppuccin": { "branch": "main", "commit": "c89184526212e04feffbddda9d06b041a8fca416" }, "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, "cmp-cmdline": { "branch": "main", "commit": "d126061b624e0af6c3a556428712dd4d4194ec6d" }, "cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" }, "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, - "conform.nvim": { "branch": "master", "commit": "3bad87250ed85246fe8c5bc10005ab5a6289ae4c" }, - "copilot.lua": { "branch": "master", "commit": "36c220b816d07989186731ca771c15e2df419d68" }, + "conform.nvim": { "branch": "master", "commit": "9d859cbfbde7a1bd1770e7c97aef30ec5a237a71" }, + "copilot.lua": { "branch": "master", "commit": "3cd5086c28c5769f5db147721f457a3e081de254" }, "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "emmet-vim": { "branch": "master", "commit": "e98397144982d1e75b20d94d55a82de3ec8f648d" }, - "gitsigns.nvim": { "branch": "main", "commit": "23ae90a2a52fdc9b8c50dc61d6c30ebb18521343" }, + "gitsigns.nvim": { "branch": "main", "commit": "1ee5c1fd068c81f9dd06483e639c2aa4587dc197" }, "glance.nvim": { "branch": "master", "commit": "bf86d8b79dce808e65fdb6e9269d0b4ed6d2eefc" }, - "grug-far.nvim": { "branch": "main", "commit": "50d9ee2b5a19634670441948e7e4afaa042f1059" }, + "grug-far.nvim": { "branch": "main", "commit": "48f9afb684de1c191af7bed96bc1db85ba33f6a4" }, "gruvbox.nvim": { "branch": "main", "commit": "5e0a460d8e0f7f669c158dedd5f9ae2bcac31437" }, "img-clip.nvim": { "branch": "main", "commit": "f33f3af9ba50f99d70f8fcb1a8575750ada4ea4a" }, "indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" }, - "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "lazy.nvim": { "branch": "main", "commit": "59334064f8604ca073791c25dcc5c9698865406e" }, "lazydev.nvim": { "branch": "main", "commit": "258d2a5ef4a3e3d6d9ba9da72c9725c53e9afcbd" }, "lazygit.nvim": { "branch": "main", "commit": "2305deed25bc61b866d5d39189e9105a45cf1cfb" }, "lsp-lens.nvim": { "branch": "main", "commit": "48bb1a7e271424c15f3d588d54adc9b7c319d977" }, @@ -26,36 +26,37 @@ "lspsaga.nvim": { "branch": "main", "commit": "8efe00d6aed9db6449969f889170f1a7e43101a1" }, "lualine.nvim": { "branch": "master", "commit": "b8c23159c0161f4b89196f74ee3a6d02cdc3a955" }, "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "f760507df8c49a4bf46a4d12e1fc616797508979" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "155eac5d8609a2f110041f8ac3491664cc126354" }, "mason-null-ls.nvim": { "branch": "main", "commit": "de19726de7260c68d94691afb057fa73d3cc53e7" }, - "mason.nvim": { "branch": "main", "commit": "b3689a41dd77e5294498dba9757fb22cc80cbebd" }, + "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" }, "mcphub.nvim": { "branch": "main", "commit": "8ff40b5edc649959bb7e89d25ae18e055554859a" }, - "mini.nvim": { "branch": "main", "commit": "228a8c34fae1d778e895ad06e4158f65e85828bc" }, + "mini.nvim": { "branch": "main", "commit": "79654ef28182986dcdd9e2d3506d1728fc7c4f79" }, "neovim-ayu": { "branch": "master", "commit": "cc78e880cce5dfc1187d144ed7251c746feff259" }, "nightfox.nvim": { "branch": "main", "commit": "ba47d4b4c5ec308718641ba7402c143836f35aa9" }, "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, - "none-ls.nvim": { "branch": "main", "commit": "88e2508bd1754e2643e54e9f181e64bbda118ab9" }, + "none-ls.nvim": { "branch": "main", "commit": "5cf63841461b49989972d35bf886e076a1ab3649" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, "nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" }, "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" }, - "nvim-dap": { "branch": "master", "commit": "7367cec8e8f7a0b1e4566af9a7ef5959d11206a7" }, + "nvim-dap": { "branch": "master", "commit": "48570d8372f63c9e9ba399a16606f9553034a9b2" }, "nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" }, "nvim-dap-vscode-js": { "branch": "main", "commit": "03bd29672d7fab5e515fc8469b7d07cc5994bbf6" }, - "nvim-lspconfig": { "branch": "master", "commit": "336b388c272555d2ae94627a50df4c2f89a5e257" }, + "nvim-lspconfig": { "branch": "master", "commit": "e688b486fe9291f151eae7e5c0b5a5c4ef980847" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" }, - "nvim-tree.lua": { "branch": "master", "commit": "e179ad2f83b5955ab0af653069a493a1828c2697" }, + "nvim-tree.lua": { "branch": "master", "commit": "87d096a39cb2d5d43e6771563575ff042a79f48b" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, - "nvim-web-devicons": { "branch": "master", "commit": "f6b0920f452bfd7595ee9a9efe5e1ae78e0e2997" }, - "opencode.nvim": { "branch": "main", "commit": "3a2303ab671a43ca0d766b98e754c4af2f3201ec" }, + "nvim-web-devicons": { "branch": "master", "commit": "b8221e42cf7287c4dcde81f232f58d7b947c210d" }, + "opencode.nvim": { "branch": "main", "commit": "a72e936edaa8c306452cc4678683d3c155f79cfe" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, "quick-scope": { "branch": "master", "commit": "6cee1d9e0b9ac0fbffeb538d4a5ba9f5628fabbc" }, - "render-markdown.nvim": { "branch": "main", "commit": "9ab9dade85d8c7d411cc89b592028da3d1b7955a" }, - "snacks.nvim": { "branch": "main", "commit": "5e0e8698526f350f1280ad1ef7a8670f857c9445" }, + "render-markdown.nvim": { "branch": "main", "commit": "7e6af36c846017122e07e68803bbf95f3c729ca3" }, + "snacks.nvim": { "branch": "main", "commit": "bfe8c26dbd83f7c4fbc222787552e29b4eccfcc0" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, - "tiny-inline-diagnostic.nvim": { "branch": "main", "commit": "29315861711f11daf75e1cf0953ab92ec1a3e69f" }, + "tiny-inline-diagnostic.nvim": { "branch": "main", "commit": "6d8dc61a9c4077d9ec62a9c8998506dcd2a5b6af" }, + "toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" }, "tokyonight.nvim": { "branch": "main", "commit": "4d159616aee17796c2c94d2f5f87d2ee1a3f67c7" }, "vim-highlightedyank": { "branch": "master", "commit": "285a61425e79742997bbde76a91be6189bc988fb" }, "vim-peekaboo": { "branch": "master", "commit": "2a8a3187ba6b15201b2563a3f0331fcdf49da36c" }, diff --git a/nvim/lua/nairovim/plugins/ai/avante.lua b/nvim/lua/nairovim/plugins/ai/avante.lua index c5ec59f..18bf572 100644 --- a/nvim/lua/nairovim/plugins/ai/avante.lua +++ b/nvim/lua/nairovim/plugins/ai/avante.lua @@ -80,7 +80,8 @@ return { providers = { copilot = { endpoint = "https://api.github.com", - model = "claude-sonnet-4", + -- model = "gpt-5", + model = "claude-sonnet-4.5", timeout = 15000, -- Reduced timeout for faster failure detection extra_request_body = { temperature = 0.75, @@ -89,7 +90,7 @@ return { }, claude = { endpoint = "https://api.anthropic.com", - model = "claude-sonnet-4-20250514", + model = "claude-sonnet-4.5", timeout = 15000, -- Reduced from 30s to 15s for faster failure detection extra_request_body = { temperature = 0.75, diff --git a/nvim/lua/nairovim/plugins/customizations/keymaps/scooter.lua b/nvim/lua/nairovim/plugins/customizations/keymaps/scooter.lua new file mode 100644 index 0000000..7a41cbf --- /dev/null +++ b/nvim/lua/nairovim/plugins/customizations/keymaps/scooter.lua @@ -0,0 +1,23 @@ +---------------------------------------------------------------------- +-- 1. Scooter Keymaps (nairovim.KeymapDef) +---------------------------------------------------------------------- + +local M = {} + +--- @type nairovim.KeymapDef[] +M.mappings = { + { + mode = "n", + key_sequence = "s", + handler = "FindReplace", + opts = { desc = "Open scooter for Find and Replace" }, + }, + { + mode = "v", + key_sequence = "r", + handler = '"aylua OpenScooterSearchText(vim.fn.getreg("a"))', + opts = { desc = "Search selected text in scooter" }, + }, +} + +return M diff --git a/nvim/lua/nairovim/plugins/init.lua b/nvim/lua/nairovim/plugins/init.lua index fc6c77f..5ac1c8c 100644 --- a/nvim/lua/nairovim/plugins/init.lua +++ b/nvim/lua/nairovim/plugins/init.lua @@ -92,4 +92,8 @@ return { ft = { "markdown", "Avante", "mcphub", "copilot-chat" }, }, }, + + -- Other utility plugins + -- Terminal + { "akinsho/toggleterm.nvim", version = "*", config = true }, } diff --git a/nvim/lua/nairovim/plugins/scooter.lua b/nvim/lua/nairovim/plugins/scooter.lua new file mode 100644 index 0000000..17e63c4 --- /dev/null +++ b/nvim/lua/nairovim/plugins/scooter.lua @@ -0,0 +1,72 @@ +local M = {} +local Terminal = require("toggleterm.terminal").Terminal +local scooter_term = nil + +--- Open existing scooter terminal if one is available, otherwise create a new one +local open_scooter = function() + if not scooter_term then + scooter_term = Terminal:new({ + cmd = "scooter", + direction = "float", + close_on_exit = true, + highlights = { + FloatBorder = { link = "FloatBorder" }, + }, + float_opts = { + border = "rounded", + }, + on_exit = function() + scooter_term = nil + end, + }) + end + scooter_term:open() +end + +--- Called by scooter to open the selected file at the correct line from the scooter search list +_G.EditLineFromScooter = function(file_path, line) + if scooter_term and scooter_term:is_open() then + scooter_term:close() + end + + local current_path = vim.fn.expand("%:p") + local target_path = vim.fn.fnamemodify(file_path, ":p") + + if current_path ~= target_path then + vim.cmd.edit(vim.fn.fnameescape(file_path)) + end + + vim.api.nvim_win_set_cursor(0, { line, 0 }) +end + +--- Opens scooter with the search text populated by the `search_text` arg +_G.OpenScooterSearchText = function(search_text) + if scooter_term and scooter_term:is_open() then + scooter_term:close() + end + + local escaped_text = vim.fn.shellescape(search_text:gsub("\r?\n", " ")) + scooter_term = Terminal:new({ + cmd = "scooter --search-text " .. escaped_text, + direction = "float", + close_on_exit = true, + on_exit = function() + scooter_term = nil + end, + }) + scooter_term:open() +end + +---------------------------------------------------------------------- +-- 2. User Commands +---------------------------------------------------------------------- +vim.api.nvim_create_user_command("FindReplace", open_scooter, { desc = "Open scooter terminal for Find and replace" }) + +---------------------------------------------------------------------- +-- 3. Keymaps +---------------------------------------------------------------------- +local common_utils = require("nairovim.utils.common") +local mappings = require("nairovim.plugins.customizations.keymaps.scooter").mappings +common_utils.map(mappings) + +return M diff --git a/scooter.config.toml b/scooter.config.toml new file mode 100644 index 0000000..aa55708 --- /dev/null +++ b/scooter.config.toml @@ -0,0 +1,9 @@ +[editor_open] +command = "nvim %file +%line" + +[preview] +syntax_highlighting = true +syntax_highlighting_theme = "Catppuccin Macchiato" +# syntax_highlighting_theme = "Catppuccin Mocha" +# syntax_highlighting_theme = "Catppuccin Frappe" +# syntax_highlighting_theme = "Catppuccin Latte"