GeorgesAlkhouri/nvim-aider

github github
ai
stars 187
issues 1
subscribers 2
forks 13
CREATED

2024-11-19

UPDATED

5 days ago


aider nvim-aider

🤖 Seamlessly integrate Aider with Neovim for an enhanced AI-assisted coding experience!

🚧 This plugin is in initial development. Expect breaking changes and rough edges. October 17, 2024

🌟 Features

  • 🖥️ Aider terminal integration within Neovim
  • 🎨 Color theme configuration support with auto Catppuccin flavor synchronization if available
  • 📤 Quick commands to add/drop current buffer files
  • 📤 Send buffers or selections to Aider
  • 💬 Optional user prompt for buffer and selection sends
  • 🩺 Send current buffer diagnostics to Aider
  • 🔍 Aider command selection UI with fuzzy search and input prompt
  • 🔌 Fully documented Lua API for programmatic interaction and custom integrations
  • 🌲➕ Neo-tree integration also with multi-file/directory selection with visual mode support
  • 🌳 Integration with nvim-tree.lua for adding or dropping files directly from the tree interface

🎮 Commands

  • :Aider - Open interactive command menu

    Commands:
    health         🩺 Check plugin health status
    toggle         🎛️ Toggle Aider terminal window
    send           📤 Send text to Aider (prompt if empty)
    command        ⌨️ Show slash commands
    buffer         📄 Send current buffer
     > diagnostics 🩺 Send current buffer diagnostics
    add            ➕ Add file to session
     > readonly    👀 Add as read-only reference
    drop           🗑️ Remove file from session
    
  • ⚡ Direct command execution examples:

    :Aider health
    :Aider add readonly
    :Aider send "Fix login validation"
    

🔗 Requirements

🐍 Python: Install aider-chat 📋 System: Neovim >= 0.9.4, Working clipboard thanks to @milanglacier 🌙 Lua: folke/snacks.nvim, optionals catppuccin/nvim, nvim-neo-tree/neo-tree.nvim, nvim-tree.lua

📦 Installation

Using lazy.nvim:

{
    "GeorgesAlkhouri/nvim-aider",
    cmd = "Aider",
    -- Example key mappings for common actions:
    keys = {
      { "<leader>a/", "<cmd>Aider toggle<cr>", desc = "Toggle Aider" },
      { "<leader>as", "<cmd>Aider send<cr>", desc = "Send to Aider", mode = { "n", "v" } },
      { "<leader>ac", "<cmd>Aider command<cr>", desc = "Aider Commands" },
      { "<leader>ab", "<cmd>Aider buffer<cr>", desc = "Send Buffer" },
      { "<leader>a+", "<cmd>Aider add<cr>", desc = "Add File" },
      { "<leader>a-", "<cmd>Aider drop<cr>", desc = "Drop File" },
      { "<leader>ar", "<cmd>Aider add readonly<cr>", desc = "Add Read-Only" },
      -- Example nvim-tree.lua integration if needed
      { "<leader>a+", "<cmd>AiderTreeAddFile<cr>", desc = "Add File from Tree to Aider", ft = "NvimTree" },
      { "<leader>a-", "<cmd>AiderTreeDropFile<cr>", desc = "Drop File from Tree from Aider", ft = "NvimTree" },
    },
    dependencies = {
      "folke/snacks.nvim",
      --- The below dependencies are optional
      "catppuccin/nvim",
      "nvim-tree/nvim-tree.lua",
      --- Neo-tree integration
      {
        "nvim-neo-tree/neo-tree.nvim",
        opts = function(_, opts)
          -- Example mapping configuration (already set by default)
          -- opts.window = {
          --   mappings = {
          --     ["+"] = { "nvim_aider_add", desc = "add to aider" },
          --     ["-"] = { "nvim_aider_drop", desc = "drop from aider" }
          --   }
          -- }
          require("nvim_aider.neo_tree").setup(opts)
        end,
      },
    },
    config = true,
  }

⚙️ Configuration

There is no need to call setup if you don't want to change the default options.

require("nvim_aider").setup({
  -- Command that executes Aider
  aider_cmd = "aider",
  -- Command line arguments passed to aider
  args = {
    "--no-auto-commits",
    "--pretty",
    "--stream",
  },
  -- Theme colors (automatically uses Catppuccin flavor if available)
  theme = {
    user_input_color = "#a6da95",
    tool_output_color = "#8aadf4",
    tool_error_color = "#ed8796",
    tool_warning_color = "#eed49f",
    assistant_output_color = "#c6a0f6",
    completion_menu_color = "#cad3f5",
    completion_menu_bg_color = "#24273a",
    completion_menu_current_color = "#181926",
    completion_menu_current_bg_color = "#f4dbd6",
  },
  -- snacks.picker.layout.Config configuration
  picker_cfg = {
    preset = "vscode",
  },
  -- Other snacks.terminal.Opts options
  config = {
    os = { editPreset = "nvim-remote" },
    gui = { nerdFontsVersion = "3" },
  },
  win = {
    wo = { winbar = "Aider" },
    style = "nvim_aider",
    position = "right",
  },
})

📚 API Reference

The plugin provides a structured API for programmatic integration. Access via require("nvim_aider").api

Core Functions

local api = require("nvim_aider").api

health_check()

Verify plugin health status

api.health_check()

toggle_terminal(opts?)

Toggle Aider terminal window

api.toggle_terminal()

Terminal Operations

send_to_terminal(text, opts?)

Send raw text directly to Aider

api.send_to_terminal("Fix the login validation")

send_command(command, input?, opts?)

Execute specific Aider command

api.send_command("/commit", "Add error handling")

File Management

add_file(filepath)

Add specific file to session

api.add_file("/src/utils.lua")

drop_file(filepath)

Remove file from session

api.drop_file("/outdated/legacy.py")

add_current_file()

Add current buffer's file (uses add_file internally)

vim.api.nvim_create_autocmd("BufWritePost", {
  callback = function()
    api.add_current_file()
  end
})

drop_current_file()

Remove current buffer's file

api.drop_current_file()

add_read_only_file()

Add current buffer as read-only reference

api.add_read_only_file()

Buffer Operations

send_buffer_with_prompt(opts?)

Send entire buffer content with optional prompt

api.send_buffer_with_prompt()

send_diagnostics_with_prompt(opts?)

Send current buffer's diagnostics with an optional prompt

api.send_diagnostics_with_prompt()

UI Components

open_command_picker(opts?, callback?)

Interactive command selector with custom handling

api.open_command_picker(nil, function(picker, item)
  if item.text == "/custom" then
    -- Implement custom command handling
  else
    -- Default behavior
    picker:close()
    api.send_command(item.text)
  end
end)

🧩 Other Aider Neovim plugins