ニュースレター #6 - Ship it!

2015年12月

Vimを改良し、新機能を追加して、モダンで洗練されたインターフェースに包み込むことを目指すプロジェクト、Neovimの6回目のニュースレターへようこそ。

はじめに

皆さん、こんにちは。@tarrudaです。今回のニュースレターでは、Neovimコミュニティの皆さんに直接お話しします。@jdavisが以前作成したように、構造化された内容にするよう努めます。始めましょう!

一般ニュース

0.1 リリース

Neovimが最初の公開リリース版を迎えました!

数ヶ月前、@justinmk0.1マイルストーンを作成しました。これは、より緊急性の高いタスクに集中するのに大いに役立ち、最初のリリースにつながりました。0.1にはまだ含まれていない多くの機能を計画していましたが、それらは今後のマイルストーンに延期することにしました。このニュースレター以降、マイルストーンはより頻繁になります。

これは、Neovimが今後取るべき道筋を示しています。永遠にかかるような大規模なリリースの準備をする代わりに、小さく、頻繁で、より安定したリリースに焦点を当てます。

0.1リリースは基本的に、最低限の安定性レベルを持つNeovimをコンパイルしたいユーザーのためのタグです。しかし、今後のリリースには、プリコンパイルされたバイナリやインストーラ(Windowsが正式にサポートされた場合)が含まれる可能性もあります。

Neovim 0.1.0と0.1.1は既にリリースページで利用可能で、Homebrew/LinuxbrewArch Linuxでも利用できます。Neovimをインストールするその他の方法については、Neovim Wikiのインストールページを参照してください(ただし、執筆時点では、これらのほとんどが0.1.xリリースではなく、最新の開発版Neovimをインストールします)。

gitから手動でコンパイルすることを好む(または必要とする)人のために、ビルド手順は通常どおり機能します。

Bountysource saltキャンペーン

まだ知らない人のために、Bountysourceはオープンソースプロジェクトが持続可能なクラウドファンディングを得ることができる新しいプラットフォームを立ち上げました。このプラットフォームは“salt”と呼ばれ、Neovimは最初にそれを利用したプロジェクトの1つでした。

最初のキャンペーンは大成功を収め、約3万5000ドルを集めました。これにより、約6ヶ月間Neovimにフルタイムで取り組むことができました。プロジェクトに非常に熱心で、その数ヶ月で全ての目標を達成することができなかったため、個人的および職業的な生活に支障をきたすほど、Neovimにかなりの時間を費やし続けました。2月頃、これまでのペースでは続けることができないことに気づきました。その頃、@rappoがsaltプラットフォームのベータ版をテストする機会を提供してくれ、Neovimでの作業を続ける方法としてそれを利用することにしました。

前身と同様に、saltキャンペーンは大成功を収め、過去8ヶ月間、Neovimへの貢献を(健康的な方法で)続けることができました。ありがとうございます!

ソースからのNeovimのビルド

ソースからNeovimをビルドしてインストールするのがいかに簡単かについて、私たちは言及したでしょうか?多くの依存関係がありますが、ビルドシステムはシステムを混乱させることなく、自動的にすべてをダウンロードしてビルドします。正確な手順については、Neovim Wikiのインストールページをご覧ください。

開発ニュース

XDGサポート

Neovimは現在、XDGディレクトリ仕様に準拠しています。これはプロジェクト開始時に提案されたものでしたが、数ヶ月前に@YamakakyからPRが送られ、@jckによって後続のPRで、そして再び@ZyX-Iによって最終的なPRで置き換えられ、最近マージされました。

XDGディレクトリ仕様に準拠することにより、Neovimは.nvimrc~/.nvim以下のユーザー設定ファイルなどを~/.configディレクトリで検索するようになりました。これは$XDG_CONFIG_HOME環境変数で上書きできます。この仕様では、キャッシュファイルは別のディレクトリ(~/.local/share)に保存する必要があるとされており、viminfo(現在はShaDa)やバックアップ/スワップファイルなどが格納される場所です。

