生涯未熟

プログラミングをちょこちょこと。

NeovimのREADME.mdを和訳してみる

vim界隈で衝撃的な発表がありました。

次世代Vimを開発へ! 「Neovim」プロジェクト発足 | マイナビニュース


記事を読むに、「vimで使ってるコード古いし300万行くらいのデカいファイルになってきたんで、そろそろリニューアルするわー」ってな感じかなと思われます。


んで、NeovimのGithubを見てみるとREADMEがあったので、興味本位で和訳してみます。
英語力皆無の人間がGoogle翻訳様を頼りに和訳したものになりますのでご容赦下さい・・・
ここ間違ってるよ!という方はコメントなりで教えていただけると幸いです。

はじめに

Vimは今なお活気のある巨大なコミュニティを持つ強力なテキストエディタです。
Vimは約20年前から続く古いエディタですが、使用している人はvimscriptまたはサポートされているスクリプト言語のいずれかを使用して、vimをまだ拡張し改善したい!と思っています。

Vimの問題点

この20年に渡り、vimは一部の人にしか分からないであろうC89コードを使って300万行も積み重ねてきました。
もう一つの問題はVimの巨大なコードを管理している唯一の人物、
Bram Moolenaar氏がパッチを受け入れる前にマージし、新しいコードを書き起こすことに細心の注意をはらう必要があり、氏の負担となっています。
そのためプラグインのエコシステムの開発スピードについていけなくなっています。

解決策

Neovimは以下の項目を達成するためにVimソースコードリファクタリングしようとしているプロジェクトです。

  • バグ修正と機能追加をマージする速度を向上させるために、メンテナンスを簡素化します。
  • 複数の開発者間で作業を分割します。
  • ソースのコアとなる部分に変更を加えずに、新しく近代的なユーザ·インタフェースの実装を可能にする。
  • プラグインは、エディタからの明示的なサポートなしで任意のプログラミング言語で実装できるようになります。

上記の目標を達成することにより、新しい開発者がすぐにコミュニティに参加できるようになり、結果的にすべてのユーザがvimをより良いものにすることができます。

Vimをスクラッチ開発、またはIDEに変換するというプロジェクトではないということを強調することが重要である。(ただし提供される新機能では、エディタのIDEのようなディストリビューションが可能になります)

今回実装された変更は、Vimの編集形式やvimscriptにはほとんど影響を与えないはずです。ほとんどのvimscriptで作られたプラグインは正常に動作し続けるでしょう。

次のトピックでは、最初のイテレーションで行われる主な変更(と理由)について簡単に説明しています。

CMakeのベースのビルドに移行

ソースツリーには、異なる構成で様々なプラットフォーム上でVimを構築することが出来るファイルを数十(または数百)個あり、これらのファイルの多くは、放棄されているかひどく古く見える。

ほとんどのユーザは個々の機能の選択やコンパイルに--with-features=hugeを使うことに対して全く気にしていない, そしてそれはまだ今日の標準によって軽量なシステムでさえも必要なだけの実行可能形式のファイルを生成する。

これらすべてのファイルが削除され、Vimは最も関連性の高いプラットフォーム用のビルドスクリプトを作成する近代的なビルドシステムのCMakeを用いてビルドされることになるでしょう。

従来のサポートとコンパイル時の機能

Vimレガシーシステムのサポート用コードをかなりの量を持っています。それらのコードはメンテナンスの負担を増加させるため削除します。

若干の壊れて役に立たないオプションを除いては、大部分のオプションの特徴は、もはやオプションとして機能していません(例:NetBeansとSun WorkShop統合)
これらのオプションは永久的に削除されます。

viのエミュレーションも削除されます(nocompatibleを設定してもNOPになる)。

これらの変更は、ほとんどのユーザーには影響しません。
唯一C89コンパイラをインストールしているか、AmigaBeOSMS-DOSのようなレガシーシステム上でvimを使用している場合は以下のいずれかを選択することになります。

- これらのソフトウェアをアップグレードする
- NeovimではなくVimを使い続ける

プラットフォーム固有のコード

プラットフォーム固有のコードの大部分が削除され、libuvはシステムのハンドル処理のために使用されます。

libuvは、一般的なシステムタスクを実行するための機能を備えた近代的なマルチプラットフォームのライブラリであり、ほとんどのunixWindowsをサポートしているので、Vimのコミュニティの大部分はカバーされるでしょう。

