Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Bring the powerful opencode AI to Neovim — editor-aware research, reviews, and refactors, all in one place.

License

Notifications You must be signed in to change notification settings

prajwal369/opencode.nvim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

150 Commits

Repository files navigation

opencode.nvim

Bring the powerful opencode AI to Neovim — editor-aware research, reviews, and refactors, all in one place.

demo.mp4

✨ Features

  • Toggle an opencode terminal window within Neovim
  • Send prompts and commands
  • Insert editor context
  • Auto-reload edited buffers

📦 Installation

Important

Set your opencode theme to system — other themes currently have visual bugs in embedded terminals.

Using lazy.nvim:

{
 'NickvanDyke/opencode.nvim',
 dependencies = {
 'folke/snacks.nvim',
 },
 ---@type opencode.Config
 opts = {
 -- Your configuration, if any
 },
 -- stylua: ignore
 keys = {
 -- opencode.nvim exposes a general, flexible API — customize it to your workflow!
 -- But here are some examples to get you started :)
 { '<leader>ot', function() require('opencode').toggle() end, desc = 'Toggle opencode', },
 { '<leader>oa', function() require('opencode').ask() end, desc = 'Ask opencode', mode = { 'n', 'v' }, },
 { '<leader>oA', function() require('opencode').ask('@file ') end, desc = 'Ask opencode about current file', mode = { 'n', 'v' }, },
 { '<leader>on', function() require('opencode').command('/new') end, desc = 'New session', },
 { '<leader>oe', function() require('opencode').prompt('Explain @cursor and its context') end, desc = 'Explain code near cursor' },
 { '<leader>or', function() require('opencode').prompt('Review @file for correctness and readability') end, desc = 'Review file', },
 { '<leader>of', function() require('opencode').prompt('Fix these @diagnostics') end, desc = 'Fix errors', },
 { '<leader>oo', function() require('opencode').prompt('Optimize @selection for performance and readability') end, desc = 'Optimize selection', mode = 'v', },
 { '<leader>od', function() require('opencode').prompt('Add documentation comments for @selection') end, desc = 'Document selection', mode = 'v', },
 { '<leader>ot', function() require('opencode').prompt('Add tests for @selection') end, desc = 'Test selection', mode = 'v', },
 },
}

⚙️ Configuration

Default settings:

---@type opencode.Config
{
 auto_reload = false, -- Automatically reload buffers edited by opencode
 auto_focus = false, -- Focus the opencode window after prompting 
 command = "opencode", -- Command to launch opencode
 context = { -- Context to inject in prompts
 ["@file"] = require("opencode.context").file,
 ["@files"] = require("opencode.context").files,
 ["@cursor"] = require("opencode.context").cursor_position,
 ["@selection"] = require("opencode.context").visual_selection,
 ["@diagnostics"] = require("opencode.context").diagnostics,
 ["@quickfix"] = require("opencode.context").quickfix,
 ["@diff"] = require("opencode.context").git_diff,
 },
 win = {
 position = "right",
 -- See https://github.com/folke/snacks.nvim/blob/main/docs/win.md for more window options
 },
 -- See https://github.com/folke/snacks.nvim/blob/main/docs/terminal.md for more terminal options
}

🕵️‍♂️ Context

When your prompt contains placeholders, the plugin will replace it with context before sending:

Placeholder Context
@file Current file
@files Open files
@cursor Cursor position
@selection Selected text
@diagnostics Current buffer diagnostics
@quickfix Quickfix list
@diff Git diff

You can add custom contexts via opts.context. This example replaces @grapple with files tracked by grapple.nvim:

---@type opencode.Config
{
 context = {
 ---@return string|nil
 ['@grapple'] = function()
 local tags = require('grapple').tags()
 if not tags or #tags == 0 then
 return nil
 end
 local paths = {}
 for _, tag in ipairs(tags) do
 table.insert(paths, tag.path)
 end
 return table.concat(paths, ', ')
 end,
 }
}

🙏 Acknowledgments

  • Inspired by (and partially based on) nvim-aider.
  • This plugin uses opencode's familiar interface to reduce cognitive load. See sudo-tee/opencode.nvim for a Neovim frontend.
  • mcp-neovim-server may better suit your workflow, although it lacks custom contexts and tool calls are slow and unreliable.

About

Bring the powerful opencode AI to Neovim — editor-aware research, reviews, and refactors, all in one place.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Lua 100.0%

AltStyle によって変換されたページ (->オリジナル) /