Vim Vixenの2年間を振り返る

Vim Vixenの2年間を振り返る

本日、2019 年 10 月 11 日は、Vim Vixen リリースからちょうど 2 年が経過します。 昨日リリースした 0.25 が最新バーションで、今後も引き続き開発を続けていく予定です。 現在はおかげさまでユーザー数は 12,000 を超えて、GitHub スター数も 1,500 を超えました。

この 2 年間の Vim Vixen を振り返って行きたいと思います。

2 年間の実績

まずは 2 年間の開発実績を見ていきます。 最初のコミットは 2017 年 8 月 11 日なので、この日が開発開始と言えるでしょう。

この 2 年間でリリースした回数は 25 回で、コミット数は 1,285 です。 現在は TypeScript で記述しており、コード量は本体コードが 8,795 行、テストは 7,263 行になりました。 このコードには自分以外に 30 人のコントリビューターから送られた Pull Req.も含みます。 基本的にメインメンテナーは自分ひとりで、新規機能やバグフィックスは GitHub 上で行ってます。

2 年間で Close した Issue の数は 246 件です。 着手する Issue の優先度は、:thumbs_up: が多い物を優先的に取り組んでますが、基本的に自分が欲しい機能から実装してます。

2 年間のリリースの歴史

Vim Vixen のバージョンは特にメジャーバージョン・マイナーバージョンを意識するのが面倒だったので、0.xx というナンバリングにしています。 初期の頃は機能追加とバグフィックスを交互にリリースしてましたが、現在は各リリースの変更サイズをできるだけ揃えるようにしてますが、大抵は気まぐれです。

バージョン 0.1

最初のリリースです。 スクロール、タブ切り替え、リンクオープンなどの基本的なブラウザ操作をできるのを第一目標にリリースしました。 こ最初は Babel + webpack という構成で、ES2015 を ES5 にトランスパイルしてます。 また内部の状態管理には Redux 風のオレオレライブラリを実装して、HTML の描画は素朴な DOM API を使ってます。

バージョン 0.2

主な新規機能は以下のとおりです。

  • リンクの follow モードで、frame/iframe 対応をしました。

follow モードの frame/iframe は機能としては小粒ですが、frame/iframe ではそれぞれ個別にプラグインがロードされるので、 アンカーの採番やリンククリックなどを実装するためにpostMessage()を使って協調動作するのが大変だった記憶があります。

バージョン 0.3

主な新規機能は以下のとおりです。

  • Shift+Escでアドオンの有効・無効を切り替えるようにしました。
  • Blacklist を導入し、URL にマッチするページでアドオンを無効化できるようにしました。

このリリース以降、急激に GitHub スター数が増え始めました。 それと同時に Issue も報告されはじめ、1 日 10 件以上の報告が毎日続いた期間がありました。

バージョン 0.4

主な新規機能は以下のとおりです。

  • <area> タグ内のリンクを follow モードで開けるようにしました。

<area> タグ内のリンクを開けるようにしたのは、自分がよく利用する気象庁のページでよく利用されてるためです。

バージョン 0.5

主な新規機能は以下のとおりです。

  • g0/g$で先頭・末尾のタブを選択するようにしました
  • zpでタブのピン留めを切り替えるようにしました
  • zdでタブを複製するようにしました
  • /キーでページ内検索に対応しました。

バージョン 0.6

バグフィックスと細かなユーザーエクスペリエンスの向上です。

バージョン 0.7

主な新規機能は以下のとおりです。

  • GUI の設定画面をサポートしました

JSON で設定してたのを、GUI のフォーム画面にも対応しました。 フォーム画面の描画には Preact を採用しました。

バージョン 0.8

バグフィックスと細かなユーザーエクスペリエンスの向上です。

バージョン 0.9

不具合があったのでリリーススキップです。

バージョン 0.10

不具合があったのでリリーススキップです。

バージョン 0.11

バージョン 0.9 と 0.10 で不具合があったので、緊急リリースしたバージョンです。 主な新規機能は以下のとおりです。

  • プロパティという概念を導入しました。smoothscrollプロパティとhintcharsプロパティを追加しました。
  • giで最初の<input>タグにフォーカスするようにしました。
  • !dでピン留めされたタブを閉じるようにしました。
  • p/Pでクリップボードから URL を開くようにしました。

このバージョンでアドオンパッケージをシェルスクリプトから Node に移行しました。 その時にパッケージ作成に失敗して、AMO アップロード後にロードできないというのに気づきました。

その修正後、改めてリリースすると、新たに導入したプロパティにも不具合があり、プラグインが動作しないというのに気付きました。 結果として 2 バージョンもリリースを中止しました。

バージョン 0.12

バグフィックスと細かなユーザーエクスペリエンスの向上です。

このリリースからリリース前に実施してた試験項目を、自動化への移行を始めました。 またこのリリース前後で、GitHub スターが 1,000 も超えました。