新しいプラグインアーキテクチャ

埋め込まれたスクリプト言語インタプリタをサポートしているすべてのコードは、どんなプログラミング言語ででも記述される機能拡張をサポートする新しいプラグイン・システムに置き換えられます。

互換レイヤーは、PythonRubyなど、現在サポートされているスクリプト言語の一部で記述されたvimプラグインのために提供されます。
これがあれば、ほとんどのプラグインは少し修正を加えNeovimで動作するはずです。

新しいプラグインシステムを動作させる方法は以下になります。
- プラグインはmsgpack-RPCまたはJSON-RPCを使用して/標準出力、標準入力経由のvimと通信を行う長時間実行するプログラム/ジョブ(コプロセス)をであること。
- Vimの起動時にこれらのプログラムに気付き、実行すること。そしてVimが終了されるまで各プラグインで双方向チャネルを保つこと。
- プラグインはイベントをリッスンし、非同期でvimにコマンドを送信できるようにすること。

このシステムは、ジョブ制御パッチによって実装されたものと同様のジョブ制御機構の上に構築されるでしょう。

以下に記述しているものはプラグインのセッションが動作するかもしれないJSON-RPC(またはJSON-RPC。バージョンは省略)を使った方法です。

plugin -> neovim: {"id": 1, "method": "listenEvent", "params": {"eventName": "keyPressed"}}
neovim -> plugin: {"id": 1, "result": true}
neovim -> plugin: {"method": "event", "params": {"name": "keyPressed", "eventArgs": {"keys": ["C"]}}}
neovim -> plugin: {"method": "event", "params": {"name": "keyPressed", "eventArgs": {"keys": ["Ctrl", "Space"]}}}
plugin -> neovim: {"id": 2, "method": "showPopup", "params": {"size": {"width": 10, "height": 2} "position": {"column": 2, "line": 3}, "items": ["Completion1", "Completion2"]}}
plugin -> neovim: {"id": 2, "result": true}}

つまり、ユーザがCtrl+Spaceを押した時に補完を表示する補完プラグインとNeovimとの間で仮想的な会話を示しています。

上記のスキームは無限に近い拡張性をneovimに与え、またプラグインは自動的にメインの実行から隔離されるように、安定性を向上させます。

またこのシステムは簡単に現在のvimscriptの言語インターフェイスをエミュレートすることができる。

例えば、プラグインは独自のコンテキストでvimから送信されたPythonスクリプトを実行し、現在のものに一致するAPIを使用したvimのモジュールを公開することでPythonインタフェースをエミュレートすることができます。

APIへの呼び出しは単純にJSON-RPCメッセージに変換されvimへ送られます。

新しいGUIアーキテクチャ

Vimが巨大なコードになったもう一つの要因は、GUIインターフェイス用のウィジェットツールキット数十個のための明示的なサポートです。
そのためレガシーコードのサポートと同様に、GUI固有のコードも削除されます。

NeovimのGUI処理はプラグイン処理の方法と同じ方法で処理されます。

- GUIはおそらく異なるプログラミング言語で記述され、別々のプログラムとなる。
- Neovimは入力を受けとり、JSON-RPCまたはmsgpack-RPCを使用してもう一度更新情報を送信するため、独自の標準入力/標準出力を使用します。

プラグインGUIの違いは、プラグインはNeovimによって開始されるのに対して、GUIGUIを実行しているプログラムによってNeovimが開始されるという点です。
ここでプロセスツリーのサンプルの図を以下に示します。

GUI program
  |
  `--> Neovim
         |
         `--> Plugin 1
         |
         `--> Plugin 2
         |
         `--> Plugin 3


仮想的GUIセッション:

gui -> vim: {"id": 1, "method": "initClient", "params": {"size": {"rows": 20, "columns": 25}}}
vim -> gui: {"id": 1, "result": {"clientId": 1}}
vim -> gui: {"method": "redraw", "params": {"clientId": 1, "lines": {"5": "   Welcome to neovim!   "}}}
gui -> vim: {"id": 2, "method": "keyPress", "params": {"keys": ["H", "e", "l", "l", "o"]}}
vim -> gui: {"method": "redraw", "params": {"clientId": 1, "lines": {"1": "Hello                   ", "5": "                        "}}}

