Neovim 0.12アップデートの個人的に嬉しいことまとめ

つい先日Neovim 0.11.7が出たばっかですが、Neovim 0.12がリリースされました。この記事ではその概要やアップデート手順、個人的なうれしいポイントを紹介します。

## アップデート手順

書くまでもないですが一応。

  • 一次情報に目を通す(次の項目でリンクをまとめました
  • 各パッケージマネージャーでアップデート
  • プラグインの設定アップデート

## Neovim 0.12リンクまとめ

公式関係のリンクをまとめておきます。

v0.11のときはニュースレターあったんですが今回は出てないようです。

## Breaking Changesはどうよ?

diagnostics系が多いようです。

### nvim-treesitterはmainブランチのみへ

Neovim v0.11が出たあたりで、nvim-treesitterはmasterブランチからmainブランチに移行されてます。

「masterブランチ版は互換性が無い」とREADMEに書いてあります。もしまだ未移行の方は移行しましょう。

移行にあたってはAtusyさんのブログが参考になります。
Neovim ≧ 0.11ユーザーのためのnvim-treesitter最新版利用ガイド(mainブランチ切り替え) | Atusy’s blog

#### nvim-treesitterがアーカイブ!?

このブログを書いている最中に、nvim-treesitterリポジトリがアーカイブされました
今後どうなるのかは検討もつかないので、とりあえずv0.12を使いたい人は mainブランチに移行して続報を待ちましょう

## deprecatedは?

deprecatedはそこそこあります。vim.lsp系がvim.lsp.〇〇.enableのように統一されたっぽいです。

あと0.11の時点ですでにvim.diagnostic.goto_prevが非推奨になっていたようなので、jumpに変えました(気づかなかった)。

vim.keymap.set("n", "[d", "<cmd>lua vim.diagnostic.goto_prev()<CR>", bufopts)
vim.keymap.set("n", "]d", "<cmd>lua vim.diagnostic.goto_next()<CR>", bufopts)
vim.keymap.set("n", "[d", "<cmd>lua vim.diagnostic.jump({count=-1, float=true})<CR>", bufopts)
vim.keymap.set("n", "]d", "<cmd>lua vim.diagnostic.jump({count=-1, float=true})<CR>", bufopts)

公式ドキュメント:Deprecated - Neovim docs

## デフォルトキーマップの追加

デフォルトのキーマップが増えました。

モードキー内容
Normalgrtvim.lsp.buf.type_definition()
Normalgrxvim.lsp.codelens.run()

lsp系はgr〇で統一する流れなんですかね(0.11でもそうだった)。

## treesitterで範囲の広げたり狭めたり

visualモードで選択中にanを押すとtreesitterに基づいて選択範囲が広がります。逆にinを押すと範囲が狭まります。

### 確認用コード

local function greet(name)
local message = "Hello, " .. name .. "!"
-- ^ ここにカーソル置いてviw an an an...
print(message)
return message
end

もし効かない場合は↓をチェックしてみてください(思いついたら随時追記します)。

  • 使用言語のパーサーが入っているか(上記はLuaの例で、ビルトインのはず)
  • プラグインに上書きされてないか

### mini.ai

nvim-mini/mini.aiユーザーは注意です!mini.aiのデフォルトはビルトインのv_anv_inを上書きします。
これを無効化してNeovimビルトインの方を使うには次のように設定すればOKです。

require("mini.ai").setup({
-- ...
mappings = {
-- 0.12の v_an / v_in を優先するため、mini.ai側は無効化
around_next = "",
inside_next = "",
around_last = "",
inside_last = "",
},
})

参考:treesitter-defaults for incremental selection don’t work… #2338 · nvim-mini/mini.nvim

## LSP関係

:lsp系のコマンドが追加されました。今まではlspconfig頼りでしたが0.12からはビルトインです。

  • :lsp enable [config_name]
  • :lsp disable [config_name]
  • :lsp restart [config_name]
  • :lsp stop [config_name]

公式ドキュメント:Lsp - Neovim docs

## プラグイン関係

ビルトインのプラグインマネージャーが実装されました。 vim.packという関数のようです。
mini.nvimの作者echasnovskiさんのブログが詳しいので、vim.pack使いたい人は見てみてください。

A Guide to vim.pack (Neovim built-in plugin manager) – Evgeni Chasnovski

※現段階では移行する理由が特に無いため、筆者はlazy.nvimを使っています。

### 新規プラグイン

プラグインとしてUndotreeが仲間入りです。編集履歴をツリー上で確認でき、過去の編集時点に戻せます。

undotreeの表示

次の手順で有効化&起動できます。

:packadd nvim.undotree
:Undotree

動画ではfoobarからundoしてfooに戻り、buzに編集しています。
この状態だと普通はundoすると編集が分岐しているbarには戻れず、fooにしか戻れません。
が、Undotreeだとbarのように 分岐先にも戻れる ので便利です。

しかもNeovim起動時にUndotreeを無効化していても、 有効化するよりも前のUndotreeも辿れます

## 再起動コマンド

:restartでNeovimを再起動できます。エディタを開きっぱなしにしている人にとってはいいかも?

ざっくりとした挙動は次のとおりです(参考::help :restart)。

  1. :qallを使ってNeovimが終了
  2. nvimコマンド実行時に指定した引数のまま起動
  3. UIの描画
  4. :restart [command]のようにコマンドを指定してたらコマンド実行

というわけで 開いてたバッファなどは閉じます が、起動時に指定してたファイルは開きます。

:help :restartにはmksessionと組み合わせてセッションを維持する方法やプラグインアップデートの例が書かれてます。

## ui2

メッセージ関係のUIを新しくするui2も使えるようになりました。
まだ実験的なようです。次のようにenableすれば適用されます。

require('vim._core.ui2').enable({})

※ドキュメントそのまま実行して引数が空にするとエラーになります。

Press ENTERとかが無くなったり、入力に合わせてコマンドラインにハイライトが効くようです。
筆者はnoice.nvimを使っているので正直旨味を味わえていません。そもそも実験的な段階ということで、いったん様子見です。


以上、Neovim 0.12のアップデート備忘録でした。Xの公式アカウントのポストによれば今年1.0になるらしいので楽しみです。
一方でnvim-treesitterはどうなるのか全然分からないので、要ウォッチです。