Neovim ニュース #11 - クリスマス号

2021年7月

本当の0.5は、開発を通して私たちが築いた友情でした

待望のNeovim v0.5.0のリリースが、ついに2021年7月2日に実現しました。皆が望んでいたよりも時間がかかりましたが、待つだけの価値がありました。4000件以上のコミットがあり、リリースツールの一部が壊れてしまうほどの大規模なリリースです。そのため、このリリースノートでは、開発中に加えられた多くの変更点すべてに触れることはできず、最もユーザーに見える改善点に焦点を当てます。その中でも最大のものは以下のとおりです。

  1. 第一級スクリプト言語および設定言語としてのLua
  2. 言語サーバープロトコル (LSP)
  3. Tree-sitter (早期アクセス)

Luaがあらゆる場所に!

Neovim 0.5は、プラグイン開発とユーザー設定の両方において、LuaをNeovimの第一級スクリプト言語にする上で大きく前進しました。

Luaは、組み込み用に設計された小型のスクリプト言語であり、ゲーム開発などでよく使用されています。さらに、Neovimが利用可能なプラットフォームでビルドされているジャストインタイムコンパイラ(LuaJIT)があり、関連するタスクで優れたパフォーマンスを提供できます。本質的に、Luaが他の言語よりも選ばれた理由は以下のとおりです。

  1. 小型 - 組み込みに最適 (リモートプラグインホストとは対照的)
  2. 高速 - LuaJITはVimscript(およびJITされていないLua)よりも桁違いに高速になる可能性がある
  3. シンプル - スクリプト用に作られた、小さくても表現力豊かな構文 (Lua 5.1)。Neovim自体は、APIを介して内部関数を公開することにより、「標準ライブラリ」を提供します。

この選択の詳細については、Justin M KeyesのVim Conf 2019でのプレゼンテーションとTJ DeVriesのVimconf.liveでのプレゼンテーションをご覧ください。

これがプラグイン作成者とユーザーにとって何を意味するのかを見てみましょう。

Luaプラグイン

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プラグインの少数の、代表的ではないリストを以下に示します。

  • Plenary - Neovimプラグインを開発するための便利なユーティリティのライブラリ (いくつかは後でコアに統合される予定です)。
  • Packer - プラグインの依存関係、遅延読み込み、luarocksのインストールをサポートするパッケージマネージャー。
  • Telescope - リストに対する高度に拡張可能なファジーファインダー。
  • Gitsigns - gitリポジトリ内のファイルの変更を表示および操作するためのプラグイン (非同期)。
  • Nvim-compe - Neovimの組み込みLSPクライアントを含む、さまざまなソースの自動補完フレームワーク。
  • Nvim-dap - コードのステップスルーデバッグのためのデバッグアダプタープロトコル実装。
  • Colorizer - 外部依存関係のない、Neovimの高性能カラーハイライター。
  • Formatter - 現在のバッファーまたは範囲で外部フォーマットツールを非同期に実行するためのプラグイン。
  • Hop.nvim - バッファーを乱す必要のない、EasyMotionのような移動プラグイン。
  • Neogit - MagitのようなGitインターフェース。

Neovimプラグインのより包括的なリストは、ユーザーが貢献したAwesome Neovimコレクションにあります。

これらのプラグインのすべてが実際にLuaで書かれているわけではありません。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)

言語サーバープロトコル (LSP) は、コードエディターと言語サーバー間の通信のためのオープンなJSON-RPCベースのプロトコルです。言語サーバーは、次のようなプログラミング言語固有の機能を提供します。

  • 補完
  • ホバー/ツールチップ
  • 定義へ移動
  • 参照の表示/移動
  • メソッドシグネチャの表示
  • 名前変更
  • コードアクション (自動フォーマット、インポートの整理など)

など

これらの機能を、エディターに依存しないが言語に固有のサーバーと、言語に依存しないがエディターに固有のクライアントに分割するという考え方です。これらは、RPCを介して言語サーバープロトコルを介して通信します。(すべてのサーバーがすべての機能を実装しているわけではなく、応答の品質は大きく異なる場合があることに注意してください。VS Codeの「リファレンス実装」では、LSP自体ではカバーされていない非標準の機能が追加されることがよくあります。)

Neovim 0.5は、(主に) Luaで記述されたLSPクライアントを提供しており、これらの機能にアクセスするための高度に設定可能で拡張可能な方法を提供します。CoC.nvimのような、より機能豊富で「すぐに使える」プラグインと競合することを目的としたものではなく、(合理的なデフォルトで使用できる状態を維持しながら)好みに合わせて調整できるようにすることを目的としています。概要については、TJ DeVriesのVimconf.liveプレゼンテーションと彼の短いビデオをご覧ください。

多くの言語サーバーでは、Nvim-lspconfigが既に必要な設定を提供しており、すべてを簡単に設定できます。あるいは、JavaScalaなど、より統合された設定を提供する特定のLSPプラグインを持つ言語もあります。

LSPの詳細とNeovimでの使用方法については、Nvim-lspconfig (Wikiを含む) にアクセスし、:h lspを読んでください。

0.5.xの開発サイクルでは、セマンティックハイライトを含む、最新のLSP仕様 (執筆時点ではバージョン3.16) の改善された設定オプションとより良いカバレッジを提供するために、LSPに関するさらなる作業が期待されます。

