AstroNvim Upgrade - v3 to v4 -

# AstroNvim
NeovimをIDEっぽくしてくれる各種設定とプラグインがまとまったパッケージです。  
以前にもQiitaに紹介記事([AstroNvimの設定を晒す〜copilotを添えて〜](https://qiita.com/kane8n/items/473ecc47874ddbc1ea88))を書いていますが、久々にUpdateしたところ、最新版のv4ではユーザカスタマイズ設定の仕方がガラッと変わっていたので、Migrationの手順について纏めてみます。  
※ あまりにも変わりすぎていて、v3での設定を捨てて完全に新規で入れ直したほうが早いかもしれないと思ったほどです。

# Migration v3 to v4
まずは、[公式のMigration Guide](https://docs.astronvim.com/configuration/v4_migration/)を参照しましょう。と言いたいとこなんですが、User Configurationの移行方法についてはあまり詳しく書かれていないので、少し戸惑うことがあるかもしれません。  
というか筆者は最初戸惑いました。  
なので、ここでは、v3の設定をv4に移行する際のポイントを紹介します。  

## 1. 既存設定のバックアップ
まずは、既存の設定をバックアップしておきましょう。  
ここの手順は、Migration GuideまたはGetting Startedに載っているコマンドを実行します。
```bash
# Backup old Neovim folders
mv ~/.local/share/nvim ~/.local/share/nvim.bak # backup old data folder
mv ~/.local/state/nvim ~/.local/state/nvim.bak # backup old state folder
mv ~/.cache/nvim ~/.cache/nvim.bak # backup old cache folder
mv ~/.config/nvim ~/.config/nvim.bak # backup old config
```

## 2. v4のインストール
次に、v4のAstroNvimをインストールします。
```bash
git clone --depth 1 https://github.com/AstroNvim/template ~/.config/nvim
rm -rf ~/.config/nvim/.git
nvim
```
ここでのポイントは、`~/.config/nvim`に`template`をcloneして、`.git`を削除することです。  
ちなみにここまでの手順は、Getting Startedと同じです。

## 3. User Configurationの準備
Migration Guideには一応Tipとして、
>Checkout the Managing User Configuration Page for details on how to create a new git repository from our template or convert the clone described above into a repository. It is highly recommended to set up your configuration as a git repository so that it is backed up as well as easier to share.

と書かれてるんですが、多くのユーザはUser Configurationの移行方法のほうが重要なはずなので、Migration Guide側でもう少し詳しく書いてほしかったです。  
というわけで次はUser Configurationの準備をやっていきます。  
公式の手順は [ここ](https://docs.astronvim.com/configuration/manage_user_config/)にあります。  

`Fresh Installation`と`Followed Getting Started`の２つ手順があるんですが、手順2までを`Getting Started`と同じ手順で進めているので、`Followed Getting Started`の手順で進めます。  

### 3-1. リポジトリの準備
AstroNvimの設定用リポジトリを作成します。  
作成先はGitHubでもGitLabでもBitbucketでもなんでもいいです。一応、以降の手順はGitHubを想定しますが、適宜読み替えてください。  
リポジトリだけ作ったら空の状態で大丈夫です。

### 3-2. リポジトリにtemplateのファイル群をコミット
`Followed Getting Started`の手順2を実行します。手順に書かれているコマンドを`~/.config/nvim`に移動して実行します。  
`~/.config/nvim`は、手順2でAstroNvim v4のファイル群がcloneされていて、`.git`が削除されている状態です。  
```bash
cd ~/.config/nvim
git init
git add --all
git commit -m "Initial commit"
git branch -M main
git remote add origin git@github.com:<あなたのユーザ名>/<手順3-1で作成したリポジトリ名>.git
git push -u origin main
```
手順3-1で作成したリポジトリにAstroNvimのファイル群をコミットします。  
これで、User Configurationの準備は完了です。

## 4. v3から設定を移行
手順3までで、User Configurationの準備が完了したので、v3から設定を移行します。  
v3のUser設定ファイルは、手順1でバックアップを取ってあるので、`~/.config/nvim.bak/lua/user`にあるはずです。  
もしくは元々リポジトリ管理していれば、リポジトリにあることでしょう。

幸いなことに大半のplugin設定はほぼそのまま動くので、`~/.config/nvim/lua/plugins/`の下にluaファイルを作成して、既存の設定を持ってくればOKです。  
[Customize Plugins](https://docs.astronvim.com/configuration/customizing_plugins/)を参考にしながら、設定を移行していきましょう。  
ただし一部のkeyは変更されているので、注意が必要です。

ここで筆者の設定用リポジトリを載せておきます。  

v3用  
https://github.com/kane8n/AstroNvimUser

v4用  
https://github.com/kane8n/astronvim-config  


```bash
.
├── README.md
├── init.lua
├── lazy-lock.json
├── lua
│   ├── community.lua
│   ├── lazy_setup.lua
│   ├── plugins
│   │   ├── astrocore.lua
│   │   ├── astrolsp.lua
│   │   ├── astroui.lua
│   │   ├── copilot.lua
│   │   ├── im-select.lua
│   │   ├── markdown-preview.lua
│   │   ├── mason.lua
│   │   ├── none-ls.lua
│   │   ├── overridden-core.lua
│   │   ├── overridden-heirline.lua
│   │   ├── overridden-lsp.lua
│   │   ├── overridden-neo-tree.lua
│   │   ├── overridden-toggleterm.lua
│   │   ├── overridden-treesitter.lua
│   │   ├── treesitter.lua
│   │   └── user.lua
│   └── polish.lua
├── neovim.yml
└── selene.toml

3 directories, 24 files
```
`lua/plugins`の下に各プラグインの設定ファイルを作成しています。  
`astrocore.lua`や`astrolsp.lua`などの元々`template`にあるファイルは、そのままにしています。  
これらのファイルは先頭に`if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE`という行があるので、この行を削除することで有効になります。  
ただ筆者は元々あるファイルはそのままにして、デフォルトで入ってるpluginやasrtonvimの設定を上書きする設定は、`overridden-*.lua`というファイルに書くようにして、元から入ってるものか、後から追加で入れたものか分かるようにしました。  
なおデフォルトで入っているpluginは、ドキュメントの[Default Plugins](https://docs.astronvim.com/reference/default_plugins/)に載っています。

## 移行のポイント
設定を移行する際にうまく動かなかったり、記述場所が変わっていたりするポイントをいくつか挙げておきます。

### rebelot/heirline.nvim
- `local status = require("astronvim.utils.status")` の部分が`local status = require("astroui.status")`になる  
  [Migration Guide](https://docs.astronvim.com/configuration/v4_migration/)にも書かれていますが、`astronvim.utils.status`が`astroui.status`に変わっています。

### toggleterm.nvim
v3では`F7`でterminalを開く際にデフォルトで、`float`で開くようになっていました。  
v4で設定を変えずに`F7`でterminalを開くと、`horizontal`で開くようになっていました。
`<Leader>tf`で実行すれば`float`で開いて、最後に使用したdirectionがキャッシュされているので、以降は`F7`でも`float`で開くようになりますが、別プロセスで実行したnvimには反映されないので、やはり設定を変える必要があります。  
筆者は`float`で開くのに慣れきっているので、`F7`で`float`で開くようにしておきたいです。  
設定ファイルでデフォルトのdirectionを変更できるので、`lua/plugins/overridden-toggleterm.lua`に以下を設定しています。
```lua
return {
  {
    "akinsho/toggleterm.nvim",
    opts = {
      direction = "float",
    },
  },
}
```

### markdown-preview.nvim
筆者はmarkdownのプレビューには`markdown-preview.nvim`を使っています。  
こちらは設定そのものは変更していませんが、pluginのインストールの際に以下のエラーが出てビルドに失敗しました。  
- `Vim:E117: Unknown function: mkdp#util#install`

幸いにも、[Issue](https://github.com/iamcco/markdown-preview.nvim/issues/690#issuecomment-2425301834)に解決方法が書かれていました。  
`lua/plugins/markdown-preview.lua`に以下を追加します。
```lua
return {
  {
    "iamcco/markdown-preview.nvim",
    cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" },
    ft = { "markdown" },
    build = function()
      vim.fn['mkdp#util#install']()
    end,
  },
}
```
その後nvimを再起動して、
```vim
:Lazy load markdown-preview.nvim
```
の後に
```vim
:Lazy build markdown-preview.nvim
```
を実行すると、ビルドが成功しました。

### LSP
各言語のLSPの設定は、[astrocommunity](https://github.com/AstroNvim/astrocommunity)の設定ファイルを利用するのが楽です。  
主要な言語はほぼ対応しているので、`lua/community.lua`に設定を追加していくだけでOKです。
言語系のpackは、https://github.com/AstroNvim/astrocommunity/tree/main/lua/astrocommunity/pack にあります。  
筆者の`lua/community.lua`は以下のようになっています。なおこのファイルは`template`に元からあるファイルなので、一行目にある`if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE`を削除して有効にしています。
```lua
-- AstroCommunity: import any community modules here
-- We import this file in `lazy_setup.lua` before the `plugins/` folder.
-- This guarantees that the specs are processed before any user plugins.

---@type LazySpec
return {
  "AstroNvim/astrocommunity",
  { import = "astrocommunity.pack.lua" },
  -- import/override with your plugins folder
  { import = "astrocommunity.pack.go" },
  { import = "astrocommunity.pack.html-css" },
  { import = "astrocommunity.pack.java" },
  { import = "astrocommunity.pack.json" },
  { import = "astrocommunity.pack.ps1" },
  { import = "astrocommunity.pack.python" },
  { import = "astrocommunity.pack.sql" },
  { import = "astrocommunity.pack.terraform" },
  { import = "astrocommunity.pack.yaml" },
  { import = "astrocommunity.pack.markdown" },
}
```
LSPの設定に関しては、[Advanced LSP Setup](https://docs.astronvim.com/recipes/advanced_lsp/#lsp-specific-plugins)のページに詳しく書かれています。  
筆者は特にしていませんが、`astrocommunity.pack`で入れたLSPの設定も、`lua/plugins/`配下に設定ファイルを作成して、一部設定を上書きする。ということもできるはずです。  

#### ファイル保存時の自動フォーマット
`lua/plugins/overridden-lsp.lua`に以下の設定を入れています。  
markdown保存時に空行による改行を入れるフォーマットが邪魔だったので、markdownは除外しています。
```lua
return {
  {
    "AstroNvim/astrolsp",
    opts = {
      formatting = {
        -- control auto formatting on save
        format_on_save = {
          enabled = true, -- enable or disable format on save globally
          allow_filetypes = { -- enable format on save for specified filetypes only
            "go",
          },
          ignore_filetypes = {
            "markdown",
          },
        },
      },
    },
  },
}
```

### core設定とauto commands
`vim.opt`や`autocmds`の設定は、`lua/plugins/overridden-core.lua`に書いています。  
筆者は相対行番号を無効にしたり、Vimを開いた際にNeotreeも開くようにしています。  
（relativenumberって需要あるのかな？
```lua
return {
  {
    "AstroNvim/astrocore",
    ---@type AstroCoreOpts
    opts = {
      -- vim options can be configured here
      options = {
        opt = { -- vim.opt.<key>
          relativenumber = false, -- sets vim.opt.relativenumber
        },
      },
      autocmds = {
        terminal_settings = {
          {
            event = "VimEnter",
            callback = function()
              vim.cmd "Neotree toggle"
            end,
          },
        },
      },
    },
  },
}
```
設定によっては、`lua/polish.lua`に書いたほうが良いのもあるかもしれませんが、筆者は`lua/polish.lua`は使っていません。

# まとめ
AstroNvim v4にアップデートする際のMigration手順について纏めてみました。  
最初はあまりの変わりように戸惑いましたが、Migration Guideを読みながら、User Configurationの移行方法を調べていくことで、なんとか設定を移行することができました。  
ただ慣れてみると、v4の設定の書き方はv3よりもシンプルで、設定の追加や変更もしやすくなっているように感じます。  
そしてなにより[astrocommunity](https://github.com/AstroNvim/astrocommunity)がとても便利なことに気づきました。  
筆者はしばらくはAstroNvimを使い続けようかと思います。