プロファイルで切り替え

http://d.hatena.ne.jp/nokturnalmortum/20081105#1225877001 の方法。うちの環境でも動くのを確認。ただ、これだと vimperatorrc をわけることができないので細かい制御ができないけどプロファイル名の認識を自動でやってくれるのでたとえば 2.0pre しか使わないという状況で plugin だけ細かくわけたい場合に適していると思う。

bat などのほうがシンプルでいい気もしてくるが、せっかくなので rc ファイルも読むようにしてみた。
Vimp厨的。
以下のような構成で使う。

vim: syntax=vimperator :

.vimperatorrc (this file)
    .vimperator/
        default/
            .vimperatorrc
            .vimperatorrc.js
            plugin/
            color/
        vimp1.2/
            .vimperatorrc
            plugin/
            color/
        ....

おまけで ".vimperatorrc.js" も読むようにした。

js << EOM
if (1) {
  // プロファイル名のディレクトリがないときはコレ
  let defaultName = 'default';
  // 1.2用のルートを設定
  let vimp12root = null;
  // rc ファイル名のパターン
  let rcFilenames = ['.vimperatorrc', '_vimperatorrc', '.vimperatorrc.js', '_vimperatorrc.js'];

  {
    let homeDir = Cc['@mozilla.org/file/directory_service;1']
                    .getService(Ci.nsIProperties)
                    .get('ProfD', Ci.nsIFile)
                    .path;
    let profileName = homeDir.replace(/.*[\\\/]/, '').replace(/.+?\./, '');

    let runtimepath, option = options.get('runtimepath');

    // プロファイル別のディレクトリからロードするように細工
    if (option) {
      let root = option.get();
      runtimepath = root + '/' + profileName;
      if (io.getFile(runtimepath).exists()) {
        option.set(runtimepath);
      } else {
        option.set(root + '/' + defaultName);
      }
    } else {
      let root = vimp12root 
                 || 
                 ('~/' + (navigator.platform == 'Win32' ? '' : '.') + config.name.toLowerCase() + '/');
      runtimepath = root + profileName;
      let dir = io.getFile(runtimepath);
      if (!dir.exists())
        runtimepath = root + defaultName;
      io.getSpecialDirectory = function (directory) {
        let pluginDir = ioManager.getFile(ioManager.expandPath(runtimepath + '/' + directory));
        return pluginDir.exists() && pluginDir.isDirectory() ? pluginDir : null;
      };
    }

    // それぞれのディレクトリから rc を読む
    // ねこのかわいさは異常
    rcFilenames.forEach(function (filename) {
      let file = io.getFile(runtimepath + '/' + filename);
      if (file.exists() && file.isFile())
        io.source(file.path);
    });
  }
}
EOM

OS識別

Win32じゃないときは "." を付加するように修正。