ニュースレター #7 - 夏のロードマップ

2016年11月

Neovim ニュースレターの配信です! 新機能のみに関心のある方は、楽しい部分新機能のセクションにスキップしてください。また、プロジェクト管理にも変更点がありますのでご確認ください。

Neovim とは?

毎分、新しいテキストエディタが誕生しています(出典:Hacker News)。「一般的なケース」に対応する無数のテキストエディタが存在します。

Neovim ユーザーは、別のVimライクなテキストエディタではなく、より良いVimを求めています。Vimのコアには、数十年にわたって蓄積された何千もの小さな決定が組み込まれており、それらの決定のほとんどは依然として関連性があり、新しいプロジェクトではまだ遭遇しておらず、消化して決定する微妙な問題を解決しています。

Neovimは、Vimをリファクタリングして、今後30年間のハッキングにも対応できるようにすることを目的としています。変更点と改善点については、:help vim-differencesを参照してください。

乗り換えるべき?

Neovimは、Vimコミュニティの長い歴史とユーザー習慣を非常に意図的に構築しています。つまり、VimからNeovimへの「切り替え」は単なる「アップグレード」です。Vimの新しいバージョンをインストールするようなものです。Vimしかないサーバーやワークステーションにログインしても、困ることはありません。Vimに関する記事を見つけた場合、:smileに関するものでない限り、Neovimにも適用される可能性が高いです。

そのため、Vimが好きならNeovimを試してみてください。Vimが大好きなら、こちらを試してみてください;)

ハッキング… または単なるエンジニアリング

Neovimの明確な目標の1つは、最初から

メンテナンスの簡素化と貢献の促進

私たちはハック可能なVimを求めています。つまり、実験と新機能の低コストな試行を可能にするコードベースとコミュニティです。

そして、その野望に向けた真の進歩の証拠があります。私たちは、非自明な「ロードマップ外」のパッチを成功裏に実行しました。これらの機能は、作成者にとって重要ですが、プロジェクトの最優先事項ではありません。

  • :tchdir はタブローカルの「作業ディレクトリ」を有効にします。
  • 'statusline' は無制限の整列セクションをサポートします(PR #4489
  • TextYankPost イベントにより、信頼性の高いヤンクリングの実装、外部サービスへのヤンクの送信、そして予期せぬアプリケーションへの送信が容易になります。
  • QuickFixLine は新しいハイライトグループです。
  • man.vim は、補完、ハイライトの改善などを提供します。

これらのパッチは、

  1. 既存の規約/設計に適合しているため
  2. 堅牢なテストカバレッジが含まれているため(高度なテストフレームワークとCIによって有効化)
  3. 他の貢献者による思慮深いレビューを受けているため

:help nvim-featuresで簡単に触れられています :)

:smileなしの楽しい部分?

新しいクライアントと革新的なアプリケーションがかつてないほど頻繁に登場しています。

  • NyaoVim は、よく設計されたモジュラーなElectron GUIです。
    • その<neovim-editor> Webコンポーネントは、VS Code、Atom、その他のElectronまたはnw.jsプロジェクトを含む独自のプロジェクトで使用できます!
  • ONI は、ElectronベースのNeovim IDEであり、多くのエキサイティングな可能性を示しています。NyaoVimのようにクールなロゴもあります :)
  • ユーザーは、Vim用の最初のノンブロッキング自動補完プラグインであるdeopleteを気に入っています。
  • @qvacuaは、nvimに目を向け、彼の有名なVimRプロジェクト(洗練されたmacOS用GUI)の新しいnvimベースのバックエンドを急速に進めています。macOS 10.11用のプリビルド.appバンドルは、リリースページにあります。
  • クロスプラットフォームのneovim-qt GUIは、ますます向上しています。gVimと同じ速さで、ちらつきが少なく、GTK/KDEに依存しません。
  • neovim.app は、macOS 10.9以降でHomebrewから利用できるmacOS Neovim GUIです。
  • nvim-hs は、HaskellでNeovimプラグインを作成できるようにするホストです。
  • Neovim Lispプラグインの作成にはcl-neovimをご覧ください。:Lispdoが含まれています!
  • nvr は、Vimの「クライアントサーバー」オプション--servername--remoteなどをサポートするようになりました。nvrは、:terminalバッファから親nvimインスタンスと通信するのに最適です。
  • Interoのユーザーはintero.nvimintero-neovimに喜んでいました。

