about summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs')
-rwxr-xr-xpkgs/aacolorize/aacolorize.py182
-rw-r--r--pkgs/aacolorize/default.nix13
-rw-r--r--pkgs/axbo/default.nix77
-rw-r--r--pkgs/beehive/default.nix16
-rw-r--r--pkgs/beehive/godeps.nix378
-rw-r--r--pkgs/blop/default.nix16
-rw-r--r--pkgs/default.nix24
-rw-r--r--pkgs/gajim/config.patch80
-rw-r--r--pkgs/grandpa/default.nix19
-rw-r--r--pkgs/kpatches/bfqsched.nix44
-rw-r--r--pkgs/libcmt/default.nix25
-rw-r--r--pkgs/librxtx-java/default.nix29
-rw-r--r--pkgs/lockdev/default.nix23
-rw-r--r--pkgs/nixops/default.nix47
-rw-r--r--pkgs/pvolctrl/default.nix35
-rw-r--r--pkgs/sidplayfp/default.nix29
-rw-r--r--pkgs/tkabber-urgent-plugin/default.nix26
-rw-r--r--pkgs/tomahawk/default.nix59
-rw-r--r--pkgs/twitchstream/default.nix112
-rw-r--r--pkgs/vim/default.nix333
20 files changed, 1170 insertions, 397 deletions
diff --git a/pkgs/aacolorize/aacolorize.py b/pkgs/aacolorize/aacolorize.py
new file mode 100755
index 00000000..ff19b687
--- /dev/null
+++ b/pkgs/aacolorize/aacolorize.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python
+import os
+import sys
+
+from optparse import Option, OptionParser
+
+COLORS = {
+    "k": (30, "Black"),
+    "r": (31, "Red"),
+    "g": (32, "Green"),
+    "y": (33, "Yellow"),
+    "b": (34, "Blue"),
+    "p": (35, "Pink"),
+    "c": (36, "Cyan"),
+    "w": (37, "White"),
+}
+
+ESC = chr(27)
+
+class ColorizeError(Exception):
+    pass
+
+class Color(object):
+    def __init__(self, ident=None):
+        """
+        Initialize a color object, if no `ident` is given or it's invalid,
+        the Color object represents "no color".
+        """
+        if ident is not None:
+            spec = COLORS.get(ident.lower(), None)
+        else:
+            spec = None
+
+        if spec is None:
+            self.ident = None
+            self.bold = False
+            self.code = None
+            self.name = "None"
+        else:
+            self.ident = ident
+            self.code, self.name = spec
+
+            if ident.isupper():
+                self.bold = True
+            else:
+                self.bold = False
+
+    @property
+    def attrs(self):
+        """
+        A tuple consisting of the SGR attributes.
+        """
+        if self.ident is None:
+            return ()
+
+        if self.bold:
+            return (1, self.code)
+        else:
+            return (self.code,)
+
+    def sgr_attrs(self, *attrs):
+        """
+        Return the attributes specified by `attrs` formatted according
+        to the CSI specification.
+        """
+        return ';'.join(map(lambda c: str(c), attrs))
+
+    def sgr(self, *attrs):
+        """
+        Start Set Graphics Rendition
+        Return the CSI escape code for `attrs`.
+        """
+        return "%s[%sm" % (ESC, self.sgr_attrs(*attrs))
+
+    def sgr_start(self):
+        """
+        Start Set Graphics Rendition
+        Return the CSI start escape code for the current color.
+        """
+        return self.sgr(*self.attrs)
+
+    def sgr_stop(self):
+        """
+        Clear Set Graphics Rendition
+        """
+        return self.sgr()
+
+    def apply(self, value):
+        """
+        Apply the current color to the string in `value`.
+        """
+        return "%s%s%s" % (self.sgr_start(), value, self.sgr_stop())
+
+    def describe(self):
+        """
+        Return the description of the current color IN color :-)
+        """
+        fmt = "%c: <ESC>[%sm -> [%s]"
+        return fmt % (
+            self.ident,
+            self.sgr_attrs(*self.attrs),
+            self.apply(self.name)
+        )
+
+    def transform_to(self, new_color):
+        """
+        Return the CSI sequences needed to transform into `new_color`.
+        """
+        if self.ident is None and new_color.ident is not None:
+            return new_color.sgr_start()
+        elif self.ident is not None and new_color.ident is None:
+            return self.sgr_stop()
+        elif self.ident is None and new_color.ident is None:
+            return ''
+        elif self.code == new_color.code:
+            if not self.bold and new_color.bold:
+                return self.sgr(1)
+            elif self.bold and not new_color.bold:
+                return self.sgr(22)
+            elif self.bold == new_color.bold:
+                return ''
+        else:
+            if self.bold and new_color.bold:
+                return new_color.sgr(new_color.code)
+
+        return self.sgr_stop()+new_color.sgr_start()
+
+    def __repr__(self):
+        if self.bold:
+            return "<Bold color %s>" % self.name.lower()
+        else:
+            return "<Color %s>" % self.name.lower()
+
+def print_colortable():
+    for ident in COLORS.iterkeys():
+        normal = Color(ident).describe()
+        bold = Color(ident.upper()).describe()
+        sys.stdout.write("%-35s%s\n" % (normal, bold))
+
+def colorize_art(art, colmap):
+    if len(art) != len(colmap):
+        raise ColorizeError("Art and colormap differ in size!")
+
+    no_color = Color()
+
+    out = ""
+    last_color = no_color
+    for i, char in enumerate(colmap):
+        color = Color(char)
+        out += last_color.transform_to(color) + art[i]
+        last_color = color
+
+    last_color.transform_to(no_color)
+
+    return out
+
+def colorize_file(artfile, mapfile=None):
+    if mapfile is None:
+        mapfile = os.path.splitext(artfile)[0]+'.colmap'
+
+    asciiart = open(artfile, 'r').read()
+    colormap = open(mapfile, 'r').read()
+
+    return colorize_art(asciiart, colormap)
+
+if __name__ == "__main__":
+    parser = OptionParser(usage="%prog [options] artfile [mapfile]")
+    parser.add_option("-t", "--table", action="store_true", dest="table",
+                      help="Show color table and exit.")
+
+    (options, args) = parser.parse_args()
+
+    if options.table:
+        print_colortable()
+        parser.exit()
+
+    if not len(args) in (1, 2):
+        parser.print_help()
+        parser.exit()
+    else:
+        colorized = colorize_file(*args)
+        sys.stdout.write(colorized)
diff --git a/pkgs/aacolorize/default.nix b/pkgs/aacolorize/default.nix
new file mode 100644
index 00000000..a7a3c3f1
--- /dev/null
+++ b/pkgs/aacolorize/default.nix
@@ -0,0 +1,13 @@
+{ buildPythonPackage, runCommand }:
+
+buildPythonPackage {
+  name = "aacolorize";
+  src = runCommand "aacolorize-src" {} ''
+    mkdir -p "$out"
+    cp "${./aacolorize.py}" "$out/aacolorize"
+    cat > "$out/setup.py" <<SETUP
+    from distutils.core import setup
+    setup(name='aacolorize', scripts=['aacolorize'])
+    SETUP
+  '';
+}
diff --git a/pkgs/axbo/default.nix b/pkgs/axbo/default.nix
new file mode 100644
index 00000000..d83e891d
--- /dev/null
+++ b/pkgs/axbo/default.nix
@@ -0,0 +1,77 @@
+{ stdenv, fetchurl, oraclejre, librxtx_java, makeFontsConf, dejavu_fonts }:
+
+stdenv.mkDerivation rec {
+  name = "axbo-research-${version}";
+  version = "2.0.18";
+
+  src = fetchurl {
+    url = let
+      urlversion = stdenv.lib.replaceChars ["."] ["_"] version;
+    in "https://www.dropbox.com/s/shy0yqcyivonobi/aXbo_unix_${urlversion}.sh";
+    sha256 = "1zc3bpqfa5pdpl7masigvv98mi5phl04p80fyd2ink33xbmik70z";
+  };
+
+  buildInputs = [ oraclejre librxtx_java ];
+
+  unpackCmd = let
+    fontconfigFile = makeFontsConf {
+      fontDirectories = stdenv.lib.singleton dejavu_fonts;
+    };
+  in ''
+    datalen="$(sed -n 's/^.*totalDataLength=\([0-9]\+\).*$/\1/p' "$src")"
+    installer_offset="$(sed -n 's/^ *tail *-c *\([0-9]\+\).*$/\1/p' "$src")"
+
+    installer_dir="$(mktemp -d)"
+    mkdir -p "$installer_dir"
+    tail -c "$installer_offset" "$src" | tar xz -C "$installer_dir"
+
+    cat > "$installer_dir/responses" <<EOF
+    executeLauncherAction$Boolean=false
+    sys.programGroup.linkDir=/dev/null
+    sys.component.73$Boolean=true
+    sys.languageId=en
+    sys.installationDir=$(pwd)/${name}
+    sys.programGroup.enabled$Boolean=false
+    sys.programGroup.allUsers$Boolean=true
+    sys.programGroup.name=aXbo
+    EOF
+
+    cd "$installer_dir"
+    export FONTCONFIG_FILE="${fontconfigFile}"
+    java -client -Dinstall4j.jvmDir="${oraclejre}" \
+                 -Dexe4j.moduleName="$src" \
+                 -Dexe4j.totalDataLength="$datalen" \
+                 -Dinstall4j.cwd="$installer_dir" \
+                 -Djava.ext.dirs="${oraclejre}/lib/ext" \
+                 -Dsun.java2d.noddraw=true \
+                 -classpath i4jruntime.jar:user.jar \
+                 com.install4j.runtime.Launcher launch \
+                 com.install4j.runtime.installer.Installer \
+                 false false "" "" false true false "" true true \
+                 0 0 "" 20 20 Arial 0,0,0 8 500 'version 2.0.18' \
+                 20 40 Arial 0,0,0 8 500 \
+                 -1 -q -varfile "$installer_dir/responses"
+    cd -
+    rm -rf "$installer_dir"
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/libexec/lib" "$out/bin"
+    for jarfile in lib/*; do
+      case "''${jarfile##*/}" in
+        axbo.jar) cp -vt "$out/libexec" "$jarfile";;
+        RXTXcomm.jar) ln -s "${librxtx_java}/lib/java/RXTXcomm.jar" \
+                            "$out/libexec/lib";;
+        *.jar) cp -vt "$out/libexec/lib" "$jarfile";;
+      esac
+    done
+
+    cat > "$out/bin/axbo-research" <<WRAPPER
+    #!${stdenv.shell}
+    ${oraclejre}/bin/java -Djava.library.path="${librxtx_java}/lib" \
+      -classpath "${librxtx_java}/lib/java/RXTXcomm.jar" \
+      -jar "$out/libexec/axbo.jar"
+    WRAPPER
+    chmod +x "$out/bin/axbo-research"
+  '';
+}
diff --git a/pkgs/beehive/default.nix b/pkgs/beehive/default.nix
deleted file mode 100644
index 8cadb9e5..00000000
--- a/pkgs/beehive/default.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{ goPackages, lib, fetchFromGitHub, fetchhg, fetchgit }:
-
-goPackages.buildGoPackage {
-  name = "beehive";
-  goPackagePath = "github.com/muesli/beehive";
-  src = fetchFromGitHub {
-    owner = "muesli";
-    repo = "beehive";
-    rev = "74a7fc4927b8ef14b199254e04630c24f44429f7";
-    sha256 = "1clgc6245yb3yxqdc14xj0f8hc8v4b9hgkv22c89zp0n1by8xrqx";
-  };
-  buildInputs = lib.mapAttrsToList (name: val: val) (import ./godeps.nix {
-    inherit (goPackages) buildGoPackage;
-    inherit lib fetchFromGitHub fetchhg fetchgit;
-  });
-}
diff --git a/pkgs/beehive/godeps.nix b/pkgs/beehive/godeps.nix
deleted file mode 100644
index a0e7526e..00000000
--- a/pkgs/beehive/godeps.nix
+++ /dev/null
@@ -1,378 +0,0 @@
-{ buildGoPackage, lib, fetchFromGitHub, fetchgit, fetchhg }:
-
-rec {
-  cascadia = buildGoPackage {
-    name = "cascadia";
-    goPackagePath = "code.google.com/p/cascadia";
-    src = fetchhg {
-      url = "https://code.google.com/p/cascadia";
-      rev = "5d796540e3cb93ea0556c897e6a3c7690f614d35";
-      sha256 = "1mxmj4vbh47j3nvmdqdah4fprkyww3pf8i9sy0zcar52bpa4j69c";
-    };
-    buildInputs = [ net ];
-  };
-
-  charset = buildGoPackage {
-    name = "go-charset";
-    goPackagePath = "code.google.com/p/go-charset";
-    src = fetchhg {
-      url = "https://code.google.com/p/go-charset";
-      rev = "ebbeafdc430eb6c7e44e9a730a38eaff4c56ba3a";
-      sha256 = "162jd0ryvwaj7bwxbdwrs1vi6ig3bhd6m4n16wf54frrzyqxh34p";
-    };
-  };
-
-  gonet = buildGoPackage {
-    name = "go.net";
-    goPackagePath = "code.google.com/p/go.net";
-    src = fetchhg {
-      url = "https://code.google.com/p/go.net";
-      rev = "937a34c9de13c766c814510f76bca091dee06028";
-      sha256 = "1f91yzjllw2pdk68yjvf8hjix4mrlqn7fh97h9n7qjy903rwnb9q";
-    };
-    buildInputs = [ net text ];
-  };
-
-  gomock = buildGoPackage {
-    name = "gomock";
-    goPackagePath = "code.google.com/p/gomock";
-    src = fetchgit {
-      url = "https://code.google.com/p/gomock";
-      rev = "e033c7513ca3d743bbb64df299bdec29e93fed03";
-      sha256 = "0vmpqibyx09bdqnqsy8g4xiw3hpw0j9kww7ak2z7fdzxpd9ly337";
-    };
-  };
-
-  anaconda = buildGoPackage {
-    name = "anaconda";
-    goPackagePath = "github.com/ChimeraCoder/anaconda";
-    src = fetchFromGitHub {
-      owner = "ChimeraCoder";
-      repo = "anaconda";
-      rev = "964821c05001e5a38dd234d681ce9a929858481a";
-      sha256 = "077fxb4iazsjfsbmj966ifias84agxbzip742w9cbc7fv1bpy085";
-    };
-    buildInputs = [ tokenbucket jsonpointer oauth ];
-  };
-
-  tokenbucket = buildGoPackage {
-    name = "tokenbucket";
-    goPackagePath = "github.com/ChimeraCoder/tokenbucket";
-    src = fetchFromGitHub {
-      owner = "ChimeraCoder";
-      repo = "tokenbucket";
-      rev = "c5a927568de7aad8a58127d80bcd36ca4e71e454";
-      sha256 = "1cyzlvk1mgdvdfmqsdsy5y2rflfz5q54a9rz9jylc2mg40c1d6dq";
-    };
-  };
-
-  gotumblr = buildGoPackage {
-    name = "gotumblr";
-    goPackagePath = "github.com/MariaTerzieva/gotumblr";
-    src = fetchFromGitHub {
-      owner = "MariaTerzieva";
-      repo = "gotumblr";
-      rev = "62f45d64049aeab0b3835351edc66704c7210f7a";
-      sha256 = "06bqc6c4j9g8l0xqhc9g5jmx4q6dq5jid5bpj4skca30gsqgldgr";
-    };
-    buildInputs = [ oauth1a ];
-  };
-
-  goquery = buildGoPackage {
-    name = "goquery";
-    goPackagePath = "github.com/PuerkitoBio/goquery";
-    src = fetchFromGitHub {
-      owner = "PuerkitoBio";
-      repo = "goquery";
-      rev = "4cf64c51f7e80d56d9ae2ffe7d684d3dd5dbd5d0";
-      sha256 = "1d6cl0qhfx9ngj3hn56mxwwy7yak62c5wxa77f7yfarql84r8h4n";
-    };
-    buildInputs = [ cascadia net ];
-  };
-
-  GoOse = buildGoPackage {
-    name = "GoOse";
-    goPackagePath = "github.com/advancedlogic/GoOse";
-    src = fetchFromGitHub {
-      owner = "advancedlogic";
-      repo = "GoOse";
-      rev = "e210b2436fec0a3ce1b5f9209ee3340314b408e2";
-      sha256 = "0sjqy295x9rn93b5k3r8hdbi5gjbdd3h2dn89v4nzpnzmlrfbc2c";
-    };
-    buildInputs = [ cascadia charset gojs-config goquery net latinx set ];
-  };
-
-  gojs-config = buildGoPackage {
-    name = "gojs-config";
-    goPackagePath = "github.com/advancedlogic/gojs-config";
-    src = fetchFromGitHub {
-      owner = "advancedlogic";
-      repo = "gojs-config";
-      rev = "bff36193fca8bd2f6269e8c4e8c723991fd20565";
-      sha256 = "1k0wgn3pj384sqai2c9dkv06j0z439i3xqzfl3kplb0wdf8a2vy0";
-    };
-  };
-
-  latinx = buildGoPackage {
-    name = "latinx";
-    goPackagePath = "github.com/bjarneh/latinx";
-    src = fetchFromGitHub {
-      owner = "bjarneh";
-      repo = "latinx";
-      rev = "4dfe9ba2a293f28a5e06fc7ffe56b1d71a47b8c8";
-      sha256 = "0lavz5m0dz1rxyl20var3xqj2ndcmai2v893p83pjwm4333yb5g0";
-    };
-  };
-
-  jsonpointer = buildGoPackage {
-    name = "go-jsonpointer";
-    goPackagePath = "github.com/dustin/go-jsonpointer";
-    src = fetchFromGitHub {
-      owner = "dustin";
-      repo = "go-jsonpointer";
-      rev = "75939f54b39e7dafae879e61f65438dadc5f288c";
-      sha256 = "1vcv5xb6v6akbbi71q4srfla311s4p9kspqya2h40x8fxx00lkxp";
-    };
-    propagatedBuildInputs = [ gojson ];
-  };
-
-  gojson = buildGoPackage {
-    name = "gojson";
-    goPackagePath = "github.com/dustin/gojson";
-    src = fetchFromGitHub {
-      owner = "dustin";
-      repo = "gojson";
-      rev = "af16e0e771e2ed110f2785564ae33931de8829e4";
-      sha256 = "0626n6a5hwb0zwi6dwsmqdv2g5fwzsfx22rbxscaydpb90b6qnin";
-    };
-  };
-
-  restful = buildGoPackage {
-    name = "go-restful";
-    goPackagePath = "github.com/emicklei/go-restful";
-    src = fetchFromGitHub {
-      owner = "emicklei";
-      repo = "go-restful";
-      rev = "7ef8ec372029a3112fdb94a53b1ca8eedf666e67";
-      sha256 = "0rrpa9xiqkzapn6axjl19nnhxk0ljjq20a8jpam80hkzw4waa955";
-    };
-    postPatch = ''
-      rm -rf examples
-    '';
-    buildInputs = [ schema ];
-  };
-
-  goirc = buildGoPackage {
-    name = "goirc";
-    goPackagePath = "github.com/fluffle/goirc";
-    src = fetchFromGitHub {
-      owner = "fluffle";
-      repo = "goirc";
-      rev = "0cac69d2eec69bb08bb29b776d045a78b9699791";
-      sha256 = "0iba19rslsyww3qsf9d4ncdxjjz7pv8k36ar5s1i6f4fwv42d56q";
-    };
-    buildInputs = [ glog golog gomock ];
-  };
-
-  golog = buildGoPackage {
-    name = "golog";
-    goPackagePath = "github.com/fluffle/golog";
-    src = fetchFromGitHub {
-      owner = "fluffle";
-      repo = "golog";
-      rev = "3b86dae249b53d7dc2d9e817ff019fa01a155b06";
-      sha256 = "0b8fzkk9bshkfsnbx2nq6dn0dcngsh5awpym98sinkkfwywvlq2f";
-    };
-    buildInputs = [ gomock ];
-  };
-
-  oauth = buildGoPackage {
-    name = "go-oauth";
-    goPackagePath = "github.com/garyburd/go-oauth";
-    src = fetchFromGitHub {
-      owner = "garyburd";
-      repo = "go-oauth";
-      rev = "fa02955a8929c2f007c533fbdfb8ddc91bb6a731";
-      sha256 = "0zx9azdhjxf18fk4y3hnp70cz75iyllqfvfxma02i8f63q364d94";
-    };
-    postPatch = ''
-      rm -rf examples
-    '';
-  };
-
-  glog = buildGoPackage {
-    name = "glog";
-    goPackagePath = "github.com/golang/glog";
-    src = fetchFromGitHub {
-      owner = "golang";
-      repo = "glog";
-      rev = "44145f04b68cf362d9c4df2182967c2275eaefed";
-      sha256 = "1k7sf6qmpgm0iw81gx2dwggf9di6lgw0n54mni7862hihwfrb5rq";
-    };
-  };
-
-  protobuf = buildGoPackage {
-    name = "protobuf";
-    goPackagePath = "github.com/golang/protobuf";
-    src = fetchFromGitHub {
-      owner = "golang";
-      repo = "protobuf";
-      rev = "f7137ae6b19afbfd61a94b746fda3b3fe0491874";
-      sha256 = "05n1ws6y9qpp3imxjvl3jnknq6kca2vc5g475fqr2l67ap3w5lwk";
-    };
-    subPackages = [ "proto" "protoc-gen-go" ];
-  };
-
-  schema = buildGoPackage {
-    name = "schema";
-    goPackagePath = "github.com/gorilla/schema";
-    src = fetchFromGitHub {
-      owner = "gorilla";
-      repo = "schema";
-      rev = "c8422571edf3131506bab7df27e18980fe2598d5";
-      sha256 = "10czpd111l834aam52bh1cxv31pq4h8mi1w994v4848rmbw3jpp4";
-    };
-  };
-
-  dbus = buildGoPackage {
-    name = "go.dbus";
-    goPackagePath = "github.com/guelfey/go.dbus";
-    src = fetchFromGitHub {
-      owner = "guelfey";
-      repo = "go.dbus";
-      rev = "f6a3a2366cc39b8479cadc499d3c735fb10fbdda";
-      sha256 = "15rnpvclg4b3cblcxwwgkdfgamhigiyla0s1rwhfjraqhn94r3ph";
-    };
-    postPatch = ''
-      rm -rf _examples
-    '';
-  };
-
-  web = buildGoPackage {
-    name = "web";
-    goPackagePath = "github.com/hoisie/web";
-    src = fetchFromGitHub {
-      owner = "hoisie";
-      repo = "web";
-      rev = "5a66d0fa07a54688eba8fa506576a78a942ef243";
-      sha256 = "1h4ary4ac51xznr41996k3xqlclm3r5mjba71y6anfwdrhaa2qf1";
-    };
-    buildInputs = [ gonet ];
-    postPatch = ''
-      rm -rf examples
-    '';
-  };
-
-  goserial = buildGoPackage {
-    name = "goserial";
-    goPackagePath = "github.com/huin/goserial";
-    src = fetchFromGitHub {
-      owner = "huin";
-      repo = "goserial";
-      rev = "7b90efdb22b1c168a57b998b2780cf541b2c4740";
-      sha256 = "05ha3yvhvbfrbxlqi8x1fwcliginw0vxhh76mh6vycn9n7yjpacy";
-    };
-  };
-
-  rss = buildGoPackage {
-    name = "go-pkg-rss";
-    goPackagePath = "github.com/jteeuwen/go-pkg-rss";
-    src = fetchFromGitHub {
-      owner = "jteeuwen";
-      repo = "go-pkg-rss";
-      rev = "2382fc0262cb000be19e9042cdbc8459105b4f00";
-      sha256 = "0rss5sj128qwai60wpkm5cy2q8d9yfakdm4pqb8p4lhgpq26g05h";
-    };
-    buildInputs = [ xmlx ];
-  };
-
-  xmlx = buildGoPackage {
-    name = "go-pkg-xmlx";
-    goPackagePath = "github.com/jteeuwen/go-pkg-xmlx";
-    src = fetchFromGitHub {
-      owner = "jteeuwen";
-      repo = "go-pkg-xmlx";
-      rev = "cf505b97c711dd1c5a4682f68ea04dd35e385b8f";
-      sha256 = "01pdjndl1i0p7lr8svi1j0f79zyl36s0xn7yb8d8yziksbczbcrj";
-    };
-  };
-
-  oauth1a = buildGoPackage {
-    name = "oauth1a";
-    goPackagePath = "github.com/kurrik/oauth1a";
-    src = fetchFromGitHub {
-      owner = "kurrik";
-      repo = "oauth1a";
-      rev = "fc2542bc5f2532ed4a437960d2d51ff6e18a5cb6";
-      sha256 = "1v9zsn80y5x5fklc7q8rxixjrh5g01rsdlz247lgf3rag0hb3d39";
-    };
-  };
-
-  xmpp = buildGoPackage {
-    name = "go-xmpp";
-    goPackagePath = "github.com/mattn/go-xmpp";
-    src = fetchFromGitHub {
-      owner = "mattn";
-      repo = "go-xmpp";
-      rev = "8b13d0ad771420685f85ed09d8e9bf81757e7e20";
-      sha256 = "022all0cphxmrg015jzfsqd5xd5nli7fpw32wx6ql79s4rsy3bwb";
-    };
-    postPatch = ''
-      rm -rf _example
-    '';
-  };
-
-  goefa = buildGoPackage {
-    name = "goefa";
-    goPackagePath = "github.com/michiwend/goefa";
-    src = fetchFromGitHub {
-      owner = "michiwend";
-      repo = "goefa";
-      rev = "381f3d7b77fc04d9a81d2bc9e3e6d2fc742757b1";
-      sha256 = "1aiiafbpvw2xlvjgh27mfljd3d0j443iz7sp9w9w3109ay1q2gk4";
-    };
-    buildInputs = [ charset ];
-  };
-
-  hue = buildGoPackage {
-    name = "go.hue";
-    goPackagePath = "github.com/muesli/go.hue";
-    src = fetchFromGitHub {
-      owner = "muesli";
-      repo = "go.hue";
-      rev = "8aefcc693cafb5b2b4ef8ca8d51ab880849e8c12";
-      sha256 = "158q3g5rg9wra1wxkvyb1c2v868gp9mslhf6gmbifj516lsb1agi";
-    };
-  };
-
-  net = buildGoPackage {
-    name = "net";
-    goPackagePath = "golang.org/x/net";
-    src = fetchgit {
-      url = "https://go.googlesource.com/net";
-      rev = "97d8e4e174133a4d1d2171380e510eb4dea8f5ea";
-      sha256 = "0jydngilxhgw8f1zgz11hbjk87bhj0jpar89a2py1pii4ncx9w04";
-    };
-    buildInputs = [ text ];
-  };
-
-  text = buildGoPackage {
-    name = "text";
-    goPackagePath = "golang.org/x/text";
-    src = fetchgit {
-      url = "https://go.googlesource.com/text";
-      rev = "26df76be81cdb060ed9820481a0d67b2d0b04ac2";
-      sha256 = "1vmgzzi0r1idjfgfwibq2r3xlnab3w2v6nmm3c5l2bb994w376gn";
-    };
-  };
-
-  set = buildGoPackage {
-    name = "set.v0";
-    goPackagePath = "gopkg.in/fatih/set.v0";
-    src = fetchgit {
-      url = "https://gopkg.in/fatih/set.v0";
-      rev = "27c40922c40b43fe04554d8223a402af3ea333f3";
-      sha256 = "1d8yz8p4jvyqvmpim40x5y7kj91c5hcc5hbmxhv0j32ifz01nacl";
-    };
-  };
-}
diff --git a/pkgs/blop/default.nix b/pkgs/blop/default.nix
new file mode 100644
index 00000000..6f1f49c5
--- /dev/null
+++ b/pkgs/blop/default.nix
@@ -0,0 +1,16 @@
+{ stdenv, fetchurl, ladspaH }:
+
+stdenv.mkDerivation rec {
+  name = "blop-${version}";
+  version = "0.2.8";
+
+  configureFlags = [
+    "--with-ladspa-prefix=${ladspaH}"
+    "--with-ladspa-plugin-dir=$(out)/lib/ladspa"
+  ];
+
+  src = fetchurl {
+    url = "mirror://sourceforge/blop/${name}.tar.gz";
+    sha256 = "02iymw84dml8glyqgx1mxq4fz2fifgi1jca28hx2r3a2mi7i71vy";
+  };
+}
diff --git a/pkgs/default.nix b/pkgs/default.nix
index 9ff952ed..d156deff 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -1,9 +1,27 @@
-{ pkgs ? import <nixpkgs> {} }:
+{ pkgs ? import <nixpkgs> {}
+}:
 
 let
   callPackage = pkgs.lib.callPackageWith (pkgs // self);
 
   self = {
-    beehive = callPackage ./beehive {};
+    aacolorize = callPackage ./aacolorize { };
+    axbo = callPackage ./axbo { };
+    blop = callPackage ./blop { };
+    grandpa = callPackage ./grandpa { };
+    nixops = callPackage ./nixops { };
+    libCMT = callPackage ./libcmt { };
+    librxtx_java = callPackage ./librxtx-java { };
+    lockdev = callPackage ./lockdev { };
+    pvolctrl = callPackage ./pvolctrl { };
+    sidplayfp = callPackage ./sidplayfp { };
+    tkabber_urgent_plugin = callPackage ./tkabber-urgent-plugin { };
+    tomahawk = callPackage ./tomahawk { };
+    twitchstream = callPackage ./twitchstream { };
+    vim = callPackage ./vim { };
+
+    vuizvuiKernelPatches = {
+      bfqsched = callPackage ./kpatches/bfqsched.nix { };
+    };
   };
-in self
+in { vuizvui = self; }
diff --git a/pkgs/gajim/config.patch b/pkgs/gajim/config.patch
new file mode 100644
index 00000000..fcfcc371
--- /dev/null
+++ b/pkgs/gajim/config.patch
@@ -0,0 +1,80 @@
+diff --git a/src/common/optparser.py b/src/common/optparser.py
+index f84b18a..0078317 100644
+--- a/src/common/optparser.py
++++ b/src/common/optparser.py
+@@ -30,6 +30,7 @@ import os
+ import sys
+ import locale
+ import re
++from itertools import chain
+ from time import time
+ from common import gajim
+ from common import helpers
+@@ -46,19 +47,25 @@ class OptionsParser:
+ 
+     def read(self):
+         try:
+-            fd = open(self.__filename)
++            cfg = nixfd = open("@nix_config@", 'r')
+         except Exception:
+             if os.path.exists(self.__filename):
+                 #we talk about a file
+                 print _('Error: cannot open %s for reading') % self.__filename
+             return False
+ 
++        try:
++            fd = open(self.__filename)
++            cfg = chain(cfg, fd)
++        except Exception:
++            fd = None
++
+         new_version = gajim.config.get('version')
+         new_version = new_version.split('-', 1)[0]
+         seen = set()
+         regex = re.compile(r"(?P<optname>[^.=]+)(?:(?:\.(?P<key>.+))?\.(?P<subname>[^.=]+))?\s=\s(?P<value>.*)")
+ 
+-        for line in fd:
++        for line in cfg:
+             try:
+                 line = line.decode('utf-8')
+             except UnicodeDecodeError:
+@@ -79,10 +86,13 @@ class OptionsParser:
+         self.update_config(old_version, new_version)
+         self.old_values = {} # clean mem
+ 
+-        fd.close()
++        if fd is not None:
++            fd.close()
++
++        nixfd.close()
+         return True
+ 
+-    def write_line(self, fd, opt, parents, value):
++    def write_line(self, (fd, nixcfg), opt, parents, value):
+         if value is None:
+             return
+         value = value[1]
+@@ -102,17 +112,21 @@ class OptionsParser:
+                     p = p.encode('utf-8')
+                 s += p + '.'
+         s += opt
+-        fd.write(s + ' = ' + value + '\n')
++        line = s + ' = ' + value + '\n'
++        if not nixcfg.startswith(line) and not ('\n' + line) in nixcfg:
++            fd.write(line)
+ 
+     def write(self):
+         (base_dir, filename) = os.path.split(self.__filename)
+         self.__tempfile = os.path.join(base_dir, '.' + filename)
++
+         try:
++            nixcfg = open("@nix_config@", 'r').read()
+             f = open(self.__tempfile, 'w')
+         except IOError, e:
+             return str(e)
+         try:
+-            gajim.config.foreach(self.write_line, f)
++            gajim.config.foreach(self.write_line, (f, nixcfg))
+         except IOError, e:
+             return str(e)
+         f.flush()
diff --git a/pkgs/grandpa/default.nix b/pkgs/grandpa/default.nix
new file mode 100644
index 00000000..bc68f157
--- /dev/null
+++ b/pkgs/grandpa/default.nix
@@ -0,0 +1,19 @@
+{ fetchgit, buildPythonPackage, pythonPackages, cython, gpm }:
+
+pythonPackages.buildPythonPackage {
+  name = "grandpa-0.5";
+  namePrefix = "";
+
+  src = fetchgit {
+    url = "git://github.com/aszlig/GrandPA.git";
+    rev = "41f21f67446b98f4600bc043abe32b95af6dd048";
+    sha256 = "06sgz39ri0ai3x2fck44rczk04pj8zcysbhp97x20ggmqhx5vxyh";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ cython gpm ];
+  propagatedBuildInputs = with pythonPackages; [
+    bsddb curses pyserial pyglet
+  ];
+}
diff --git a/pkgs/kpatches/bfqsched.nix b/pkgs/kpatches/bfqsched.nix
new file mode 100644
index 00000000..ff7d8752
--- /dev/null
+++ b/pkgs/kpatches/bfqsched.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchurl }:
+
+let
+  bfqVersion = "v7r7";
+  kernelVersion = "3.19";
+  version = "${kernelVersion}.0-${bfqVersion}";
+
+  baseURL = "http://algo.ing.unimo.it/people/paolo/disk_sched/patches";
+
+  fetchPatch = { name, sha256 }: fetchurl {
+    url = "${baseURL}/${version}/${name}.patch";
+    inherit sha256;
+  };
+
+  allPatches = [
+    (fetchPatch {
+      name = "0001-block-cgroups-kconfig-build-bits-for-BFQ-"
+           + "${bfqVersion}-${kernelVersion}";
+      sha256 = "1qlk1hcirf3x9h80f9crnyqgxvw79xi89rwv0sh4hsd1lw3sbi7s";
+    })
+    (fetchPatch {
+      name = "0002-block-introduce-the-BFQ-"
+           + "${bfqVersion}-I-O-sched-for-${kernelVersion}";
+      sha256 = "04fbynd6k7g92rbyciswx3mswxr0amvp75wzdpn57wwjv5vlh7b2";
+    })
+    (fetchPatch {
+      name = "0003-block-bfq-add-Early-Queue-Merge-EQM-to-BFQ-"
+           + "${bfqVersion}-for-${kernelVersion}.0";
+      sha256 = "17ypb5y7wkr719vy00wm09szmqnlpzpvkcq5phivdxd27417828m";
+    })
+  ];
+
+  patch = stdenv.mkDerivation {
+    name = "bfqsched-${version}.patch";
+    inherit allPatches;
+    buildCommand = ''
+      cat $allPatches > "$out"
+    '';
+  };
+
+in {
+  name = "bfqsched-${version}";
+  inherit version patch;
+}
diff --git a/pkgs/libcmt/default.nix b/pkgs/libcmt/default.nix
new file mode 100644
index 00000000..e255ef25
--- /dev/null
+++ b/pkgs/libcmt/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, ladspaH }:
+
+stdenv.mkDerivation rec {
+  name = "libcmt-${version}";
+  version = "1.16";
+
+  buildInputs = [ ladspaH ];
+
+  setSourceRoot = ''
+    sourceRoot=cmt/src
+  '';
+
+  makeFlags = [
+    "INSTALL_PLUGINS_DIR=$(out)/lib/ladspa"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib/ladspa"
+  '';
+
+  src = fetchurl {
+    url = "http://www.ladspa.org/download/cmt_src_${version}.tgz";
+    sha256 = "0dan83pvljij3972bv214balc26p9fgw40i2d5y0x7lbd5z1saji";
+  };
+}
diff --git a/pkgs/librxtx-java/default.nix b/pkgs/librxtx-java/default.nix
new file mode 100644
index 00000000..861dc43b
--- /dev/null
+++ b/pkgs/librxtx-java/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, unzip, jdk, lockdev }:
+
+stdenv.mkDerivation rec {
+  name = "rxtx-${version}";
+  version = "2.2pre2";
+
+  src = fetchurl {
+    urls = [
+      "http://rxtx.qbang.org/pub/rxtx/${name}.zip"
+      "ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${name}.zip"
+    ];
+    sha256 = "00sv9604hkq81mshih0fhqfzn4mf01d6rish6vplsi0gfqz3fc1w";
+  };
+
+  buildInputs = [ unzip jdk lockdev ];
+
+  NIX_CFLAGS_COMPILE = "-DUTS_RELEASE=\"3.8.0\"";
+
+  configureFlags = [ "--enable-liblock" ];
+
+  makeFlags = [
+    "JHOME=$(out)/lib/java"
+    "RXTX_PATH=$(out)/lib"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib/java"
+  '';
+}
diff --git a/pkgs/lockdev/default.nix b/pkgs/lockdev/default.nix
new file mode 100644
index 00000000..52e78eb5
--- /dev/null
+++ b/pkgs/lockdev/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, perl }:
+
+let
+  baseurl = "ftp://ftp.debian.org/debian/pool/main/l/lockdev/";
+in stdenv.mkDerivation rec {
+  name = "lockdev-${version}";
+  version = "1.0.3";
+
+  buildInputs = [ perl ];
+
+  patches = stdenv.lib.singleton (fetchurl {
+    url = baseurl + "lockdev_1.0.3-1.5.diff.gz";
+    sha256 = "1l3pq1nfb5qx3i91cjaiz3c53368gw6m28a5mv9391n5gmsdmi3r";
+  });
+
+  NIX_CFLAGS_COMPILE = "-fPIC -D_PATH_LOCK=\"/tmp\"";
+  installFlags = [ "basedir=$(out)" ];
+
+  src = fetchurl {
+    url = baseurl + "lockdev_${version}.orig.tar.gz";
+    sha256 = "10lzhq6r2dn8y3ki7wlqsa8s3ndkf842bszcjw4dbzf3g9fn7bnc";
+  };
+}
diff --git a/pkgs/nixops/default.nix b/pkgs/nixops/default.nix
new file mode 100644
index 00000000..d9d96a5b
--- /dev/null
+++ b/pkgs/nixops/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchFromGitHub, fetchpatch, git }:
+
+let
+  rev = "9d7fbce08380107d3ff6e2546add817b4ac40ee0";
+  sha256 = "167silv9p27gayrlrzpm88rj60gj3hlxhkhnsp4ccpbvq6yw1wr3";
+
+  master = stdenv.mkDerivation rec {
+    name = "nixops-upstream-patched";
+
+    src = fetchFromGitHub {
+      owner = "NixOS";
+      repo = "nixops";
+      inherit rev sha256;
+    };
+
+    phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+
+    patches = [
+      (fetchpatch {
+        url = "https://github.com/NixOS/nixops/pull/201.diff";
+        sha256 = "1i5yycqayxggg3l1i6wk8lp64lqlxw5nmfya9fcrgmck8ls0rxid";
+      })
+      (fetchpatch rec {
+        name = "read-write-by-default.diff";
+        url = "https://github.com/aszlig/nixops/compare/"
+            + "NixOS:master...aszlig:${name}";
+        sha256 = "0a1jcqrqfi7dfvlha5r0609bzvin7p7nj523xxcrvwpgp6ag0zsa";
+      })
+    ];
+
+    patchFlags = "--merge -p1";
+
+    installPhase = ''
+      cp -a . "$out"
+    '';
+  };
+
+  release = import "${master}/release.nix" {
+    nixopsSrc = {
+      outPath = master;
+      inherit rev;
+      revCount = 0;
+      shortRev = builtins.substring 0 7 rev;
+    };
+    officialRelease = false;
+  };
+in stdenv.lib.getAttr stdenv.system release.build
diff --git a/pkgs/pvolctrl/default.nix b/pkgs/pvolctrl/default.nix
new file mode 100644
index 00000000..25edb27f
--- /dev/null
+++ b/pkgs/pvolctrl/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, pulseaudio }:
+
+stdenv.mkDerivation rec {
+  name = "pvolctrl-0.23";
+
+  unpackPhase = let
+    baseurl = "https://sites.google.com/site/guenterbartsch/blog/"
+            + "volumecontrolutilityforpulseaudio/";
+    makefile = fetchurl {
+      url = baseurl + "Makefile";
+      sha256 = "0l2ffvb617csk6h29y64v6ywhpcp7la6vvcip1w4nq0yry6jhrqz";
+    };
+    source = fetchurl {
+      url = baseurl + "pvolctrl.c";
+      sha256 = "0vcd5dlw9l47jpabwmmzdvlkn67fz55dr3sryyh56sl263mibjda";
+    };
+  in ''
+    mkdir -p "${name}"
+    sed -e 's|/usr/bin/||' "${makefile}" > "${name}/Makefile"
+    sed -e 's/PA_VOLUME_MAX/PA_VOLUME_NORM/
+    /avg_vol += (avg_vol \* vol_mod) \/ 100;/ {
+      s/(avg_vol/((int)PA_VOLUME_NORM/
+    }
+    /if (vol_mod)/i \
+      if (info->name == NULL || strncmp(info->name, "combined", 8) != 0) \
+        return;' "${source}" > "${name}/pvolctrl.c"
+    sourceRoot="${name}"
+  '';
+
+  installPhase = ''
+    install -D -T pvolctrl "$out/bin/pvolctrl"
+  '';
+
+  buildInputs = [ pkgconfig pulseaudio ];
+}
diff --git a/pkgs/sidplayfp/default.nix b/pkgs/sidplayfp/default.nix
new file mode 100644
index 00000000..4304d4e4
--- /dev/null
+++ b/pkgs/sidplayfp/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, pkgconfig, alsaLib, pulseaudio }:
+
+let
+  libsidplayfp = stdenv.mkDerivation rec {
+    name = "libsidplayfp-${version}";
+    version = "1.3.0";
+
+    src = fetchurl {
+      url = "mirror://sourceforge/sidplay-residfp/${name}.tar.gz";
+      sha256 = "1gd4pn445v3wzr95z1b8642w016dnhq2hi8dgpc9imxig4xhx47d";
+    };
+  };
+
+in stdenv.mkDerivation rec {
+  name = "sidplayfp-${version}";
+  version = "1.1.0.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/sidplay-residfp/${name}.tar.gz";
+    sha256 = "0m8gk4xw2g4s3rcc3qy7nw6i08ivijjnbf3b6s5y3ryysyjjmc50";
+  };
+
+  postPatch = ''
+    sed -i -e '/cerr.*\(Clear screen\|Move cursor\)/d' src/menu.cpp
+  '';
+
+  buildInputs = [ pkgconfig libsidplayfp alsaLib pulseaudio ];
+}
+
diff --git a/pkgs/tkabber-urgent-plugin/default.nix b/pkgs/tkabber-urgent-plugin/default.nix
new file mode 100644
index 00000000..b39e5ea8
--- /dev/null
+++ b/pkgs/tkabber-urgent-plugin/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchsvn, xlibs }:
+
+stdenv.mkDerivation {
+  name = "tkabber-urgent-plugin";
+
+  src = fetchsvn {
+    url = "http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urgent";
+    rev = 528;
+    sha256 = "1qr7i0559ad5y1l5h2gp8aix4nsfgm0bx7jqb030hgbxaw1xnbp5";
+  };
+
+  buildInputs = [ xlibs.libX11 ];
+
+  patchPhase = ''
+    sed -i -e 's|exec xwininfo|exec ${xlibs.xwininfo}/bin/xwininfo|' urgent.tcl
+  '';
+
+  buildPhase = ''
+    gcc -lX11 -o urgent urgent.c
+  '';
+
+  installPhase = ''
+    install -vd "$out/share/tkabber-plugins/urgent"
+    cp -vpt "$out/share/tkabber-plugins/urgent" urgent urgent.tcl
+  '';
+}
diff --git a/pkgs/tomahawk/default.nix b/pkgs/tomahawk/default.nix
new file mode 100644
index 00000000..16219e3b
--- /dev/null
+++ b/pkgs/tomahawk/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, fetchFromGitHub, cmake, pkgconfig, attica, boost, gnutls, libechonest
+, liblastfm, lucenepp, vlc, qca2, qca2_ossl, qjson, qt4, qtkeychain, quazip
+, sparsehash, taglib, websocketpp, makeWrapper
+
+, enableXMPP      ? true,  libjreen     ? null
+, enableKDE       ? false, kdelibs      ? null
+, enableTelepathy ? false, telepathy_qt ? null
+}:
+
+assert enableXMPP      -> libjreen     != null;
+assert enableKDE       -> kdelibs      != null;
+assert enableTelepathy -> telepathy_qt != null;
+
+let
+  quazipQt4 = quazip.override { qt = qt4; };
+in stdenv.mkDerivation rec {
+  name = "tomahawk-${version}";
+  version = "0.9.0-git";
+
+  src = fetchFromGitHub {
+    owner = "tomahawk-player";
+    repo = "tomahawk";
+    rev = "0ec1fa0ab6fd674ca4d898c30739eb058b85dbe5";
+    sha256 = "1lfxgi7qib99zzi4byvrz0ng6l51nvfdjciyhabdlqb286wkka2f";
+  };
+
+  cmakeFlags = [
+    "-DLUCENEPP_INCLUDE_DIR=${lucenepp}/include"
+    "-DLUCENEPP_LIBRARY_DIR=${lucenepp}/lib"
+  ];
+
+  buildInputs = [
+    cmake pkgconfig attica boost gnutls libechonest liblastfm lucenepp vlc
+    qca2 qjson qt4 qtkeychain quazipQt4 sparsehash taglib websocketpp
+    makeWrapper
+  ] ++ stdenv.lib.optional enableXMPP      libjreen
+    ++ stdenv.lib.optional enableKDE       kdelibs
+    ++ stdenv.lib.optional enableTelepathy telepathy_qt;
+
+  postInstall = let
+    pluginPath = stdenv.lib.concatStringsSep ":" [
+      "${qca2_ossl}/lib/qt4/plugins"
+    ];
+  in ''
+    for i in "$out"/bin/*; do
+      wrapProgram "$i" --prefix QT_PLUGIN_PATH : "${pluginPath}"
+    done
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "A multi-source music player";
+    homepage = "http://tomahawk-player.org/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.aszlig ];
+  };
+}
diff --git a/pkgs/twitchstream/default.nix b/pkgs/twitchstream/default.nix
new file mode 100644
index 00000000..543ad261
--- /dev/null
+++ b/pkgs/twitchstream/default.nix
@@ -0,0 +1,112 @@
+{ stdenv, fetchurl, writeScriptBin, ffmpeg_2, pulseaudio }:
+
+# FIXME: Clean up this whole file!
+
+with stdenv.lib;
+
+let
+  streams = {
+    dnyarri = {
+      width = 1920;
+      height = 1080;
+      monitor = 1;
+    };
+    mmrnmhrm = {
+      width = 1600;
+      height = 1280;
+      monitor = 1;
+    };
+  };
+
+  sumAttr = name: attrs: acc: acc + (getAttr name attrs);
+  maxAttr = name: attrs: acc: let
+    current = getAttr name attrs;
+  in if acc > current then acc else current;
+
+  fullwidth = fold (sumAttr "width") 0 (attrValues streams);
+  maxheight = fold (maxAttr "height") 0 (attrValues streams);
+
+  resolution = "1920x1080";
+  fps = 15;
+  quality = "slow";
+
+  encoder = let
+    aacenc = stdenv.mkDerivation rec {
+      name = "vo-aacenc-0.1.3";
+      src = fetchurl {
+        url = "mirror://sourceforge/opencore-amr/${name}.tar.gz";
+        sha256 = "0dhghm3c8pqrriwwyj5x9i0yf52fmdfijbgqqkvqvwarldvp86p5";
+      };
+    };
+    base = ffmpeg_2.override { x11grabSupport = true; };
+  in stdenv.lib.overrideDerivation base (attrs: {
+    configureFlags = attrs.configureFlags ++ [
+      "--enable-libpulse"
+      "--enable-version3"
+      "--enable-libvo-aacenc"
+    ];
+    preConfigure = ''
+      addPkgConfigPath "${pulseaudio}"
+      addPkgConfigPath "${aacenc}"
+    '';
+    NIX_CFLAGS_COMPILE = "-I${aacenc}/include -L${aacenc}/lib";
+    buildInputs = attrs.buildInputs ++ [ pulseaudio aacenc ];
+  });
+
+  script = let
+    combine = [
+      "color=c=black:s=1248x640 [surface]"
+      "[0:v] setpts=PTS-STARTPTS, scale=680x540 [left]"
+      "[1:v] setpts=PTS-STARTPTS, scale=568x640 [right]"
+      "[surface][left] overlay=0:0 [leftonly]"
+      "[leftonly][right] overlay=680:0 [out]"
+    ];
+  /*
+    combine = [
+      "color=c=black:s=${toString fullwidth}x${toString maxheight} [surface]"
+      "[surface][0:v] overlay=0:0 [leftonly]"
+      "[leftonly][1:v] overlay=${toString streams.dnyarri.width}:0 [out]"
+    ];
+  */
+    nop = x: "\\";
+  in ''
+    #!${stdenv.shell}
+    keyfile="$HOME/.twitch.key"
+    if [ ! -e "$keyfile" ]; then
+      echo "You need to put your streaming key into $keyfile!" >&2
+      echo "To obtain the key, please visit the following URL:" >&2
+      echo "http://www.twitch.tv/broadcast/dashboard/streamkey" >&2
+      exit 1
+    fi
+
+    ${encoder}/bin/ffmpeg -loglevel warning \
+      -f x11grab -s "${resolution}" -r "${toString fps}" -i "$DISPLAY+1920,0" \
+      -f pulse -ac 2 -i default \
+      -codec:v libx264 -s 1280x720 -preset:v fast -crf 24 -pix_fmt yuv420p \
+      -codec:a libvo_aacenc -ar 44100 -threads auto -b:a 128k -bufsize 8k \
+      -f flv "rtmp://live-fra.twitch.tv/app/$(< "$keyfile")" "$@"
+  '';
+
+  disabled = ''
+    ${encoder}/bin/ffmpeg \
+      -f x11grab -s "${resolution}" -r "${toString fps}" -i "$DISPLAY+1920,0" \
+      ${nop ''
+      -i 'tcp://dnyarri:7891?listen' \
+      ''}
+      -f pulse -ac 2 -i default \
+      ${nop ''
+      -filter_complex "${concatStringsSep "; " combine}" \
+      -map "[out]" -map 2:a,0:v \
+      -c:v libx264 -preset "${quality}" -s 1280x720 \
+                   -b 2500k -minrate 2500k -maxrate 2500k \
+                   -tune film -qscale:v 1 -threads:v 4 -crf 1 -tune animation \
+      -c:a libmp3lame -ar 44100 -qscale:a 1 -bufsize 512k -threads 4 \
+      -framerate "${toString fps}" \
+      -force_key_frames 2 -b 2500k -minrate 2500k -maxrate 2500k \
+      -g 2 -keyint_min 2 \
+      ''}
+      -c:v libx264 -preset fast -pix_fmt yuv420p -s 1280x800 -threads 0 \
+      -c:a libmp3lame -ab 128k -ar 44100 -threads 0 \
+      -f flv "rtmp://live-fra.twitch.tv/app/$(< "$keyfile")" "$@"
+  '';
+in writeScriptBin "twitchstream" script
diff --git a/pkgs/vim/default.nix b/pkgs/vim/default.nix
new file mode 100644
index 00000000..f753b453
--- /dev/null
+++ b/pkgs/vim/default.nix
@@ -0,0 +1,333 @@
+{ stdenv, lib, writeTextFile, writeText, buildEnv
+, fetchurl, fetchFromGitHub, vim_configurable
+}:
+
+let
+  fetchVimScript = { srcId, sha256, type, name }: let
+    baseUrl = "http://www.vim.org/scripts/download_script.php";
+    src = fetchurl {
+      name = "script${toString srcId}.vim";
+      url = "${baseUrl}?src_id=${toString srcId}";
+      inherit sha256;
+    };
+  in stdenv.mkDerivation {
+    name = "vim-${type}-${toString srcId}";
+    buildCommand = ''
+      install -vD -m 0644 "${src}" "$out/${type}/${name}.vim"
+    '';
+  };
+
+  extractSubdir = subdir: src: stdenv.mkDerivation {
+    name = "${src.name}-subdir";
+    phases = [ "unpackPhase" "installPhase" ];
+    inherit src;
+    installPhase = ''
+      cp -Rd "${subdir}" "$out"
+    '';
+  };
+
+  mkVimPlugins = plugins: buildEnv {
+    name = "vim-plugins";
+    paths = with lib; mapAttrsToList (const id) plugins;
+    ignoreCollisions = true;
+    postBuild = ''
+      find -L "$out" -mindepth 1 -maxdepth 1 -type f -delete
+    '';
+  };
+
+  pluginDeps = {
+    vimAddonMwUtils = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-mw-utils";
+      rev = "0c5612fa31ee434ba055e21c76f456244b3b5109";
+      sha256 = "147s1k4n45d3x281vj35l26sv4waxjlpqdn83z3k9n51556h1d45";
+    };
+
+    vimAddonCompletion = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-completion";
+      rev = "80f717d68df5b0d7b32228229ddfd29c3e86e435";
+      sha256 = "08acffzy847w8b5j8pdw6qsidm2859ki5q351n4r7fkr969p80mi";
+    };
+
+    vimAddonActions = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-actions";
+      rev = "a5d20500fb8812958540cf17862bd73e7af64936";
+      sha256 = "1wfkwr89sn2w97i94d0dqylcg9mr6pirjadi0a4l492nfnsh99bc";
+    };
+
+    vimAddonBackgroundCmd = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-background-cmd";
+      rev = "14df72660a95804a57c02b9ff0ae3198608e2491";
+      sha256 = "09lh6hqbx05gm7njhpqvhqdwig3pianq9rddxmjsr6b1vylgdgg4";
+    };
+
+    vimAddonErrorFormats = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-errorformats";
+      rev = "dcbb203ad5f56e47e75fdee35bc92e2ba69e1d28";
+      sha256 = "159zqm69fxbxcv3b2y99g57bf20qrzsijcvb5rzy2njxah3049m1";
+    };
+
+    vimAddonToggleBuffer = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-toggle-buffer";
+      rev = "a1b38b9c5709cba666ed2d84ef06548f675c6b0b";
+      sha256 = "1xq38kfdm36c34ln66znw841q797w5gm8bpq1x64bsf2h6n3ml03";
+    };
+
+    vimAddonGotoThingAtCursor = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-goto-thing-at-cursor";
+      rev = "f052e094bdb351829bf72ae3435af9042e09a6e4";
+      sha256 = "1ksm2b0j80zn8sz2y227bpcx4jsv76lwgr2gpgy2drlyqhn2vlv0";
+    };
+
+    vimAddonViews = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-views";
+      rev = "d1383ad56d0a07d7350880adbadf9de501729fa8";
+      sha256 = "09gqh7w5rk4lmra706schqaj8dnisf396lpsipm7xv6gy1qbslnv";
+    };
+
+    vimAddonSwfMill = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-swfmill";
+      rev = "726777e02cbe3ad8f82e37421fb37674f446a148";
+      sha256 = "0ablzl5clgfzhzwvzzbaj0cda0b4cyrj3pbv02f26hx7rfnssaqm";
+    };
+
+    vimHaxeSyntax = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-haxe-syntax";
+      rev = "500acc2f2ab92d77ff6cd04fdc7868800c033dfa";
+      sha256 = "1ipm0igplplfmscm3bk95qpf9rw71h133l9shmw54mxr4h0ymnmj";
+    };
+
+    tlib = fetchFromGitHub {
+      owner = "tomtom";
+      repo = "tlib_vim";
+      rev = "bc4097bd38c4bc040fe1e74df68dec6c9adfcb6a";
+      sha256 = "19v7bgmkk4k2g1z62bd0kky29xxfq96l7wfrl27wb2zijlhbrnpz";
+    };
+
+    vamStub = writeTextFile {
+      name = "vam-stub";
+      destination = "/autoload/vam.vim";
+      text = ''
+        fun! vam#DefineAndBind(local, global, default)
+          return ' if !exists('.string(a:global).') |
+                 \ let '.a:global.' = '.a:default.' |
+                 \ endif | let '.a:local.' = '.a:global
+        endfun
+      '';
+    };
+  };
+
+  plugins = mkVimPlugins (pluginDeps // {
+    vimErl = fetchFromGitHub {
+      owner = "jimenezrick";
+      repo = "vimerl";
+      rev = "823bf8cb515bb10396c705cdc017aa9121cc4d12";
+      sha256 = "0sybkx8iy8qhr6nlwn52j7zd5v99rn0b8wbg43d112z2px4yq5x3";
+    };
+
+    vimHaxe = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-haxe";
+      rev = "8efc705db41a01713d67d437f29866a1ff831e8a";
+      sha256 = "15kv13gvpgf23p0566qrlw7gmpir2z7g5dnkfs1knmcwzw45am5d";
+    };
+
+    factor = extractSubdir "misc/vim" (fetchFromGitHub {
+      owner = "slavapestov";
+      repo = "factor";
+      rev = "0d6f70cc7cf35cc627ee78886e2932091a651fe6";
+      sha256 = "0lmqzvrmwgmxpcpwgn59y033sf4jybmw3lffbjwww5d7ch90333q";
+    });
+
+    opaLang = extractSubdir "tools/editors/vim" (fetchFromGitHub {
+      owner = "MLstate";
+      repo = "opalang";
+      rev = "94e4e6d9d8da9a72214f4f28dd1ffa1a987997eb";
+      sha256 = "0d6b67868cfqakkz63y5ynpz549lbpfzc3c3x7kx3ffsv10xy3bb";
+    });
+
+    lslvim = fetchFromGitHub {
+      owner = "sukima";
+      repo = "LSLvim";
+      rev = "f269de39a1c713a43470e90d0ec78208c0f05e0b";
+      sha256 = "1plwx5id3jsj4y6yhshlf3rishxhf1b9k47g2cpzaczvqb5bl40w";
+    };
+
+    vimSyntaxShakespeare = fetchFromGitHub {
+      owner = "pbrisbin";
+      repo = "vim-syntax-shakespeare";
+      rev = "29085ae94ee3dbd7f39f2a7705d86692ef5bc365";
+      sha256 = "0kvys81jiwqzwmpbk1lvbciw28yha4shd1xby5saiy4b68l6d8rk";
+    };
+
+    glsl = fetchVimScript {
+      name = "glsl";
+      srcId = 3194;
+      sha256 = "1vqfcpjmfyjc95wns3i84kgd1k5r2lwjjvjcprygi9g9vng7i5xc";
+      type = "syntax";
+    };
+
+    actionScript = fetchVimScript {
+      name = "actionscript";
+      srcId = 1205;
+      sha256 = "0pdzqg678lhn7lmqf3z9icpj6ff2nnghsxy983kxkn8sblnzlhfs";
+      type = "syntax";
+    };
+
+    indentPython = fetchVimScript {
+      name = "python";
+      srcId = 4316;
+      sha256 = "1pgdiaqd1hm0qpspy1asj7i103pq0846lnjrxvl6pk17ymww9pmk";
+      type = "indent";
+    };
+
+    nixAddon = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-nix";
+      rev = "7b0a376bb1797fef8da2dc14e768f318bcb671e8";
+      sha256 = "00dsba2a0az9bw1sni12km1vdga9x32dapxaj5gmq98hzqlhklyp";
+    };
+
+    urwebAddon = fetchFromGitHub {
+      owner = "MarcWeber";
+      repo = "vim-addon-urweb";
+      rev = "49ea3960a9924a5dd7ff70956d1a7c0479a55773";
+      sha256 = "090ww8nxqsabrwf4r8g7a93kawnp6zwpsx65yxpacwwwlbc73m7s";
+    };
+
+    indentHaskell = fetchVimScript {
+      name = "haskell";
+      srcId = 7407;
+      sha256 = "1lj44jkyihmcnj2kcfckhqzr9gfipda9frbzicix2wrc5728kjsv";
+      type = "indent";
+    };
+
+    fishSyntax = fetchVimScript {
+      name = "fish";
+      srcId = 20242;
+      sha256 = "12gfmyxxf84f19bp8xfmkb9phbfkifn89sjgi8hnv6dn0a5y1zpj";
+      type = "syntax";
+    };
+
+    elmVim = fetchFromGitHub {
+      owner = "lambdatoast";
+      repo = "elm.vim";
+      rev = "ad556c97e26072b065825852ceead0fe6a1f7d7c";
+      sha256 = "19k6b6m5ngm5qn2f3p13hzjyvha53fpdgq691z8n0lwfn8831b21";
+    };
+
+    flake8 = fetchFromGitHub {
+      owner = "nvie";
+      repo = "vim-flake8";
+      rev = "293613dbe731a2875ce93739e7b64ee504d8bbab";
+      sha256 = "0xmqmbh66g44vhx9769mzs820k6ksbpfnsfvivmbhzlps2hjqpqg";
+    };
+  });
+
+  generic = ''
+    syntax on
+    colorscheme elflord
+
+    " boolean
+    set nocompatible
+    set showcmd
+    set showmatch
+    set ignorecase
+    set smartcase
+    set incsearch
+    set modeline
+    set smarttab
+    set expandtab
+    set smartindent
+    set ruler
+
+    " non-boolean
+    set tabstop=4
+    set softtabstop=4
+    set shiftwidth=4
+    set textwidth=80
+    set termencoding=ascii
+    set backspace=indent,eol,start
+    set background=dark
+  '';
+
+  plugin = ''
+    " erlang
+    let erlang_folding = 0
+    let erlang_highlight_bif = 1
+    let erlang_force_use_vimerl_indent = 1
+
+    " python
+    let python_highlight_numbers = 1
+    let python_highlight_builtins = 1
+    let python_highlight_exceptions = 1
+
+    " all plugins
+    set runtimepath^=${plugins}
+    set runtimepath+=${plugins}/after
+  '';
+
+  autocmd = ''
+    " jump to last position
+    au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") |
+                   \ exe "normal! g'\"zz" | endif
+
+    " filetype defaults
+    filetype plugin indent on
+    au BufNewFile,BufRead *.as set filetype=actionscript
+    au BufNewFile,BufRead *.html set tabstop=4|set shiftwidth=4|set expandtab
+    au FileType python set textwidth=79
+    au FileType gitcommit set textwidth=72
+
+    " highlight unnecessary whitespace
+    highlight ExtraWhitespace ctermbg=red guibg=red
+    match ExtraWhitespace /\s\+$/
+    au BufWinEnter,InsertLeave * match ExtraWhitespace /\s\+$/
+    au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
+    " prevent colorscheme from overriding these highlights
+    au ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
+
+    " highlight everything exceeding 80 characters
+    au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
+  '';
+
+  misc = ''
+    " ASCII art mode
+    fun! AAMode()
+      highlight clear ExtraWhitespace
+      for m in getmatches()
+        if m.group == 'ErrorMsg' && m.pattern == '\%>80v.\+'
+          call matchdelete(m.id)
+        endif
+      endfor
+    endfun
+
+    " flake everything that has been *detected* as python (not just by suffix).
+    autocmd BufWritePost * if &ft ==# 'python' | call Flake8() | endif
+  '';
+
+  vimrc = writeText "vimrc" ''
+    ${generic}
+    ${plugin}
+
+    if has("autocmd")
+      ${autocmd}
+    endif
+
+    ${misc}
+  '';
+
+in lib.overrideDerivation vim_configurable (o: {
+  postInstall = (o.postInstall or "") + ''
+    ln -sf "${vimrc}" "$out/share/vim/vimrc"
+  '';
+})