この新しいGUIアーキテクチャは、多くの興味深い可能性を生み出します。

- 最近のGUIはOSとより良く統合された高水準言語によって記述されている。
例えば、私達はOS X上でRuby/ CocoaWindows上でC#/ WPFを使用してGUIを書くことが出来る。
- プラグインGUIによって直接処理することができるカスタムイベントを発火することができるようになる。
これは、Sublimeのミニマップなどのような高度な機能の実装を可能にする。
- 多重化したデーモンは、複数のリモートGUIのアタッチ/編集しているセッションの共有をデタッチしている間、ヘッドレスサーバーで実行されているNeovimのインスタンスを保持することができる。
- 簡素化されたヘッドレステスト。
- エディタを他のプログラムへ埋め込むことができる。
実際には、GUIはneovimを埋め込むプログラムとして見ることができる。

クライアント - サーバプロセスツリーがどのようなものかを示した図は次のとおりです。

Server daemon listening on tcp sockets <------ GUI 1 (attach/detach to running instances using tcp sockets)
  |                                       |
  `--> Neovim                             |
         |                                GUI 2 (sharing the same session with GUI 1)
         `--> Plugin 1
         |
         `--> Plugin 2
         |
         `--> Plugin 3

githubでの開発

開発はGitHubのOrganizationで行い、コードは現在のVimのソースツリーとは異なり、多くのリポジトリにまたがって分割されます。

GUIプラグイン、ランタイムファイル(公式vimscript)およびディストリビューション用には、また別のリポジトリが存在します。

これはパッチがすべての承認を得るために人間を介する必要がないので、編集者が速くパッチを受け取ることが出来ます。

Travis CIも継続的な統合のために使用されますので、プルリクエストが自動でチェックされます。

現状

現在までに行ったこと:

- ソースツリーは、コアのみをコンパイル/テストのために必要なファイルを残して、クリーンアップした。
- ソースファイルではかなりの量の>||FEAT_*||<マクロを除去するためにunifdefで処理した。
- ファイルではソース·コード·フォーマットを正しくするためuncrustifyで処理した。
- autotoolsのビルドシステムは、CMakeに置き換えた。

今現在作業中なこと:

- IOをlibuvに移植する。

依存関係

Ubuntu/Debian

sudo apt-get install libtool autoconf automake cmake libncurses5-dev g++

FreeBSD 10

sudo pkg install cmake libtool sha

Arch Linux

sudo pacman -S base-devel cmake ncurses

OS X

- XcodeとHomebrewかMacPortsをインストール
- sha1sumをインストール

もしあなたがwgetの証明書エラーになった場合は、ルートSSL証明書を見つからないか、それらを正しく設定していない可能性があります。

MacPorts経由の場合

sudo port install curl-ca-bundle libtool automake cmake
echo CA_CERTIFICATE=/opt/local/share/curl/curl-ca-bundle.crt >> ~/.wgetrc

Homebrew経由の場合

brew install curl-ca-bundle libtool automake cmake
echo CA_CERTIFICATE=$(brew --prefix curl-ca-bundle)/share/ca-bundle.crt >> ~/.wgetrc

ビルド方法

makefileの生成

make cmake

ビルドと実行テスト

make test

Mac上のHomebrewで実行

brew install neovim/neovim/neovim

コミュニティ

IRCでFreenode上の#neovimかmailing listにてコミュニティに参加できます

貢献

素晴らしいです!詳細はwikiを参照してください。

ライセンス

VimVimライセンスの条件の下で配布されています。
詳細については、VIM-license.txtを参照してください。

Vimは次の基準に沿ったメッセージを含んでいます。

Vim is Charityware.  You can use and copy it as much as you like, but you are
encouraged to make a donation for needy children in Uganda.  Please see the
kcc section of the vim docs or visit the ICCF web site, available at these URLs:

        http://iccf-holland.org/
        http://www.vim.org/iccf/
        http://www.iccf.nl/

You can also sponsor the development of Vim.  Vim sponsors can vote for
features.  The money goes to Uganda anyway.

入門vi 第6版
入門vi 第6版
posted with amazlet at 14.02.27
リンダ ラム アーノルド ロビンス
オライリー・ジャパン
売り上げランキング: 127,626