Go、Julia、Perl、Java、R、Elixir、Clojureなどに対応したクライアントがあります。新しいプロジェクトが登場したら、関連プロジェクトのWikiページをご覧ください!

プロジェクト管理

明確さと一貫性によって貢献が生まれる。— @robertmeta

限定時間 Benevolent Dictator

7月、Thiago (@tarruda)は、個人的な理由でプロジェクトへの関与を減らしました。彼は将来、積極的に貢献を再開することを望んでいます。

一部の人々は、「BDFL」を指名することを求めています。@justinmkがその役割を担っていますが、あなたが望むのであれば:私たちは管理者の役割を文書化する手順を踏みました。そのため、将来はほとんどの貢献者から信頼されている人が引き継ぐことができます。

究極の目標は、タスクを可能な限り水平に分散し、「コミット権」を私たちが信頼するようになった人に与え続けることです。現在、14人のコア貢献者がいます。それを50人に拡大したいと考えています。プロジェクトを英雄的な努力に依存させるのではなく、Vimコミュニティの規約と礼儀作法の中で働く関心のある人々の流れを望んでいます。

資金調達

(進行中の)成功した資金調達キャンペーンにより、libmpack:terminal、主要なリファクタリングと改善(例:UIロジックのTUIからの分離)が実現しました。Thiagoがプロジェクトへの関与を減らしたため、資金は他の開発者にも利用可能になりました。

@ZyX-Iは、Neovimへの多作なコミッター(21 kLOC貢献)であり、Vim(13 kLOCif_pythonを含む)にも貢献しており、「リード開発者」、つまり資金を受け取る開発者の役割を引き受けることに同意しました。彼のNeovimでの作業には以下が含まれます。

  • ファーストクラスのXDGサポート、shada、ビルド時ジェネレーター、自動変更認識リンター、LuaからVimLへのトランスレーター
  • msgpackparse()os/fileio.c(バッファ付きI/O)などの重要な内部構造
  • 詳細なエラーメッセージを含む、Vim JSONサポートの完全な書き換え
  • 上記のすべてに対する包括的なテストカバレッジ

資金は常に1人に送られるわけではありません。Neovimに集中するために1か月以上を費やしたいコア貢献者であれば誰でも利用できます。

寄付

資金調達は毎月行われるため、(うまくいけば)摩擦の少ない決定になります。

  • 10ドル寄付するには、月額1ドルを誓約できます。
  • プロジェクトに腹が立ったら、誓約をキャンセルしてください。
  • (:smileがないにもかかわらず)プロジェクトに満足したら、誓約を継続してください!

API

Neovim APIは、プロジェクトを定義する技術的および「ソフト」な機能の1つです。PR #5535で、クライアントを壊すことなくAPIを成長させるための戦略を策定しました。

  • クライアント間の簡単な比較を可能にし、APIバージョンがNeovimバージョンとは別であることを強調するために、APIレベルという概念を確立しました。
  • APIメタデータにバージョンと非推奨のフィールドを追加しました。
  • タグ付きリリースで公開されたAPI関数シグネチャを破棄することは決してありません。
  • Neovimバージョン2.0(もしあれば)まで、非推奨のAPI関数を削除することはありません。

APIは成長するだけで、壊れることはありません。各API関数は、最初に利用可能になったAPIレベルでマークされています。これにより、多数のNeovim APIクライアントが任意のリリースされたバージョンのNeovimをサポートすることが容易になります。

PR #4934以降、現在のnvimプロセスのAPIをVimLから直接呼び出すことができます。

:echo nvim_buf_get_lines(42, 1, 3, v:false)

コマンドラインで:call nvim_<Tab>を試して利用可能なAPI関数を確認するか、nvim-api-viewerプラグインをインストールして、利用可能なAPI関数の概要を確認してください。

私たちはAPIの信頼性を真剣に受け止めており、設計について慎重に検討してきました。プラグインとクライアントの作成者からのフィードバックを歓迎します!

リリース戦略

バージョン管理

1年前、最初のリリース0.1を発表しました。リリースプロセス(バージョン管理、タグ付け、変更ログ、発表)を合理化しました。

