🌟

AstroNvim + avante.nvimでCursorライクなNeovim環境を構築する

に公開

はてなブログから Zenn への移行について

これまでは社内テックブログとして はてなブログ を運用していましたが、Zenn に移行しました。本記事はその移行に伴い再掲したもので、内容は当時の記事を尊重しつつ Zenn のフォーマットに合わせて微調整しています。

はじめに

Neovimの軽快さとカスタマイズ性を維持しつつ、CursorのようなAI支援やモダンなUIを取り入れたいと考える開発者は多いのではないでしょうか。本記事では、AstroNvimyetone/avante.nvimを組み合わせて、CursorライクなNeovim環境を構築する方法を紹介します。

Cursorの魅力とは?

Cursorは、AIとの連携や洗練されたUIにより、開発体験を向上させるエディタとして注目されています。特に以下の点が魅力です:

  • AI支援:コードの補完やAgentモードなど、AIによる支援が充実しています。
  • モダンなUI:フローティングウィンドウやコマンドパレットなど、直感的な操作が可能です。
  • 統合されたワークフロー:Git連携やデバッグ機能など、開発に必要な機能が統合されています。

これらの特徴をNeovimで再現するために、AstroNvimとavante.nvimの組み合わせが有効です。

AstroNvimの導入と特徴

AstroNvimとは?

AstroNvimは、Neovimのディストリビューションの一つで、以下の特徴があります:

  • 豊富なプラグイン:LSP、Telescope、Tree-sitterなど、多数のプラグインがプリインストールされています。
  • 美しいUI:ステータスラインやタブラインなど、視認性の高いUIが提供されます。
  • 拡張性:ユーザー独自の設定やプラグインの追加が容易です。

インストール手順

既存のNeovim設定のバックアップ:

既存の設定がある方は以下を参考にバックアップをとってください。
https://docs.astronvim.com

AstroNvimのテンプレートをクローン:

git clone --depth 1 https://github.com/AstroNvim/template ~/.config/nvim

rm -rf ~/.config/nvim/.git

nvim

インストール後、Neovimを起動すると、必要なプラグインが自動でインストールされます。

ファイル操作&検索の基本キーマッピング:

leader + ff でファイル検索:

Space + ff(<Leader> はデフォルトで <Space>)を押すと Telescope の find_files が起動し、カレントディレクトリ以下のファイルを検索できます。
入力した文字列に一致する候補が即時に絞り込まれるので、ファイル名を数文字タイプして <Enter> で素早く開けます。

leader + fw でワード検索:

Space + fw は Telescope の live_grep を呼び出し、リポジトリ全体を対象にリアルタイムで文字列検索が可能です。

leader + e でファイルエクスプローラを開閉:

プロジェクトツリーを確認したいときは Space + e で ファイルエクスプローラが表示されます。
再度同じキーを押すと閉じられるため、Telescope で検索した後でもワンキーでツリーに戻れます。
エクスプローラ内では a で新規ファイル、d で削除などのショートカットが用意されています。

avante.nvimとは?(CursorライクなUI)

avante.nvimの概要

avante.nvimは、NeovimをCursorのようなAI支援型IDEに変換するプラグインです。主な特徴は以下の通りです:

  • AI支援:OpenAIなどのAPIを利用して、コードの補完や修正提案を行います。
  • 直感的な操作:AIからの提案を適用可能です。
  • 軽量なUI:Neovimのウィンドウを活用したシンプルなUIを提供します。

詳細は公式リポジトリをご参照ください。
https://github.com/yetone/avante.nvim

AstroNvim + avante.nvim の統合手順

avante.nvimのインストール

AstroNvimはlazy.nvimをプラグインマネージャーとして使用しています。以下の手順でavante.nvimを追加します:

プラグイン設定ファイルを編集:

~/.config/nvim/lua/plugins/avante.luaを作成し、以下の内容を記述します:

return {
  {
    "yetone/avante.nvim",
    event = "VeryLazy",
    version = false, -- Never set this value to "*"! Never!
    opts = {
      -- add any opts here
      -- for example
      provider = "openai",
      openai = {
        endpoint = "https://api.openai.com/v1",
        model = "gpt-4o", -- your desired model (or use gpt-4o, etc.)
        timeout = 30000, -- Timeout in milliseconds, increase this for reasoning models
        temperature = 0,
        max_completion_tokens = 8192, -- Increase this to include reasoning tokens (for reasoning models)
        --reasoning_effort = "medium", -- low|medium|high, only used for reasoning models
      },
    },
    -- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
    build = "make",
    -- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" -- for windows
    dependencies = {
      "nvim-treesitter/nvim-treesitter",
      "stevearc/dressing.nvim",
      "nvim-lua/plenary.nvim",
      "MunifTanjim/nui.nvim",
      --- The below dependencies are optional,
      "echasnovski/mini.pick", -- for file_selector provider mini.pick
      "nvim-telescope/telescope.nvim", -- for file_selector provider telescope
      "hrsh7th/nvim-cmp", -- autocompletion for avante commands and mentions
      "ibhagwan/fzf-lua", -- for file_selector provider fzf
      "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons
      "zbirenbaum/copilot.lua", -- for providers='copilot'
      {
        -- support for image pasting
        "HakonHarnes/img-clip.nvim",
        event = "VeryLazy",
        opts = {
          -- recommended settings
          default = {
            embed_image_as_base64 = false,
            prompt_for_file_name = false,
            drag_and_drop = {
              insert_mode = true,
            },
            -- required for Windows users
            use_absolute_path = true,
          },
        },
      },
      {
        -- Make sure to set this up properly if you have lazy=true
        'MeanderingProgrammer/render-markdown.nvim',
        opts = {
          file_types = { "markdown", "Avante" },
        },
        ft = { "markdown", "Avante" },
      },
    },
  }
}

APIキーの設定:

OpenAIのAPIキーを環境変数として設定します。

export OPENAI_API_KEY="your_openai_api_key"

Neovimの再起動:

設定を反映させるために、Neovimを再起動し、~/.config/nvim/lua/plugins/avante.luaファイルを開いて編集します。

nvim ~/.config/nvim/lua/plugins/avante.lua

Space + aaでavante.nvimのチャットパネルが表示されます。

チャットしてみる:

設定ファイルのモデルを変更する指示をしてみます。

aもしくはAで提案された変更が挿入されます。

最後にcaで変更をacceptします。

avante.nvimの便利なキーバインド:

avante.nvimでは、選択したコードブロックに対してAIによる編集や提案を行うためのキーバインドが用意されています。

** 選択範囲に対するAI操作**

Space + a + e: 選択したコードブロックをAIに送信し、編集提案を受け取ります。

Space + a + a: サイドバーを表示し、AIとの対話を開始します。

これらのキーバインドを活用することで、選択したコードに対して迅速にAIの支援を受けることができます。

おまけ: おすすめのプラグイン

CursorライクなNeovim環境をさらに快適にするために、以下のプラグインを導入することをおすすめします。

folke/flash.nvim

検索ラベルや強化された文字移動、Treesitterとの統合により、コードナビゲーションを向上させるプラグインです。
https://github.com/folke/flash.nvim

kdheepak/lazygit.nvim

Neovim内からlazygitを呼び出すためのプラグインで、Git操作を効率化します。
https://github.com/kdheepak/lazygit.nvim

Exafunction/windsurf.vim

Copilotの代替として有力な選択肢です。
筆者はまだ長期運用していませんが、導入も簡単なのでぜひ試してみてください。
https://github.com/Exafunction/windsurf.vim

github/copilot.vim

https://github.com/github/copilot.vim

まとめ

AstroNvimとavante.nvimを組み合わせることで、Neovim上でCursorのようなAI支援型の開発環境を構築できます。Neovimの軽快さを維持しつつ、モダンな開発体験を求める方にとって、有力な選択肢となるでしょう。

株式会社エクスプラザ

Discussion