この変更により、仕様に準拠した他のプログラムと共に保存されるため、ユーザーは設定のバックアップと管理が容易になり、ホームディレクトリもよりクリーンになります。

既存の設定を移行する方法に関する手順は、:h nvim-from-vimにあります。

ShaDa(共有データ)

@ZyX-I主要なShaDa PRがマージされました。これにより、レジスタの内容、コマンド履歴、変数、ジャンプリストなどを保存するためのviminfoファイルが完全に置き換えられました。

viminfoの既知の問題の1つは、同時に実行されている2つのVimインスタンスがお互いのデータを上書きしてしまうことです。ShaDaは@ZyX-Iによって作成された新しいストレージ形式であり、この問題を解決するだけでなく、Neovimに多くの機能強化をもたらします。

  • ファイル形式は
    • 前方互換性(新しいNeovimのShaDaファイルは古いバージョンで使用可能)と後方互換性(古いバージョンのShaDaファイルは問題なく新しいバージョンで使用可能)をサポートし、ShaDaファイルを将来にわたって使用できるようにします。
    • 階層的なデータ構造をサポートしており、Neovimにあらゆる種類の情報をシリアル化する柔軟性を提供します。
    • msgpackをベースとし、ドキュメントで明示的に標準化されているため、任意の操作を実行するプラグイン/ツールを作成できます。
    • ファイル内のデータ部分間には状態が保存されていないことを前提としているため、そのようなツールは簡素化され、「異なるNeovimインスタンスの2つのShaDaファイルを連結するには、cat 1.shada 2.shada > joined.shadaを使用するだけで、Neovimは読み込み時に適切に処理します」などの操作が可能です。
    • 展開されたパス(/homeではなく~/)を使用します。
  • ShaDaファイルの書き込みまたは読み込み時に、複数のNeovimインスタンスがデータを正しくマージできるようにする埋め込みタイムスタンプ。
  • 前方互換性には、新しいNeovimバージョンによって生成されたShaDaファイルにある追加情報を保持するNeovimコアコードが含まれています(追加情報がある場合)。

PRは非常に大きかったですが、@ZyX-Iは優れたテストカバレッジを追加することに配慮しました。@ZyX-I、素晴らしい仕事です!

イベントループ層のラップ

Neovimが使用しているイベントループライブラリがlibuvであることは秘密ではありません。これは、エディタとの非同期通信(ユーザーによって開始されない)を必要とする機能を容易に実装できるようにするものです。残念ながら、Neovimのコードの現在の構成方法により、libuvの統合は簡単な作業ではありませんでした。

基本的な考え方は、Neovimがユーザー入力のポーリング時に任意のイベントを受信することですが、これらのイベントは、Neovimが任意の操作を処理できない状態にある可能性があるため、すぐに処理できません。そのため、Neovimがユーザー入力の確認中にイベントを受信した場合、そのイベントは後で処理するためにキューに置かれます。

一例として、次のシナリオを示します。Neovimは、正規表現エンジンが実行されている間にユーザーがctrl+cを入力したかどうかを確認しますが、受信したイベントをすぐに処理することはできません。なぜなら、正規表現エンジンを再び呼び出すvimscriptを実行したい可能性があり、エンジンはグローバル変数に大きく依存しているため再入可能ではないからです。そのため、安全なときにイベントを延期する必要があります。そして、イベントを処理する安全な時点を判断すること自体が別の問題です。

libuvとの統合のもう1つの複雑さは、Neovimが特定のソースからのイベントのみを処理しなければならない場合があることです。たとえば、Neovimがmsgpack-rpc呼び出しを送信している間は、次のソースからのイベントのみを処理する必要があります。

  • ユーザー(例:呼び出しを中断するctrl+c)
  • msgpack-rpc呼び出しを受信したファイルディスクリプタ(子プロセスのstdio、ソケットなど)

