From 32a5c2deb83f1393c1fccecfb5a0bf1448b85450 Mon Sep 17 00:00:00 2001 From: Valeriy Filippov Date: Wed, 11 Mar 2026 18:50:00 +0300 Subject: [PATCH] Add opencode --- nvim/.stylua.toml | 4 ++ nvim/.sylua.toml | 2 - nvim/README.md | 3 ++ nvim/lua/config/keymaps.lua | 79 +++++++++++----------------------- nvim/lua/plugins/lualine.lua | 7 ++- nvim/lua/plugins/opencode.lua | 51 ++++++++++++++++++++++ nvim/lua/plugins/which-key.lua | 1 + 7 files changed, 89 insertions(+), 58 deletions(-) create mode 100644 nvim/.stylua.toml delete mode 100644 nvim/.sylua.toml create mode 100644 nvim/lua/plugins/opencode.lua diff --git a/nvim/.stylua.toml b/nvim/.stylua.toml new file mode 100644 index 0000000..9943547 --- /dev/null +++ b/nvim/.stylua.toml @@ -0,0 +1,4 @@ +collapse_simple_statement = "Always" +indent_type = "Spaces" +column_width = 180 +indent_width = 2 diff --git a/nvim/.sylua.toml b/nvim/.sylua.toml deleted file mode 100644 index 0435f67..0000000 --- a/nvim/.sylua.toml +++ /dev/null @@ -1,2 +0,0 @@ -indent_type = "Spaces" -indent_width = 2 diff --git a/nvim/README.md b/nvim/README.md index eb2ad85..e789dcf 100644 --- a/nvim/README.md +++ b/nvim/README.md @@ -24,4 +24,7 @@ brew install --cask font-jetbrains-mono-nerd-font # https://rust-lang.org/ for cargo package manager brew install rust + +# https://github.com/anomalyco/opencode +brew install opencode ``` diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua index 1fc80e4..89c0503 100644 --- a/nvim/lua/config/keymaps.lua +++ b/nvim/lua/config/keymaps.lua @@ -15,6 +15,7 @@ local keymap = vim.keymap -- Reserved firs characters: -- Update in ../plugins/which-key.lua +-- a - [A]I -- c - [C]lear / [C]all -- d - [D]iagnostic -- e - File [E]xplorer @@ -27,11 +28,15 @@ local keymap = vim.keymap -- t - [T]abs -- u - [U]i +-- [A]I +-- nickjvandyke/opencode.nvim +keymap.set({ "n", "x" }, "aa", function() require("opencode").ask("", { submit = true }) end, { desc = "[AI]: Ask opencode" }) +keymap.set({ "n", "x" }, "ax", function() require("opencode").select() end, { desc = "[AI]: Execute action" }) +keymap.set({ "n", "t" }, "at", function() require("opencode").toggle() end, { desc = "[AI]: Toggle opencode" }) + -- [C]lear / [C]all keymap.set("n", "ch", ":nohl", { desc = "[C]lear: serch [h]ighlights" }) -keymap.set({ "n", "v" }, "cf", function() - require("conform").format() -end, { desc = "[C]all: [f]ormat" }) +keymap.set({ "n", "v" }, "cf", function() require("conform").format() end, { desc = "[C]all: [f]ormat" }) -- [D]iagnostic keymap.set("n", "dl", vim.diagnostic.open_float, { desc = "[D]iagnostic: [l]ine" }) @@ -39,23 +44,13 @@ keymap.set("n", "dl", vim.diagnostic.open_float, { desc = "[D]iagnostic: keymap.set("n", "db", "Telescope diagnostics bufnr=0", { desc = "[D]iagnostic: [b]uffer" }) -- folke/trouble.nvim keymap.set("n", "dw", "Trouble diagnostics toggle", { desc = "[D]iagnostic: Trouble [w]orkspace" }) -keymap.set( - "n", - "dc", - "Trouble diagnostics toggle filter.buf=0", - { desc = "[D]iagnostic: Trouble do[c]ument" } -) +keymap.set("n", "dc", "Trouble diagnostics toggle filter.buf=0", { desc = "[D]iagnostic: Trouble do[c]ument" }) keymap.set("n", "dq", "Trouble quickfix toggle", { desc = "[D]iagnostic: Trouble [q]uickfix" }) -- File [E]xplorer -- nvim-tree/nvim-tree.lua keymap.set("n", "ee", "NvimTreeToggle", { desc = "File [E]xplorer: Toggle file [e]xplorer" }) -keymap.set( - "n", - "ef", - "NvimTreeFindFileToggle", - { desc = "File [E]xplorer: Toggle file explorer on current [f]ile" } -) +keymap.set("n", "ef", "NvimTreeFindFileToggle", { desc = "File [E]xplorer: Toggle file explorer on current [f]ile" }) keymap.set("n", "ec", "NvimTreeCollapse", { desc = "File [E]xplorer: [C]ollapse" }) keymap.set("n", "er", "NvimTreeRefresh", { desc = "File [E]xplorer: [R]efresh" }) @@ -68,9 +63,7 @@ keymap.set("n", "fc", "Telescope grep_string", { desc = "[F]ind -- folke/todo-comments.nvim keymap.set("n", "ft", "TodoTelescope", { desc = "[F]ind: [t]odos" }) -- folke/snacks.nvim -keymap.set("n", "fq", function() - Snacks.picker.qflist() -end, { desc = "[F]ind: [Q]uickfix list" }) +keymap.set("n", "fq", function() Snacks.picker.qflist() end, { desc = "[F]ind: [Q]uickfix list" }) -- [G]it -- lewis6991/gitsigns.nvim @@ -83,42 +76,24 @@ keymap.set("n", "ghp", "Gitsigns nav_hunk prev", { desc = "[G]i keymap.set("n", "ghs", "Gitsigns stage_hunk", { desc = "[G]it [H]unk: [s]tage" }) keymap.set("n", "ghr", "Gitsigns reset_hunk", { desc = "[G]it [H]unk: [r]eset" }) keymap.set("n", "ghv", "Gitsigns preview_hunk", { desc = "[G]it [H]unk: pre[v]iew" }) -keymap.set("v", "ghs", function() - require("gitsigns").stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) -end, { desc = "[G]it [H]unk: [s]tage" }) -keymap.set("v", "ghr", function() - require("gitsigns").reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) -end, { desc = "[G]it [H]unk: [r]eset" }) +keymap.set("v", "ghs", function() require("gitsigns").stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) end, { desc = "[G]it [H]unk: [s]tage" }) +keymap.set("v", "ghr", function() require("gitsigns").reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) end, { desc = "[G]it [H]unk: [r]eset" }) keymap.set({ "o", "x" }, "gh", "Gitsigns select_hunk", { desc = "[G]it [H]unk: select" }) -- [H]istory -- folke/snacks.nvim -keymap.set("n", "hn", function() - Snacks.picker.notifications() -end, { desc = "[H]istory: [N]otifications" }) -keymap.set("n", "hc", function() - Snacks.picker.command_history() -end, { desc = "[H]istory: [C]ommands" }) +keymap.set("n", "hn", function() Snacks.picker.notifications() end, { desc = "[H]istory: [N]otifications" }) +keymap.set("n", "hc", function() Snacks.picker.command_history() end, { desc = "[H]istory: [C]ommands" }) -- [L]SP keymap.set({ "n", "v" }, "ld", vim.lsp.buf.hover, { desc = "[L]SP: Hover [D]ocumentation" }) keymap.set({ "n", "v" }, "la", vim.lsp.buf.code_action, { desc = "[L]SP: avalible code [a]ctions" }) -- folke/snacks.nvim -keymap.set("n", "lf", function() - Snacks.picker.lsp_definitions() -end, { desc = "[L]SP: Goto De[f]initions" }) -keymap.set("n", "lc", function() - Snacks.picker.lsp_declarations() -end, { desc = "[L]SP: Goto De[c]larations" }) -keymap.set("n", "le", function() - Snacks.picker.lsp_references() -end, { desc = "[L]SP: R[e]ferences" }) -keymap.set("n", "li", function() - Snacks.picker.lsp_implementations() -end, { desc = "[L]SP: Goto [I]mplementations" }) -keymap.set("n", "ly", function() - Snacks.picker.lsp_type_definitions() -end, { desc = "[L]SP: Goto T[y]pe Definitions" }) +keymap.set("n", "lf", function() Snacks.picker.lsp_definitions() end, { desc = "[L]SP: Goto De[f]initions" }) +keymap.set("n", "lc", function() Snacks.picker.lsp_declarations() end, { desc = "[L]SP: Goto De[c]larations" }) +keymap.set("n", "le", function() Snacks.picker.lsp_references() end, { desc = "[L]SP: R[e]ferences" }) +keymap.set("n", "li", function() Snacks.picker.lsp_implementations() end, { desc = "[L]SP: Goto [I]mplementations" }) +keymap.set("n", "ly", function() Snacks.picker.lsp_type_definitions() end, { desc = "[L]SP: Goto T[y]pe Definitions" }) -- [P]anes keymap.set("n", "pv", "v", { desc = "[P]ane: split [v]ertically" }) @@ -144,12 +119,8 @@ keymap.set("n", "tb", "tabnew %", { desc = "[T]ab: Open current -- [U]I -- folke/snacks.nvim -keymap.set("n", "ug", function() - Snacks.lazygit() -end, { desc = "[U]I: Open [L]azyGit" }) -keymap.set("n", "ud", function() - Snacks.dashboard() -end, { desc = "[U]I: Open [D]ashboard" }) +keymap.set("n", "ug", function() Snacks.lazygit() end, { desc = "[U]I: Open [L]azyGit" }) +keymap.set("n", "ud", function() Snacks.dashboard() end, { desc = "[U]I: Open [D]ashboard" }) -- folke/lazy.nvim keymap.set("n", "ul", "Lazy", { desc = "[U]I: Open [L]azyVim" }) -- mason-org/mason.nvim @@ -157,8 +128,6 @@ keymap.set("n", "um", "Mason", { desc = "[U]I: Open [M]ason" }) -- Misc -- VonHeikemen/fine-cmdline.nvim -keymap.set("n", ":", "FineCmdline", { desc = "Fine Command Line" }) +keymap.set("n", ":", ":lua require('fine-cmdline').open()", { desc = "Fine Command Line" }) -- folke/which-key.nvim -keymap.set("n", "?", function() - require("which-key").show({ global = false }) -end, { desc = "Buffer Local Keymaps (which-key)" }) +keymap.set("n", "?", function() require("which-key").show({ global = false }) end, { desc = "Buffer Local Keymaps (which-key)" }) diff --git a/nvim/lua/plugins/lualine.lua b/nvim/lua/plugins/lualine.lua index b274283..b0667b9 100644 --- a/nvim/lua/plugins/lualine.lua +++ b/nvim/lua/plugins/lualine.lua @@ -9,7 +9,7 @@ return { -- configure lualine with modified theme lualine.setup({ options = { - theme = 'auto', + theme = "auto", }, sections = { lualine_x = { @@ -22,6 +22,11 @@ return { { "fileformat" }, { "filetype" }, }, + lualine_z = { + { + require("opencode").statusline, + }, + }, }, }) end, diff --git a/nvim/lua/plugins/opencode.lua b/nvim/lua/plugins/opencode.lua new file mode 100644 index 0000000..0d520c3 --- /dev/null +++ b/nvim/lua/plugins/opencode.lua @@ -0,0 +1,51 @@ +-- https://github.com/nickjvandyke/opencode.nvim +return { + "nickjvandyke/opencode.nvim", + version = "*", -- Latest stable release + dependencies = { + { + -- `snacks.nvim` integration is recommended, but optional + ---@module "snacks" <- Loads `snacks.nvim` types for configuration intellisense + "folke/snacks.nvim", + optional = true, + opts = { + input = {}, -- Enhances `ask()` + picker = { -- Enhances `select()` + actions = { + opencode_send = function(...) return require("opencode").snacks_picker_send(...) end, + }, + win = { + input = { + keys = { + [""] = { "opencode_send", mode = { "n", "i" } }, + }, + }, + }, + }, + }, + }, + }, + config = function() + local opencode_cmd = "opencode --port" + ---@type snacks.terminal.Opts + local snacks_terminal_opts = { + win = { + position = "right", + enter = false, + on_win = function(win) + -- Set up keymaps and cleanup for an arbitrary terminal + require("opencode.terminal").setup(win.win) + end, + }, + } + ---@type opencode.Opts + vim.g.opencode_opts = { + server = { + start = function() require("snacks.terminal").open(opencode_cmd, snacks_terminal_opts) end, + stop = function() require("snacks.terminal").get(opencode_cmd, snacks_terminal_opts):close() end, + toggle = function() require("snacks.terminal").toggle(opencode_cmd, snacks_terminal_opts) end, + }, + } + vim.o.autoread = true -- Required for `opts.events.reload` + end, +} diff --git a/nvim/lua/plugins/which-key.lua b/nvim/lua/plugins/which-key.lua index a77e460..541dba2 100644 --- a/nvim/lua/plugins/which-key.lua +++ b/nvim/lua/plugins/which-key.lua @@ -11,6 +11,7 @@ return { -- or leave it empty to use the default settings -- refer to the configuration section below spec = { + { "a", group = "[A]I" }, { "c", group = "[C]lear / [C]all" }, { "d", group = "[D]iagnostic" }, { "e", group = "File [E]xplorer" },