FirefoxのアドオンをCUIから管理するツールを作ってみた

先日、Firebrewというツールを作成し、RubyGemsにて公開しました。 Githubにて開発しています。

コレは何?

FirefoxアドオンをCUIからインストールしたりアンインストールしたりできる、いわゆるパッケージマネージャーと呼ばれるものです。 これを用いれば各種アドオンのインストール・アンインストールを自動化することができます。 たとえば、Firefoxのキラーアドオンの一つであるVimperatorをインストールする場合は以下のようにします。

$ firebrew install Vimperator

なぜ作ったの?

現在ぼくは、VimやGitなど基本的な開発環境のインストール・設定はプロビジョニングツールであるAnsibleを用いて行っています。 これにより新しい環境への移行が簡単になります。

この基本的な開発環境にはブラウザであるFirefoxも入っているので、インストールおよび設定を自動化したいと考えました。

Firefoxのインストールは、MacであればHomebrew Cask、Linuxであればapt-getやyumなどの各種パッケージマネージャーを用いれば良さそうです。 Vimperatorの設定ファイルである.vimperatorrcなどは指定の場所にコピーすれば問題ないでしょう。 しかし、アドオンのインストールを自動化する既存のよい方法がありませんでした。

そんななか、Firefox開発元のMozillaThe generic AMO APIというアドオンの情報を取得できるAPIを公開していることがわかりました。 このAPIを用いればアドオンのGUIDやダウンロード元URLなどを取得することが出来ます。これはアドオンの自動インストールを行うにあたって十分な情報です。

そして、アドオンのインストール・アンインストールをするにあたって、インストール先のプロファイルパスの取得にはprofiles.iniを、 インストールされているアドオン一覧を取得するには、プロファイルディレクトリのextensions.jsonをそれぞれ参照すれば良さそうです。

これらを踏まえて、Firefoxのアドオンのパッケージマネージャーを作成することにしました。

どうやって使うの?

さて、肝心の使用方法ですが、まずはFirebrewのインストールを行わなければなりません。 幸いにもFirebrewはRubyのgemとして作成されているので、インストールはgemコマンドを用いるだけです(ただし実行にOpenSSLを必要とするので、Windowsだと面倒くさいかもしれません)。

$ gem install firebrew

Firebrewのインストールが終わったところで使用方法を解説しましょう。 まず、firebrewコマンドの基本的な構造は下記のとおりです。

$ firebrew [--help] [--version]
           [--base-dir=<path>] [--profile=<name>] [--firefox=<path>]
           <command> [<args>]

そして、主な機能として以下があります。

  • アドオンのインストール
  • アドオンのアンインストール
  • 公開されているアドオンの検索
  • アドオンの詳細な情報の取得
  • インストール済みアドオンの取得

以下、これらをそれぞれ解説していきます。

アドオンのインストール

名前がnameであるアドオンをインストールします。

$ firebrew install <name>

アドオンのアンインストール

名前がnameであるアドオンをアンインストールします。

$ firebrew uninstall <name>

公開されているアドオンの検索

名前がtermにマッチするアドオン一覧を表示します。

$ firebrew search <term>

アドオンの詳細な情報の取得

名前がnameであるアドオンの詳細な情報を表示します。

$ firebrew info <name>

インストール済みアドオンの取得

インストール済みアドオンの一覧を表示します。

$ firebrew list

また、以下のオプションが使用可能です。

--base-dir

profiles.iniがあるディレクトリを指定します。

-d <path>, --base-dir=<path>

デフォルト値は下記のとおりです。

プラットフォーム
Mac OS X ~/Library/Application Support/Firefox
Linux ~/.mozilla/firefox
Windows %APPDATA%\Mozilla\Firefox

この値はFIREBREW_FIREFOX_PROFILE_BASE_DIR環境変数で上書き可能です。

--profile-name

対象となるFirefoxプロファイル名を指定します。

-p <name>, --profile=<name>

デフォルト値はdefaultで、FIREBREW_FIREFOX_PROFILE環境変数で上書き可能です。

--firefox

firefoxコマンドのパスを指定します。

-f <path>, --firefox=<path>

デフォルト値は下記のとおりです。

プラットフォーム
Mac OS X /Applications/Firefox.app/Contents/MacOS/firefox-bin
Linux /usr/bin/firefox
Windows %PROGRAMFILES%\Mozilla Firefox\firefox.exe または %PROGRAMFILES(X86)%\Mozilla Firefox\firefox.exe

この値はFIREBREW_FIREFOX環境変数で上書き可能です。

最後に

これでFirefoxの構築を自動化できるようになりました。 また、せっかくAnsibleを使っているので、Ansibleモジュールを作ってみようかと思います。

※2014/07/18 追記: Firebrew用のAnsibleモジュールを作成しました → FirebrewのAnsibleモジュールを作ってみた

indentLineプラグインを導入するとYAMLの構文強調がおかしくなる

Vimにはインデント階層を可視化してくれる indentLine というプラグインがあります。 このプラグイン、便利なので僕も使っているのですが、ひとつ問題点があります。このプラグインを導入すると、YAMLの構文強調がおかしくなるのです。

Fig. 1 indentLine無効時

f:id:mrk21:20140625182816p:plain

Fig. 2 indentLine有効時

f:id:mrk21:20140625182825p:plain

ふーむ、どうやらインデントされたブロックマッピングのキー部分がハイライトされてないですね。これはどういうことだろうと、indentLineのソースを読むと、after/plugin/indentLine.vimsyntax match ...部分が悪さをしていることが分かりました。

Fig. 3 after/plugin/indentLine.vim, 81行目

execute 'syntax match IndentLine /\%(^\s\+\)\@<=\%'.i.pattern.' / containedin=ALL conceal cchar=' . g:indentLine_char

つまり、indentLineの上記コードにおいて、/^\s\+/を喰っちゃってるので、ハイライトがされなくなったわけです。 この問題を解決するためには、ブロックマッピングのマッチングルールを変更する必要があるわけですが、どうやってやろう…

YAMLの構文強調・インデントを行うVimプラグインを作ってみた

はじめに

Vim標準のYAMLのインデントルールが気に入らなかったので、Vim script の勉強がてらにプラグインを作ってみました。 YAMLの構文は、YAML Ain’t Markup Language (YAML™) Version 1.2 を参考にしています。プラグインのソースは、 Github: mrk21/yaml-vim にあります。

プラグインの概要

このプラグインを導入することによって、次のインデントスタイルが可能になります。

---
# ブロックシーケンスとブロックマッピングを同じラインに書く
- name: create file
  command: >
    creates=/path/to/file
    touch /path/to/file

# ブロックシーケンスの"-"の後にスペースを入れないで改行
-
  name: install packages
  apt: name={{item}} state=present
  with_items:
    - package1
    - package2
---
# トップドメインのブロックスカラー
>
  ブロックスカラーの値

また、次の構文強調が追加されています。

  • ブロックスカラー: >, |
  • 後にスペースが存在しないブロックシーケンス: -

使い方

.vimrcプラグインをロードする設定を記述するだけです。

NeoBundle 'mrk21/yaml-vim'

最後に

Vimの構文強調は正規表現で単語を抜き出して行うので、こういったインデントによって意味合いが変わる言語は難しいですね。例えば、ブロックスカラーの値の部分のハイライトはおそらく無理でしょう。