このような選択的なイベント処理を可能にするために、Neovimは互いに統合された複数のキューを維持する必要があり、これを行うためのロジックは非常に反復的です。私の最新のPRの1つでは、いくつかのlibuv「クラス」が、これらのキューの管理をはるかに容易にする方法でラップされました。

jemalloc

高性能な汎用メモリアロケータであるjemallocがデフォルトで使用されるようになりました。Neovimは内部ループで動的キュー(上記参照)を多用するため、malloc(3)はVimよりもはるかに多く呼び出されるため、プラットフォーム間で一貫したパフォーマンスを持つ高速な実装を使用することが重要です。

最近のPRで、@fmoralescは、ビルドシステムで使用されるjemallocのバージョンをjemalloc 4.0をターゲットとするように変更しました。これにより、さらにパフォーマンスが向上し、より多くのプラットフォームがサポートされるようになりました。

高速なTravisビルド

Neovimのビルドを実行するために、Travisコンテナベースインフラストラクチャを使用するようになりました。これにより、CIビルドがすぐに開始されるようになりました。これは実装され、ビルドインフラストラクチャに多くの改善を加え、開発者はPRの提出時により迅速なフィードバックを受け取ることができるようになりました。

Quickbuild

@jszakmeisterは、自身のインフラストラクチャでquickbuildサーバーを実行しています。これにより、Neovim PRを二重チェックするバックアップCIが提供され、travisではカバーされていないFreeBSDでもテストを実行します。Neovimの堅牢性を向上させてくれてありがとうございます@jszakmeister

サードパーティ開発

Neomake

ご存知でしたか?syntastic の代替として、Neovimの非同期機能を利用するプラグインがあることを。Neomake はNeovimにおける構文チェックのための最高のプラグインです。syntastic と同様に拡張可能であり、ジョブ制御 を使用することで、ユーザーインターフェースをブロックすることなくバックグラウンドでチェックを実行できます。これは、チェックに時間がかかるコンパイル言語(TypeScript、Java、.NETなど)にとって非常に便利です。

syntastic からの移行も非常に簡単です。@benekastahさん、素晴らしい仕事ですね!

FZF

fzf はコマンドラインのファジーファインダーです。作者の@junegunnさん(vim-plugの開発者でもあります)のおかげで、Neovimの組み込みターミナルエミュレータを利用したプラグインを通じて優れたNeovimサポートを提供しています。組み込みターミナルエミュレータ

FZFはctrlpのようなプラグインにとって優れた代替手段です。非常に高速であり、別のプロセスで実行されるという利点があります。これにより、マルチコアシステムを活用でき、Neovimのユーザーインターフェースをブロックしません。その速度と応答性を確認するには、Linuxソースツリーでファイル検索を実行してみてください。:FZF!

fzfに加えて、ユーザーはfzf.vimのインストールも推奨されます。これは、fzf上に構築された非常に便利なコマンドをいくつか公開するプラグインです。

Deoplete

@Shougoさんはdeoplete.nvimを作成しました。これは、Neovimの非同期機能を利用してユーザーインターフェースをブロックすることなく補完を計算できるリモートプラグインとして記述された非同期補完エンジンです。Neovimがneocompleteに必要なLuaインターフェースをサポートしていないため、彼はゼロから新しいプラグインを作成することにしました。@ShougoさんはVimプラグイン界の巨匠です。彼の過去の作品の一部を以下に示します。

コミュニティはdeoplete.nvimから素晴らしいものを期待できます!

(最近@Shougoさんは、deopleteの背後にあるアイデアを説明するスライドを投稿しました。)

Neoterm

Neotermは、ターミナルウィンドウでテストを簡単に実行するためのプラグインです。@kassioさんによって記述されており、以下のテストライブラリをサポートしています。

  • rspec
  • cucumber
  • minitest
  • go-lang test
  • nose

非常に役立ちます@kassioさん!

ニュース

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

Neovimとは?

NeovimはVimベースのテキストエディタで、拡張性使いやすさを重視して設計されており、新しいアプリケーションやコントリビューションを促進しています。

ディスカッション

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