📝

aider.vimの使いかた

に公開

前提

aider本体の使い方については、以下の記事を参照してください。

AIコーディングツール Aiderの使いかた

aider.vimとは

nekowasabi/aider.vim: Helper aider with neovim

aider.vimは、NeoVimからaiderを利用するためのプラグインです。
CLIツールであるAiderをNeoVimから利用するためのヘルパーであり、CLIツールの機能をVimから簡単に利用できるようにするためのものです。

特徴

neovimとのシームレスな連携例

  • 開いているバッファを/addコマンドでaiderにコンテキストとして追加
  • 複雑なコマンドをNeoVimからaiderに送信
  • aiderのWebインターフェースを開く
  • 必要なときだけAiderをフローティングウインドウで表示

コードの特定部分のみAiderで処理させる

Aider単体では、基本的にファイル単位でコンテキストに追加しますが、コードの一部分をコンテキストとして使いたい場合は、エディターからコピーしてAiderにペーストする必要があり、NeoVimから離れなければならない弱点があります。
しかし、aider.vimを使えば、この編集操作をVimの機能を使って簡単に行えます。

使いかた

インストール

各種プラグインマネージャーを使ってインストールできます。
以下はvim-plugを使ったインストール例です。

Plug 'vim-denops/denops.vim' " 依存しているためインストールが必要
Plug 'nekowasabi/aider.vim'

設定例

" Aider本体のコマンド設定
" オプションは以下のURLを参照
" https://aider.chat/docs/config/options.html
let g:aider_command = 'aider --no-auto-commits'

" フローティングウィンドウ設定
let g:aider_buffer_open_type = 'floating'
let g:aider_floatwin_width = 100
let g:aider_floatwin_height = 20
let g:aider_floatwin_border = "double"
let g:aider_floatwin_border_style = "minimal"

" 追加プロンプト設定
let g:aider_additional_prompt = [
  "ここに追加のプロンプトを入力",
  "ビジュアルモードで選択範囲を使用する際にフローティングウィンドウに表示されます",
  "aiderに送信する前に確認・編集できます",
]

" Aiderを起動
nnoremap <silent> <leader>at :AiderRun<CR>
" 現在のファイルをAiderに追加
nnoremap <silent> <leader>aa :AiderAddCurrentFile<CR>
" 現在のファイルを読み取り専用でAiderに追加
nnoremap <silent> <leader>ar :AiderAddCurrentFileReadOnly<CR>
" Aider Webインターフェースを追加
nnoremap <silent> <leader>aw :AiderAddWeb<CR>
" Aiderを終了
nnoremap <silent> <leader>ax :AiderExit<CR>
" 現在のファイルをAiderの無視リストに追加
nnoremap <silent> <leader>ai :AiderAddIgnoreCurrentFile<CR>
" Aiderの無視リストを開く
nnoremap <silent> <leader>aI :AiderOpenIgnore<CR>
" クリップボードの内容をAiderに貼り付け
nnoremap <silent> <leader>ap :AiderPaste<CR>
" Aiderウィンドウを隠す
nnoremap <silent> <leader>ah :AiderHide<CR>

" Aider用自動コマンドグループ
augroup AiderOpenGroup
  autocmd!
  autocmd User AiderOpen call s:AiderOpenHandler()
augroup END

function! s:AiderOpenHandler() abort
  " Aiderバッファ用のキーマッピングを設定
  tnoremap <buffer> <Esc> <C-\><C-n>
  nnoremap <buffer> <Esc> :AiderHide<CR>
endfunction

基本的な使いかた

Aiderを起動する

現在のバッファをAiderにコンテキストとして送信する

コードの一部をAiderにコンテキストとして送信する

便利な使いかた

vim-rule-switcherと連携した、複数コンテキストファイルの読み込み

aider.vim単体でもAiderを便利に使うことができますが、複雑なプロジェクトでAiderを使う際に、コンテキストとして複数のファイルを読み込ませたい場合があります。
この場合、/addコマンドを複数回実行するか、vimscriptなどで/addコマンドを複数回送信するなどの工夫で実現できます。
しかし、この方法では、vimscriptを変更するたびにNeoVimを再起動したり、設定ファイルをリロードしたりする手間が発生します。
この問題の対策として、vim-rule-switcherというプラグインを使うと、特定のプロジェクトのファイルを一括でaiderに送信したり、変更したいファイルだけを/addコマンドで追加するなど、柔軟な操作が可能になります。
プラグインの詳細は以下のリンクを参照してください。

ファイル切り替えを楽にする vim-rule-switcherプラグイン
nekowasabi/vim-rule-switcher

vim-rule-switcherを使うと、任意のプロジェクトに対して、ファイルパス群が保存されたjsonを作成できます。

vim-rule-switcherによって生成されたjsonの例
{
  "projects": [
    {
      "name": "big-project",
      "rules": [
        {
          "rule": "file",
          "path": [
            "~/repos/geminitranslate/content.js",
            "~/repos/geminitranslate/background.js",
            "~/repos/geminitranslate/context.md",
            "~/repos/geminitranslate/manifest.json"
          ]
        }
      ]
    },
    {
      "name": "aider-vim-project",
      "rules": [
        {
          "rule": "file",
          "path": [
            "~/.config/nvim/rc/plugins/aider.vim",
            "~/.config/nvim/plugged/aider.vim/dev_plan.md"
          ]
        }
      ]
    },
  ]
}

このjsonを元に、aider.vimから特定のプロジェクトのファイルを一括でaiderに送信することができます。

:AiderProjectFiles big-project: 全ファイルを/read-onlyで追加
:AiderProjectFiles big-project add: 全ファイルを/addで追加

" vim-rule-switcher.vimのプロジェクトルールのパスをaiderで開く
let g:switch_rule = '/path/to/switch_rule.json'
function! s:aider_toggle_context_for_vim_rule_switcher(...) abort
  if a:0 < 1 || a:0 > 2
    echo "Error: 引数は1つ(プロジェクト名)または2つ(プロジェクト名とモード)を指定してください"
    return
  endif

  let l:project = a:1
  echo l:project
  let l:mode = a:0 == 2 ? a:2 : 'read-only'

  let json_content = readfile(expand(g:switch_rule))
  let json_data = json_decode(join(json_content, "\n"))

  let project = filter(json_data.projects, 'v:val.name ==# l:project')
  if len(project) > 0
      let paths = map(copy(project[0].rules), 'v:val.path')
      let paths = flatten(paths)
      let paths = map(paths, 'expand(v:val)')
      
      let command = l:mode ==# 'add' ? '/add' : '/read-only'
      
      for path in paths
        execute "AiderSendPromptByCommandline " . command . " " . path
      endfor
  else
      echo "指定されたプロジェクト「" . l:project . "」が見つかりません。"
  endif
endfunction
command! -nargs=* AiderProjectFiles call s:aider_toggle_context_for_vim_rule_switcher(<f-args>)

最後に

aider単体でもAIを使った開発には十分役立ちますが、日頃からNeoVimを使っているユーザーであれば、aider.vimを併用することで、さらに効果的にaiderを活用できるようになります。ぜひ試してみてください。

Discussion