aider.vimの使いかた
前提
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