一部のユーザーは、0.1はNeovimが不安定であることを意味するのではないかと疑問に思っています。

  • 0.1以降の各リリースは、Windowsを除くすべてのシステムで使用できる安定版と見なされています。
    • Windowsは0.2からファーストクラスのターゲットになります。
  • 1.0までは、API以外の機能で下位互換性がなくなる可能性があります。これはまれであり、これらのケースは常に文書化されています。
  • 0.1.6APIのバージョン管理を導入しました。クライアントは、使用する関数を動的に決定できます。

semverに従っています。そこでの推奨事項は、0.xシリーズの意図を説明しています。

OSパッケージ

OSパッケージが増えています。NeovimはDebianの次のリリースに含まれています! DebianのメンテナーでありNeovimの貢献者でもある@jamessan@fwalch、その他お気に入りのシステムのパッケージを作成し、避けられないコンパイラ/プラットフォーム特有の問題に対処するために協力してくれた皆さんに感謝します。

進捗状況

2014年以降、Neovimの貢献者は何を達成しましたか?

控えめに見積もっても、少なくとも2万行の新しいCコードが記述されました。Vim独自のテストスイートに合格することに加えて、2200個の新しいテストを作成しました。273人の異なる人がコアプロジェクトに貢献しました。コアプロジェクトは、3年間にVimが12年間に書いたよりも多くのコミットがあります。

主要なリファクタリングと機能の作業に加えて、Neovimの継続的インテグレーション(CI)システムに多くの時間が費やされました。安定しているが壊れやすいCコードベースでは、メンテナーは「小さな」機能を無視する傾向があります。なぜなら、リスクが高すぎる可能性があるからです。CIは脆弱性を軽減するため、変更を恐れるのではなく、歓迎することができます。

新しい機能は、スクリーンテストを使用して厳密にテストできます。たとえば、'wildmode' UIの動作をテストするテストを次に示します。

describe("'wildmenu'", function()
  it(':sign <tab> shows wildmenu completions', function()
    execute('set wildmode=full')
    execute('set wildmenu')
    feed(':sign <tab>')
    screen:expect([[
                               |
      ~                        |
      ~                        |
      define  jump  list  >    |
      :sign define^             |
    ]])
  end)
end)

2014年にVimをフォークして以来、不安定な時期もありましたが、その差はますます小さくなり、2017年には解消される見込みです。回帰修正はすべて統合テストでカバーされています。各プルリクエストは12種類の異なる環境でビルドされます。ビルドシステムへの貢献に対して、@jszakmeisterさん、@fwalchさん、@ZyX-Iさんに、また非常に困難なバグの修正に対して@oni-linkさんに、深く感謝いたします。

小さなことが重要です

ソーシャルメディアからの最も強い印象の一つは、人々がNeovimを試す際に「摩擦の少なさ」を本当に高く評価していることです。**デフォルト設定が重要です。** 私たちが選択した多くのデフォルト設定のキュレーションにおいて、Tim Pope氏の功績は称賛に値します。キュレーション

@fmoralesc氏をはじめとする多くの人々が、回帰を引き起こすことなくこれらのデフォルト設定を実装する方法について慎重に検討しました(encoding=utf8と構文/ファイルタイプは困難でした)。この作業は大変でしたが、その価値はありました。これは、新規ユーザー、新しいシステムを使用する旧来のユーザー(今日のいたるところにあります:VM、コンテナ、サーバー…)、そしてVimの「ベストプラクティス」を広めることですべてのユーザーを支援する**一度限りの**コストです。

機能

前回のニュースレター以降の新たな展開をご紹介します。

  • **Rubyサポート**が0.1.5で追加されました。これは、RubyでNeovimプラグインを作成できるだけでなく、レガシーのVim :ruby*コマンドもサポートされていることを意味します(Command-tやvim-github-dashboardなど、既存のVim+RubyプラグインがNeovimで動作します)。
    • Rubyサポートを有効にするには、単にgem install neovimを実行するだけです。特定のバージョンにコンパイルする必要はありません。
  • Neovim APIのGoクライアントを使用して、**Goでプラグインを作成**できます!(@garyburdさんありがとうございます!)
  • :CheckHealthは、一般的な問題(Homebrewのdoctorなど)を検出します。Neovimのインストールまたはアップグレードのたびに実行してください。
  • **バッファローカルハイライト**(:help api-highlights)はmatchaddpos()に似ていますが、いくつかの重要な違いがあります。バッファに関連付けられており、**行の挿入と削除に適応します**。バッファの変更を監視し、バックグラウンドでハイライトを計算するリンターやセマンティックハイライタープラグインに役立ちます。