バージョン 0.13

不具合があったのでリリーススキップです。

バージョン 0.14

バージョン 0.13 で不具合があったので、緊急リリースしたバージョンです。 主な新規機能は以下のとおりです。

  • このバージョンから Firefox のツールバーに Vim Vixe のアイコンが表示されるようになりました。アイコンをクリックすることで、Vim Vixen を有効・無効を切り替えることができます。
  • Vim Vixen の更新があった時、ユーザーに通知するようにしました。
  • ggでページのソースを開くようにしました。
  • :addbookmark コマンドを追加して、コンソールからブックマークを作成できるようにしました。
  • :quit コマンドを追加して、コンソールから現在のタブを閉じられるようにしました
  • :bdelete/:bdeletes コマンドを追加して、コンソールからキーワードにマッチするタブを閉じられるようにしました。

また Travis CI から CircleCI に移行しました。

バージョン 0.15

バグフィックスと細かなユーザーエクスペリエンスの向上です。

Promise ではなく ES6 の async/await を利用するようにしました。 Babel 使ってるからもっと早くに async/await 使えばよかった。

バージョン 0.16

主な新規機能は以下のとおりです。

  • :buffer コマンドで、#/%でタブを選択できるようにしました。
  • 全てのタブを閉じる :quitall コマンドを追加しました。
  • p/Pでクリップボードからキーワード検索できるようにしました。
  • :quitall コマンドで全てのタブを閉じるようにしました。

バージョン 0.17

バージョン 0.16 で Firefox60 ESR 上の動作に不具合があったので緊急リリースしたバージョンです。 Mozilla が公式にサポートしてる Firefox 上での動作を保証するために、ユニットテストの実行環境をサポートしてる一番古い Firefox ESR にしました。

状態管理で実装したオレオレ Redux 風ライブラリから、公式の Redux パッケージを利用することにしました。 また Background script の設計を Redux ではなく、Clean Archtecture にほぼフルスクラッチで書き直しました。

バージョン 0.18

バグフィックスと細かなユーザーエクスペリエンスの向上です。

バージョン 0.19

主な新規機能は以下のとおりです。

  • ページ内マークmとジャンプ'に対応しました。
  • completeプロパティを追加して、タブを開くときの補完を管理できるようにしました。

CircleCI 2.1 に移行しました。

バージョン 0.20

主な新規機能は以下のとおりです。

  • gh/gHキーで、ホームページを開くようにしました

コンソールの描画に Preact を使って描画するようにしました。 また follow モードでメッセージ送信にpostMessage()使ってた部分を、セキュリティの理由で WebExtensions API を使うようにしました。

バージョン 0.21

バグフィックスと細かなユーザーエクスペリエンスの向上です。

バージョン 0.22

バグフィックスと細かなユーザーエクスペリエンスの向上です。

E2E テスト自動化ツールとして、プロジェクトの内部ライブラリして実装してましたが、 1 から作り直して npm パッケージに切り出しました(ドキュメントはまだ整備できてません)。

バージョン 0.23

主な新規機能は以下のとおりです。

  • .で最後の操作を繰り返すようにしました

本体のコードを JavaScript から TypeScript に移行しました。 そして Content Script の設計を、Redux ではなく Clean Archtecture にほぼフルスクラッチで書き直しました。 また画面描画を、Preact から React に変更しました。

バージョン 0.24

バグフィックスと細かなユーザーエクスペリエンスの向上です。

バージョン 0.25

主な新規機能は以下のとおりです。

  • Partial blacklist に対応しました。
  • 公式ページも兼ねたヘルプページを作成しました。https://ueokande.github.io/vim-vixen/
  • :helpコマンドで上記のページを開くようにしました

このバージョンから、CircleCI を使って自動リリースも導入しました。 これで Git 上でタグを打つだけで AMO にアップロードされます。

まとめ

もともと Vim Vixen の開発を始めたきっかけは、Firefox 53 から Vimperator が使えなくなったという理由でした。 最初は自分が使えればいいと思ってひっそりとリリースしたのですが、現在たくさんのユーザーに使っていただいてます。 初期リリース 1 ヶ月後くらいにユーザー数が急激に増えた頃は、Issue 対応やバグフィックスに追われて大変だった時期もありました。 それも地道に対応を進めて、今では落ち着きました。

Vim Vixen の開発で、貰った一番嬉しい Pull Req.は、ドキュメントの修正です。 自分が書く英語は、英語ネイティブな人たちがの文書よりも遥かに下手くそです。 助詞が足りないとかの些細な変更でも、ありがたく受け入れます。

今後も Vim Vixen の応援をよろしくおねがいします。


Profile picture

Shin'ya Ueoka

B2B向けSaaSを提供する会社の、元Webエンジニア。今はエンジニアリング組織のマネジメントをしている。