本当の0.5は、開発を通して私たちが築いた友情でした
待望のNeovim v0.5.0のリリースが、ついに2021年7月2日に実現しました。皆が望んでいたよりも時間がかかりましたが、待つだけの価値がありました。4000件以上のコミットがあり、リリースツールの一部が壊れてしまうほどの大規模なリリースです。そのため、このリリースノートでは、開発中に加えられた多くの変更点すべてに触れることはできず、最もユーザーに見える改善点に焦点を当てます。その中でも最大のものは以下のとおりです。
Neovim 0.5は、プラグイン開発とユーザー設定の両方において、LuaをNeovimの第一級スクリプト言語にする上で大きく前進しました。
Luaは、組み込み用に設計された小型のスクリプト言語であり、ゲーム開発などでよく使用されています。さらに、Neovimが利用可能なプラットフォームでビルドされているジャストインタイムコンパイラ(LuaJIT)があり、関連するタスクで優れたパフォーマンスを提供できます。本質的に、Luaが他の言語よりも選ばれた理由は以下のとおりです。
この選択の詳細については、Justin M KeyesのVim Conf 2019でのプレゼンテーションとTJ DeVriesのVimconf.liveでのプレゼンテーションをご覧ください。
これがプラグイン作成者とユーザーにとって何を意味するのかを見てみましょう。
Neovimは、vim.api.nvim_open_win()
などを通じて、LuaにネイティブにAPIを公開しています。また、vim.cmd("echo 'foo'")
やvim.g.syntax_on
などを通じて、vimscript (ex) コマンドと変数にアクセスする方法も提供しています。これにより、ループなどのコアプログラミング言語タスクでLua(JIT)のパフォーマンスを活用しながら、Vimscriptで記述されたプラグインと同じ機能を持つプラグインを記述できます。また、Lua独自のluarocks
プラグインエコシステムを利用することも可能です。
それに対応して、0.5の開発サイクルを通して、人気のあるVimscriptプラグインの書き直しからVimscriptでは不可能だった全く新しいプラグインまで、Luaプラグインの数が爆発的に増加しました。多くの場合、(neo)vimプラグイン開発に全く慣れておらず、そのためにVimscriptを学ぶことに抵抗があった貢献者からのものです。長い開発サイクルのプラスの副作用として、これらの多くは0.5リリースの時点で既にフル機能を備え、安定しています!
Luaプラグインの少数の、代表的ではないリストを以下に示します。
Neovimプラグインのより包括的なリストは、ユーザーが貢献したAwesome Neovimコレクションにあります。
これらのプラグインのすべてが実際にLuaで書かれているわけではありません。Luaにコンパイルされる他の多くの言語(いくつかは型付き)があります。例えば、
ユーザー設定をLuaで記述することも可能です。init.lua
が存在する場合、init.vim
の*代わりに*読み込まれます(これらは共存できず、設定ディレクトリに両方があるとエラーが発生します)。また、ランタイムディレクトリ(plugin/
、colorscheme/
、after/
など)にある.lua
ファイルは、Vimscriptファイルに加えて(後に)ソースされます。これは完全にオプションであり、Neovim 0.5で導入された新しい機能を楽しむために必要なわけではありません。さらに、すべてのVimscript設定オプションに完全にネイティブなLuaの同等物がまだあるわけではありません。ネイティブAPIを拡張してこれらもカバーすることは、Neovim 0.6の目標の一部です。
Neovimのスクリプトと設定にLuaを使用するための包括的で最新のガイドについては、NeovimでLuaを使い始めるを参照してください。init.lua
を使用したLua設定の良いモデルは、Defaults.nvimです。
言語サーバープロトコル (LSP) は、コードエディターと言語サーバー間の通信のためのオープンなJSON-RPCベースのプロトコルです。言語サーバーは、次のようなプログラミング言語固有の機能を提供します。
など
これらの機能を、エディターに依存しないが言語に固有のサーバーと、言語に依存しないがエディターに固有のクライアントに分割するという考え方です。これらは、RPCを介して言語サーバープロトコルを介して通信します。(すべてのサーバーがすべての機能を実装しているわけではなく、応答の品質は大きく異なる場合があることに注意してください。VS Codeの「リファレンス実装」では、LSP自体ではカバーされていない非標準の機能が追加されることがよくあります。)
Neovim 0.5は、(主に) Luaで記述されたLSPクライアントを提供しており、これらの機能にアクセスするための高度に設定可能で拡張可能な方法を提供します。CoC.nvimのような、より機能豊富で「すぐに使える」プラグインと競合することを目的としたものではなく、(合理的なデフォルトで使用できる状態を維持しながら)好みに合わせて調整できるようにすることを目的としています。概要については、TJ DeVriesのVimconf.liveプレゼンテーションと彼の短いビデオをご覧ください。
多くの言語サーバーでは、Nvim-lspconfigが既に必要な設定を提供しており、すべてを簡単に設定できます。あるいは、JavaやScalaなど、より統合された設定を提供する特定のLSPプラグインを持つ言語もあります。
LSPの詳細とNeovimでの使用方法については、Nvim-lspconfig (Wikiを含む) にアクセスし、:h lsp
を読んでください。
0.5.xの開発サイクルでは、セマンティックハイライトを含む、最新のLSP仕様 (執筆時点ではバージョン3.16) の改善された設定オプションとより良いカバレッジを提供するために、LSPに関するさらなる作業が期待されます。
Neovim 0.5は、tree-sitterの**実験的**サポートを追加しました。tree-sitterは、コードを構文ツリーに増分的かつエラー耐性のある方法で解析するライブラリです。これは、編集後のコードの再解析が非常に高速であり、タイプミスなどによる解析エラーが局所化され、それ以降の解析が中断されないことを意味します。このツリーは、コードに関する構文情報を取得するために効率的にクエリできます。これにより、以下のような改善または高速化が可能になります。
など。 Tree-sitterを使用すると、ファイルの一部に異なる言語のコードが含まれている場合に、それらの部分を異なる方法で強調表示することも容易になります。 tree-sitterの詳細については、Tree-sitter - プログラミングツールのための新しい解析システム - Max Brunsfieldをご覧ください。
目標は、現在のvim正規表現ベースの構文をtree-sitterに置き換えることです。構文ハイライトの改善と高速化のためだけでなく、構造化テキスト編集の新しい、そして改善された方法のためでもあります。ただし、0.5でのtree-sitterのサポートは、まだ「アーリーアクセス」と見なされるべきです。テストして何が可能かを確認するには十分に機能しますが、Neovimのtree-sitterが安定していると宣言される前に対処する必要がある、いくつかの深刻なバグとパフォーマンスの低下があるため、実稼働環境での使用に依存するべきではありません。また、言語のtree-sitterベースのハイライトを有効にすると、現在、このファイルタイプの内部正規表現ベースの構文エンジンが*完全に*無効になり、それに依存する他の機能が壊れる可能性があることにも注意してください。これらの問題の修正とAPIの改善は、0.6リリースに至るまでの開発サイクルの主要な焦点となります。
また、Neovim自体は、バンドルされたtree-sitterライブラリを使用して構文ツリーを生成およびクエリするための (Lua) APIのみを提供します。:h treesitter
を参照してください。上記のようなユーザー向け機能は、次のようなプラグインで実装されています。
これらの機能の使い方に関する詳細は、Nvim-treesitterのREADME、またはThomas Vigouroux氏のVimconf.liveでのプレゼンテーションをご覧ください。
これはよくある質問です。特に、LSPバージョン3.16以降では「セマンティックハイライト」が提供されているためです。簡単に言うと、tree-sitterは単一のファイルに対して動作し、ファイルを構文ツリーに解析することで、さまざまな拡張コードナビゲーションおよび操作機能をサポートします。一方、言語サーバーは複数のファイルとプロジェクトライブラリにわたって動作し、各ファイルの構文ツリーを解析するために、サーバーに依存したさまざまな方法を使用します。(もちろん、tree-sitterはこの目的のための選択肢の1つであり、実際には、bash-language-serverやwasm-language-serverなどで使用されています。)
特に、これは言語サーバーが別のファイルからの*セマンティック*情報を使用して、現在のファイルのツリーに注釈を付けることができることを意味します。たとえば、あるファイルでconst
として宣言された変数は、*別の*ファイルで使用されている場合、赤で強調表示できます。これは、tree-sitterが強調表示時に後者のファイルにのみアクセスできるため、実行できません。
詳細については、TJ DeVries氏のこのトピックに関するプレゼンテーションをご覧ください。
もちろん、これらは0.5での主要な変更点だけではありません。代表的な新機能の簡単な概要を以下に示します。
拡張マーク(周囲のテキストが編集されても移動する非表示のアンカーテキストマーカー)、仮想テキスト(画面上の任意の位置に描画できるようになったテキストオーバーレイ)、およびハイライト(nvim-treesitterによって heavily leveraged されている)の設定と対話を可能にする、改善されたデコレーションプロバイダーAPIがあります。
@sunjon氏による投稿からのこのモックアップは、このAPIで何が実現できるかを示しています。
フローティングウィンドウのAPIには、 désormais「z-index」(フローティングウィンドウのスタック方法を制御できる)と、境界線のサポートが含まれています。
Neovimには désormais、ヤンクされた領域を短時間ハイライトする組み込み関数(https://github.com/machakann/vim-highlightedyankと同様)があり、Luaから設定できます。これを使用するには、init.vim
に以下を追加します。
au TextYankPost * lua vim.highlight.on_yank {higroup="IncSearch", timeout=150, on_visual=true}
詳細な設定オプションについては、:h vim.highlight.on_yank()
を参照してください。
このリリースの4000を超えるコミットのうち、約1000はVimから移植されたパッチとランタイムアップデートでした。そのほぼすべてが、素晴らしい@janlazo氏による、または氏の助けを借りて行われたものです。特に、ランタイムファイル(構文ファイル、ドキュメントなど)は、2021年5月までのVimと完全に同期されており、それ以降の多くの変更も既に含まれています。
このニュースレターのモットーに沿って、最も顕著なプラスの変化の1つは、コミュニティの成長と、コミュニティと対話するための新しい方法の登場でした。
以前は、サポートリクエストとディスカッションはReddit、Gitter、GitHub Discussionsに分散しており、一時的であるか、検索が困難でした。 désormais新しいNeovim Discourseに統合されました。これは、優れたWebインターフェースに加えて、メーリングリストとRSS機能を備えた、無料でオープンソースのフォーラムプラットフォームです。Neovim Discourseは公式のコアプロジェクトであり、コアチームメンバーによってモデレートされています。
Neovimの公式チャットルームはGitterにあります。GitterがMatrix(連合チャットプロトコル)に買収された後、このルームには désormaisMatrixからもアクセスできます。また、IRCネットワークLibera.chatにもブリッジされています。ユーザー数の増加に伴い、 désormaisneovimの開発とその周辺、GUI、および雑談のための、より具体的なルームが追加されています。
(上記のリンクは、WebベースのMatrixクライアントであるElementを介してアクセスするルームへのリンクです。他の多くのMatrixクライアントからもアクセスできます。)
世界的なCOVID-19パンデミックのため、VimConf 2020は残念ながら中止せざるを得ませんでした。代わりに、16人の講演者と12か国から1000人以上の登録参加者を集めて、バーチャルVimconf.liveカンファレンスが開催されました。見逃した方は、YouTubeプレイリストで講演を視聴できます。
パンデミックのもう1つの影響は、Twitchでのオープンソース開発のライブストリーミングへの関心の高まりでした。Vimconf.liveの講演者の多くはアクティブなストリーマーです。特に、TJ DeVries氏は、Neovimでの作業を「オープンオープンソース」として定期的にストリーミングしており、Neovim 0.5のリリースは彼のチャンネルでライブストリーミングされました。(**更新:**リリースストリームの編集済みプレイリストが désormaisYouTubeにあります。)
Neovimの開発に aktiv な人の数も増加しました。0.4.4から0.5.0の間には、301人のユニークなコミット作成者がいました。0.3.8から0.4.4(同等の期間)の間は112人でした。
désormaisGithub SponsorsまたはOpenCollectiveを介してNeovimをスポンサーできます。(BountySourceは、利用規約に懸念される変更を導入し始めたため、もはや推奨されません。)
既に述べたように、0.5で導入されたヘッドライト機能のさらなる改善は、0.5.xリリースサイクルで行われます。
tree-sitterを、構文の強調表示(およびそれ以上)のための安定した高速な代替手段にすることは、0.6.0リリースの主要な目標です。これには、インライン折りたたみや仮想行と列の挿入(「アンチコンシール」)などを可能にするための、デコレーションAPIの基本的な作業が含まれます。
それ以外にも、注目すべき目標は、ファイル変更検出の改善と、リモートTUIインスタンスを許可することを目的とした、TUI(ターミナルUI)とNeovimコアのさらなる分離です。
最後に、より定期的で頻繁なリリース(少なくともパッチバージョン)を目指しています。これにより、しばらくの間「neovim 0.6はいつ?」というミームの必要性がなくなることを願っています。
Neovim 0.5の実現に貢献してくれたプロジェクト関係者全員に感謝します。貢献者、スポンサー、バグ報告者、サポーターなど、すべての方々です。完全なクレジットの代わりに、この手紙に記載されている機能について感謝できる人々を以下に示します。
:smile
を真剣に受け止めてくれたことに対して、@bfredl氏に感謝します。最後に、基礎的な作業とビジョンを提供してくれた@justinmk氏と@brammool氏に感謝します。*vimコミュニティは共に強くなります!