外部化されたUIウィジェット

PR #4432@bfredl氏が、「ウィジェット」の表示に対するUIの制御を強化するための第一歩を踏み出しました。UIへの制御の強化 @romgrk氏はすぐに概念実証を作成しました。

すぐに、**コマンドライン、タブ、wildmenu、プレビューウィンドウウィジェットを外部化する野心的なパッチ**ambitious patchが登場しました。デモは素晴らしい可能性を示しています。

この作業は、@tarruda氏が端末UI(TUI)と内部画面を明確に分離したため可能になりました。そのため、**組み込みのTUIでさえ、他の外部UIと同様にUIイベントによって制御されます**。

増分(ライブ):substitute

2016年5月、Eric Burel氏に指導された学生グループがNeovimへの貢献について連絡してきました。私たちが提示したアイデアのリストから、彼らは:substituteの「ライブプレビュー」を実装することにしました。PR #5561でマージされ、0.1.7でリリースされました。inccommandオプションを設定して試してみてください。

:set inccommand=split

この機能は、私たちの開発モデルによって実現しました。「時間がない」サイドプロジェクトにも関わらず、基本的なアイデアを概説し、学生が自主的に決定し、必要に応じて説明を提供しました。

  • 学生たちは継続的なフィードバックを得るためにPRを投稿しました。PRフォークは定期的に更新されたため、レビューアーはプル、ビルド、テストを行うことができました。
  • テストは画面テストを使用して記述され、Coverity/ASanなどによる機能のテストと、レビューアーによる**動作の視覚化**に役立ちました。
  • 自動化されたビルドシステムは、12種類の異なるシステムに対して継続的に変更を実行しました。

Eric氏はその経験について書いています。Eric氏、ENSIMAGの学生、@KillTheMuleさん、@bfredlさん、この機能を私たちが誇りに思える結論に導いていただき、ありがとうございました。

今後の予定

Neovim 0.3では、2017年に以下の展開を予定しています。

  • 2017年には、Luaをデフォルトのスクリプティング代替として提供する予定です。リスク低減と迅速な機能強化の次の「転換点」は、Luaでコアを拡張できるようにすることです。そのためにはPR #4411が重要なステップとなります。
  • ZyX氏のeval.cのリファクタリングにより、モノリシックなeval.cモジュールに分割され、NeovimのVimL実装がVimのものから分岐する時点となります。これは、世界で2番目の**代替VimL実装**となります(ZyX氏のVimLからLuaへのPRが最初でした)。
  • 拡張マークにより、プラグイン作成者はより強力で柔軟なマークを使用できるようになります。
  • Microsoft Language Serverの実装を綿密に検討し、それ自体と同様のミドルウェアをNeovimとどのようにエレガントに統合できるかを決定します。

EOF

これがNeovimの2016年でした。2017年はNeovimデスクトップの年になるでしょうか?

Neovimのアイデアは、XiエディタやVim自体など、他のプロジェクトにも取り入れられています。Vimは今年、過去最高の活況を呈しています。今年、過去最高の活況

GitterとIRCチャンネル(matrixによってブリッジされています。 @leonerdさんありがとうございます!)には活気があります。ぜひご参加ください

また、プロジェクトの今後の進捗状況については、neovim.ioのロードマップをご覧ください。

お読みいただきありがとうございました。

—Justin M. Keyes (@justinmk)


注記1
$ git log --grep='\([zZ]y[xX]\)\|\([nN]ikolai [pP]av\)\|\([nN]ikolay [pP]av\)' --numstat --pretty=tformat: --numstat|gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
added lines: 22590 removed lines: 8620 total lines: 13970

$ git log --grep='[cC]hristian [bB]rab' --numstat --pretty=tformat: --numstat|gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
added lines: 10000 removed lines: 3033 total lines: 6967
注記2
$ ohcount msgpack_rpc/ api/ os/ event/ tui/ shada.c rbuffer.c terminal.c memory.c
c                    79      14576       2863      16.4%       2154      19593

ニュース

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

Neovim とは?

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

ディスカッション

チームとチャットするには、#neovim:matrix.orgまたはirc.libera.chatの#neovimをご覧ください。