Add opencode

This commit is contained in:
Valeriy Filippov
2026-03-11 18:50:00 +03:00
parent 59c0722f25
commit 32a5c2deb8
7 changed files with 89 additions and 58 deletions

4
nvim/.stylua.toml Normal file
View File

@@ -0,0 +1,4 @@
collapse_simple_statement = "Always"
indent_type = "Spaces"
column_width = 180
indent_width = 2

View File

@@ -1,2 +0,0 @@
indent_type = "Spaces"
indent_width = 2

View File

@@ -24,4 +24,7 @@ brew install --cask font-jetbrains-mono-nerd-font
# https://rust-lang.org/ for cargo package manager # https://rust-lang.org/ for cargo package manager
brew install rust brew install rust
# https://github.com/anomalyco/opencode
brew install opencode
``` ```

View File

@@ -15,6 +15,7 @@ local keymap = vim.keymap
-- Reserved firs characters: -- Reserved firs characters:
-- Update in ../plugins/which-key.lua -- Update in ../plugins/which-key.lua
-- a - [A]I
-- c - [C]lear / [C]all -- c - [C]lear / [C]all
-- d - [D]iagnostic -- d - [D]iagnostic
-- e - File [E]xplorer -- e - File [E]xplorer
@@ -27,11 +28,15 @@ local keymap = vim.keymap
-- t - [T]abs -- t - [T]abs
-- u - [U]i -- u - [U]i
-- [A]I
-- nickjvandyke/opencode.nvim
keymap.set({ "n", "x" }, "<leader>aa", function() require("opencode").ask("", { submit = true }) end, { desc = "[AI]: Ask opencode" })
keymap.set({ "n", "x" }, "<leader>ax", function() require("opencode").select() end, { desc = "[AI]: Execute action" })
keymap.set({ "n", "t" }, "<leader>at", function() require("opencode").toggle() end, { desc = "[AI]: Toggle opencode" })
-- [C]lear / [C]all -- [C]lear / [C]all
keymap.set("n", "<leader>ch", ":nohl<CR>", { desc = "[C]lear: serch [h]ighlights" }) keymap.set("n", "<leader>ch", ":nohl<CR>", { desc = "[C]lear: serch [h]ighlights" })
keymap.set({ "n", "v" }, "<leader>cf", function() keymap.set({ "n", "v" }, "<leader>cf", function() require("conform").format() end, { desc = "[C]all: [f]ormat" })
require("conform").format()
end, { desc = "[C]all: [f]ormat" })
-- [D]iagnostic -- [D]iagnostic
keymap.set("n", "<leader>dl", vim.diagnostic.open_float, { desc = "[D]iagnostic: [l]ine" }) keymap.set("n", "<leader>dl", vim.diagnostic.open_float, { desc = "[D]iagnostic: [l]ine" })
@@ -39,23 +44,13 @@ keymap.set("n", "<leader>dl", vim.diagnostic.open_float, { desc = "[D]iagnostic:
keymap.set("n", "<leader>db", "<cmd>Telescope diagnostics bufnr=0<CR>", { desc = "[D]iagnostic: [b]uffer" }) keymap.set("n", "<leader>db", "<cmd>Telescope diagnostics bufnr=0<CR>", { desc = "[D]iagnostic: [b]uffer" })
-- folke/trouble.nvim -- folke/trouble.nvim
keymap.set("n", "<leader>dw", "<cmd>Trouble diagnostics toggle<CR>", { desc = "[D]iagnostic: Trouble [w]orkspace" }) keymap.set("n", "<leader>dw", "<cmd>Trouble diagnostics toggle<CR>", { desc = "[D]iagnostic: Trouble [w]orkspace" })
keymap.set( keymap.set("n", "<leader>dc", "<cmd>Trouble diagnostics toggle filter.buf=0<CR>", { desc = "[D]iagnostic: Trouble do[c]ument" })
"n",
"<leader>dc",
"<cmd>Trouble diagnostics toggle filter.buf=0<CR>",
{ desc = "[D]iagnostic: Trouble do[c]ument" }
)
keymap.set("n", "<leader>dq", "<cmd>Trouble quickfix toggle<CR>", { desc = "[D]iagnostic: Trouble [q]uickfix" }) keymap.set("n", "<leader>dq", "<cmd>Trouble quickfix toggle<CR>", { desc = "[D]iagnostic: Trouble [q]uickfix" })
-- File [E]xplorer -- File [E]xplorer
-- nvim-tree/nvim-tree.lua -- nvim-tree/nvim-tree.lua
keymap.set("n", "<leader>ee", "<cmd>NvimTreeToggle<CR>", { desc = "File [E]xplorer: Toggle file [e]xplorer" }) keymap.set("n", "<leader>ee", "<cmd>NvimTreeToggle<CR>", { desc = "File [E]xplorer: Toggle file [e]xplorer" })
keymap.set( keymap.set("n", "<leader>ef", "<cmd>NvimTreeFindFileToggle<CR>", { desc = "File [E]xplorer: Toggle file explorer on current [f]ile" })
"n",
"<leader>ef",
"<cmd>NvimTreeFindFileToggle<CR>",
{ desc = "File [E]xplorer: Toggle file explorer on current [f]ile" }
)
keymap.set("n", "<leader>ec", "<cmd>NvimTreeCollapse<CR>", { desc = "File [E]xplorer: [C]ollapse" }) keymap.set("n", "<leader>ec", "<cmd>NvimTreeCollapse<CR>", { desc = "File [E]xplorer: [C]ollapse" })
keymap.set("n", "<leader>er", "<cmd>NvimTreeRefresh<CR>", { desc = "File [E]xplorer: [R]efresh" }) keymap.set("n", "<leader>er", "<cmd>NvimTreeRefresh<CR>", { desc = "File [E]xplorer: [R]efresh" })
@@ -68,9 +63,7 @@ keymap.set("n", "<leader>fc", "<cmd>Telescope grep_string<cr>", { desc = "[F]ind
-- folke/todo-comments.nvim -- folke/todo-comments.nvim
keymap.set("n", "<leader>ft", "<cmd>TodoTelescope<cr>", { desc = "[F]ind: [t]odos" }) keymap.set("n", "<leader>ft", "<cmd>TodoTelescope<cr>", { desc = "[F]ind: [t]odos" })
-- folke/snacks.nvim -- folke/snacks.nvim
keymap.set("n", "<leader>fq", function() keymap.set("n", "<leader>fq", function() Snacks.picker.qflist() end, { desc = "[F]ind: [Q]uickfix list" })
Snacks.picker.qflist()
end, { desc = "[F]ind: [Q]uickfix list" })
-- [G]it -- [G]it
-- lewis6991/gitsigns.nvim -- lewis6991/gitsigns.nvim
@@ -83,42 +76,24 @@ keymap.set("n", "<leader>ghp", "<cmd>Gitsigns nav_hunk prev<CR>", { desc = "[G]i
keymap.set("n", "<leader>ghs", "<cmd>Gitsigns stage_hunk<CR>", { desc = "[G]it [H]unk: [s]tage" }) keymap.set("n", "<leader>ghs", "<cmd>Gitsigns stage_hunk<CR>", { desc = "[G]it [H]unk: [s]tage" })
keymap.set("n", "<leader>ghr", "<cmd>Gitsigns reset_hunk<CR>", { desc = "[G]it [H]unk: [r]eset" }) keymap.set("n", "<leader>ghr", "<cmd>Gitsigns reset_hunk<CR>", { desc = "[G]it [H]unk: [r]eset" })
keymap.set("n", "<leader>ghv", "<cmd>Gitsigns preview_hunk<CR>", { desc = "[G]it [H]unk: pre[v]iew" }) keymap.set("n", "<leader>ghv", "<cmd>Gitsigns preview_hunk<CR>", { desc = "[G]it [H]unk: pre[v]iew" })
keymap.set("v", "<leader>ghs", function() keymap.set("v", "<leader>ghs", function() require("gitsigns").stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) end, { desc = "[G]it [H]unk: [s]tage" })
require("gitsigns").stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) keymap.set("v", "<leader>ghr", function() require("gitsigns").reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) end, { desc = "[G]it [H]unk: [r]eset" })
end, { desc = "[G]it [H]unk: [s]tage" })
keymap.set("v", "<leader>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" }, "<leader>gh", "<cmd>Gitsigns select_hunk<CR>", { desc = "[G]it [H]unk: select" }) keymap.set({ "o", "x" }, "<leader>gh", "<cmd>Gitsigns select_hunk<CR>", { desc = "[G]it [H]unk: select" })
-- [H]istory -- [H]istory
-- folke/snacks.nvim -- folke/snacks.nvim
keymap.set("n", "<leader>hn", function() keymap.set("n", "<leader>hn", function() Snacks.picker.notifications() end, { desc = "[H]istory: [N]otifications" })
Snacks.picker.notifications() keymap.set("n", "<leader>hc", function() Snacks.picker.command_history() end, { desc = "[H]istory: [C]ommands" })
end, { desc = "[H]istory: [N]otifications" })
keymap.set("n", "<leader>hc", function()
Snacks.picker.command_history()
end, { desc = "[H]istory: [C]ommands" })
-- [L]SP -- [L]SP
keymap.set({ "n", "v" }, "<leader>ld", vim.lsp.buf.hover, { desc = "[L]SP: Hover [D]ocumentation" }) keymap.set({ "n", "v" }, "<leader>ld", vim.lsp.buf.hover, { desc = "[L]SP: Hover [D]ocumentation" })
keymap.set({ "n", "v" }, "<leader>la", vim.lsp.buf.code_action, { desc = "[L]SP: avalible code [a]ctions" }) keymap.set({ "n", "v" }, "<leader>la", vim.lsp.buf.code_action, { desc = "[L]SP: avalible code [a]ctions" })
-- folke/snacks.nvim -- folke/snacks.nvim
keymap.set("n", "<leader>lf", function() keymap.set("n", "<leader>lf", function() Snacks.picker.lsp_definitions() end, { desc = "[L]SP: Goto De[f]initions" })
Snacks.picker.lsp_definitions() keymap.set("n", "<leader>lc", function() Snacks.picker.lsp_declarations() end, { desc = "[L]SP: Goto De[c]larations" })
end, { desc = "[L]SP: Goto De[f]initions" }) keymap.set("n", "<leader>le", function() Snacks.picker.lsp_references() end, { desc = "[L]SP: R[e]ferences" })
keymap.set("n", "<leader>lc", function() keymap.set("n", "<leader>li", function() Snacks.picker.lsp_implementations() end, { desc = "[L]SP: Goto [I]mplementations" })
Snacks.picker.lsp_declarations() keymap.set("n", "<leader>ly", function() Snacks.picker.lsp_type_definitions() end, { desc = "[L]SP: Goto T[y]pe Definitions" })
end, { desc = "[L]SP: Goto De[c]larations" })
keymap.set("n", "<leader>le", function()
Snacks.picker.lsp_references()
end, { desc = "[L]SP: R[e]ferences" })
keymap.set("n", "<leader>li", function()
Snacks.picker.lsp_implementations()
end, { desc = "[L]SP: Goto [I]mplementations" })
keymap.set("n", "<leader>ly", function()
Snacks.picker.lsp_type_definitions()
end, { desc = "[L]SP: Goto T[y]pe Definitions" })
-- [P]anes -- [P]anes
keymap.set("n", "<leader>pv", "<C-w>v", { desc = "[P]ane: split [v]ertically" }) keymap.set("n", "<leader>pv", "<C-w>v", { desc = "[P]ane: split [v]ertically" })
@@ -144,12 +119,8 @@ keymap.set("n", "<leader>tb", "<cmd>tabnew %<CR>", { desc = "[T]ab: Open current
-- [U]I -- [U]I
-- folke/snacks.nvim -- folke/snacks.nvim
keymap.set("n", "<leader>ug", function() keymap.set("n", "<leader>ug", function() Snacks.lazygit() end, { desc = "[U]I: Open [L]azyGit" })
Snacks.lazygit() keymap.set("n", "<leader>ud", function() Snacks.dashboard() end, { desc = "[U]I: Open [D]ashboard" })
end, { desc = "[U]I: Open [L]azyGit" })
keymap.set("n", "<leader>ud", function()
Snacks.dashboard()
end, { desc = "[U]I: Open [D]ashboard" })
-- folke/lazy.nvim -- folke/lazy.nvim
keymap.set("n", "<leader>ul", "<cmd>Lazy<CR>", { desc = "[U]I: Open [L]azyVim" }) keymap.set("n", "<leader>ul", "<cmd>Lazy<CR>", { desc = "[U]I: Open [L]azyVim" })
-- mason-org/mason.nvim -- mason-org/mason.nvim
@@ -157,8 +128,6 @@ keymap.set("n", "<leader>um", "<cmd>Mason<CR>", { desc = "[U]I: Open [M]ason" })
-- Misc -- Misc
-- VonHeikemen/fine-cmdline.nvim -- VonHeikemen/fine-cmdline.nvim
keymap.set("n", ":", "<cmd>FineCmdline<CR>", { desc = "Fine Command Line" }) keymap.set("n", ":", ":lua require('fine-cmdline').open()<CR>", { desc = "Fine Command Line" })
-- folke/which-key.nvim -- folke/which-key.nvim
keymap.set("n", "<leader>?", function() keymap.set("n", "<leader>?", function() require("which-key").show({ global = false }) end, { desc = "Buffer Local Keymaps (which-key)" })
require("which-key").show({ global = false })
end, { desc = "Buffer Local Keymaps (which-key)" })

View File

@@ -9,7 +9,7 @@ return {
-- configure lualine with modified theme -- configure lualine with modified theme
lualine.setup({ lualine.setup({
options = { options = {
theme = 'auto', theme = "auto",
}, },
sections = { sections = {
lualine_x = { lualine_x = {
@@ -22,6 +22,11 @@ return {
{ "fileformat" }, { "fileformat" },
{ "filetype" }, { "filetype" },
}, },
lualine_z = {
{
require("opencode").statusline,
},
},
}, },
}) })
end, end,

View File

@@ -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 = {
["<a-a>"] = { "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,
}

View File

@@ -11,6 +11,7 @@ return {
-- or leave it empty to use the default settings -- or leave it empty to use the default settings
-- refer to the configuration section below -- refer to the configuration section below
spec = { spec = {
{ "<leader>a", group = "[A]I" },
{ "<leader>c", group = "[C]lear / [C]all" }, { "<leader>c", group = "[C]lear / [C]all" },
{ "<leader>d", group = "[D]iagnostic" }, { "<leader>d", group = "[D]iagnostic" },
{ "<leader>e", group = "File [E]xplorer" }, { "<leader>e", group = "File [E]xplorer" },