Tree-sitter

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 - ハイライト、折りたたみ、増分選択。
  • Playground - 解析されたツリーを簡単に表示し、それに対してクエリを実行するためのユーティリティ関数。
  • Nvim-treesitter-textobjects - vimスタイルのモーションと演算子のためのより良いテキストオブジェクト。
  • Nvim-refactor - 定義のハイライト、ナビゲーション、スマートな名前変更。
  • Architext - 構造化テキスト編集 (つまり、構文を認識した検索と置換)。

これらの機能の使い方に関する詳細は、Nvim-treesitterのREADME、またはThomas Vigouroux氏のVimconf.liveでのプレゼンテーションをご覧ください。

LSPとtree-sitterの違いは何ですか?

これはよくある質問です。特に、LSPバージョン3.16以降では「セマンティックハイライト」が提供されているためです。簡単に言うと、tree-sitterは単一のファイルに対して動作し、ファイルを構文ツリーに解析することで、さまざまな拡張コードナビゲーションおよび操作機能をサポートします。一方、言語サーバーは複数のファイルとプロジェクトライブラリにわたって動作し、各ファイルの構文ツリーを解析するために、サーバーに依存したさまざまな方法を使用します。(もちろん、tree-sitterはこの目的のための選択肢の1つであり、実際には、bash-language-serverwasm-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()を参照してください。

Vimパッチ

このリリースの4000を超えるコミットのうち、約1000はVimから移植されたパッチとランタイムアップデートでした。そのほぼすべてが、素晴らしい@janlazo氏による、または氏の助けを借りて行われたものです。特に、ランタイムファイル(構文ファイル、ドキュメントなど)は、2021年5月までのVimと完全に同期されており、それ以降の多くの変更も既に含まれています。

コミュニティ

このニュースレターのモットーに沿って、最も顕著なプラスの変化の1つは、コミュニティの成長と、コミュニティと対話するための新しい方法の登場でした。

Discourse

以前は、サポートリクエストとディスカッションはReddit、Gitter、GitHub Discussionsに分散しており、一時的であるか、検索が困難でした。 désormais新しいNeovim Discourseに統合されました。これは、優れたWebインターフェースに加えて、メーリングリストとRSS機能を備えた、無料でオープンソースのフォーラムプラットフォームです。Neovim Discourseは公式のコアプロジェクトであり、コアチームメンバーによってモデレートされています。

Matrix

Neovimの公式チャットルームはGitterにあります。GitterがMatrix(連合チャットプロトコル)に買収された後、このルームには désormaisMatrixからもアクセスできます。また、IRCネットワークLibera.chatにもブリッジされています。ユーザー数の増加に伴い、 désormaisneovimの開発とその周辺GUI、および雑談のための、より具体的なルームが追加されています。

(上記のリンクは、WebベースのMatrixクライアントであるElementを介してアクセスするルームへのリンクです。他の多くのMatrixクライアントからもアクセスできます。)

Vimconf.live

世界的なCOVID-19パンデミックのため、VimConf 2020は残念ながら中止せざるを得ませんでした。代わりに、16人の講演者と12か国から1000人以上の登録参加者を集めて、バーチャルVimconf.liveカンファレンスが開催されました。見逃した方は、YouTubeプレイリストで講演を視聴できます。

Twitch

パンデミックのもう1つの影響は、Twitchでのオープンソース開発のライブストリーミングへの関心の高まりでした。Vimconf.liveの講演者の多くはアクティブなストリーマーです。特に、TJ DeVries氏は、Neovimでの作業を「オープンオープンソース」として定期的にストリーミングしており、Neovim 0.5のリリースは彼のチャンネルでライブストリーミングされました。(**更新:**リリースストリームの編集済みプレイリストが désormaisYouTubeにあります。)

Neovimの開発

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の実現に貢献してくれたプロジェクト関係者全員に感謝します。貢献者、スポンサー、バグ報告者、サポーターなど、すべての方々です。完全なクレジットの代わりに、この手紙に記載されている機能について感謝できる人々を以下に示します。

  • LSPクライアントについては、@tjdevries氏、@h-michael氏、@norcalli氏、@mjlbach氏に感謝します。
  • tree-sitterの統合については、@vigoux氏、@bfredl氏、@theHamsta氏、およびnvim-treesitterチームに感謝します。
  • Vimからのパッチとランタイムアップデートの移植という、精力的な(そしてしばしば感謝されない)作業については、@janlazo氏に感謝します。
  • そして最後に、デコレーションAPI、フローティングウィンドウ、Cコードウィザードリーのさまざまな偉業、そして:smileを真剣に受け止めてくれたことに対して、@bfredl氏に感謝します。

最後に、基礎的な作業とビジョンを提供してくれた@justinmk氏と@brammool氏に感謝します。*vimコミュニティは共に強くなります!

ニュース

その他のアップデートは、ニュースアーカイブをご覧ください。RSSフィードもあります。

Neovimとは何ですか?

Neovimは、拡張性使いやすさのために設計されたVimベースのテキストエディターであり、新しいアプリケーションと貢献を促進します。

ディスカッション

チームとチャットするには、#neovim:matrix.orgまたはirc.libera.chatの#neovimにアクセスしてください。