summary refs log tree commit diff
path: root/pkgs/tools/text
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/tools/text')
-rw-r--r--pkgs/tools/text/a2ps/default.nix4
-rw-r--r--pkgs/tools/text/agrep/default.nix6
-rw-r--r--pkgs/tools/text/aha/default.nix4
-rw-r--r--pkgs/tools/text/amber/default.nix14
-rw-r--r--pkgs/tools/text/angle-grinder/default.nix25
-rw-r--r--pkgs/tools/text/ansifilter/default.nix10
-rw-r--r--pkgs/tools/text/ascii/default.nix4
-rw-r--r--pkgs/tools/text/asciigraph/default.nix22
-rw-r--r--pkgs/tools/text/bcat/gemset.nix2
-rw-r--r--pkgs/tools/text/boxes/default.nix6
-rw-r--r--pkgs/tools/text/catdoc/default.nix4
-rw-r--r--pkgs/tools/text/catdocx/default.nix2
-rw-r--r--pkgs/tools/text/cconv/default.nix17
-rw-r--r--pkgs/tools/text/chars/default.nix28
-rw-r--r--pkgs/tools/text/choose/default.nix25
-rw-r--r--pkgs/tools/text/chroma/default.nix42
-rw-r--r--pkgs/tools/text/cmigemo/default.nix35
-rw-r--r--pkgs/tools/text/cmigemo/no-http-tool-check.patch23
-rw-r--r--pkgs/tools/text/codesearch/default.nix12
-rw-r--r--pkgs/tools/text/codesearch/deps.nix3
-rw-r--r--pkgs/tools/text/colordiff/default.nix38
-rw-r--r--pkgs/tools/text/coloursum/default.nix8
-rw-r--r--pkgs/tools/text/convertlit/default.nix6
-rw-r--r--pkgs/tools/text/copyright-update/default.nix4
-rw-r--r--pkgs/tools/text/csvkit/default.nix31
-rw-r--r--pkgs/tools/text/dadadodo/default.nix8
-rw-r--r--pkgs/tools/text/dcs/default.nix46
-rw-r--r--pkgs/tools/text/dfmt/default.nix27
-rw-r--r--pkgs/tools/text/diction/default.nix6
-rw-r--r--pkgs/tools/text/diffr/default.nix8
-rw-r--r--pkgs/tools/text/diffstat/default.nix8
-rw-r--r--pkgs/tools/text/diffutils/default.nix13
-rw-r--r--pkgs/tools/text/dirdiff/default.nix59
-rw-r--r--pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch32
-rw-r--r--pkgs/tools/text/discount/default.nix8
-rw-r--r--pkgs/tools/text/dos2unix/default.nix9
-rw-r--r--pkgs/tools/text/each/default.nix25
-rw-r--r--pkgs/tools/text/ebook-tools/default.nix13
-rw-r--r--pkgs/tools/text/enca/default.nix6
-rw-r--r--pkgs/tools/text/enscript/default.nix6
-rw-r--r--pkgs/tools/text/epubcheck/default.nix4
-rw-r--r--pkgs/tools/text/esh/default.nix4
-rw-r--r--pkgs/tools/text/fanficfare/default.nix7
-rw-r--r--pkgs/tools/text/fastmod/default.nix13
-rw-r--r--pkgs/tools/text/frangipanni/default.nix22
-rw-r--r--pkgs/tools/text/fst/0001-cargo-lockfile.patch935
-rw-r--r--pkgs/tools/text/fst/default.nix45
-rw-r--r--pkgs/tools/text/gawk/default.nix7
-rw-r--r--pkgs/tools/text/gawk/gawk-with-extensions.nix3
-rw-r--r--pkgs/tools/text/gawk/gawkextlib.nix10
-rw-r--r--pkgs/tools/text/gist/default.nix4
-rw-r--r--pkgs/tools/text/gjo/default.nix6
-rw-r--r--pkgs/tools/text/glogg/default.nix8
-rw-r--r--pkgs/tools/text/gnugrep/default.nix8
-rw-r--r--pkgs/tools/text/gnupatch/default.nix8
-rw-r--r--pkgs/tools/text/gnused/422.nix8
-rw-r--r--pkgs/tools/text/gnused/default.nix8
-rw-r--r--pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch10
-rw-r--r--pkgs/tools/text/gpt2tc/default.nix44
-rw-r--r--pkgs/tools/text/grin/default.nix6
-rw-r--r--pkgs/tools/text/grip-search/default.nix6
-rw-r--r--pkgs/tools/text/groff/default.nix44
-rw-r--r--pkgs/tools/text/groff/site.tmac3
-rw-r--r--pkgs/tools/text/gtranslator/default.nix20
-rw-r--r--pkgs/tools/text/gucci/default.nix4
-rw-r--r--pkgs/tools/text/highlight/default.nix14
-rw-r--r--pkgs/tools/text/hottext/default.nix100
-rw-r--r--pkgs/tools/text/html-tidy/default.nix8
-rw-r--r--pkgs/tools/text/html2text/default.nix8
-rw-r--r--pkgs/tools/text/icdiff/default.nix20
-rw-r--r--pkgs/tools/text/invoice2data/default.nix6
-rw-r--r--pkgs/tools/text/ispell/default.nix6
-rw-r--r--pkgs/tools/text/jbofihe/default.nix29
-rw-r--r--pkgs/tools/text/jsawk/default.nix14
-rw-r--r--pkgs/tools/text/jumanpp/default.nix14
-rw-r--r--pkgs/tools/text/kakasi/default.nix6
-rw-r--r--pkgs/tools/text/kdiff3/default.nix6
-rw-r--r--pkgs/tools/text/kramdown-rfc2629/Gemfile2
-rw-r--r--pkgs/tools/text/kramdown-rfc2629/Gemfile.lock17
-rw-r--r--pkgs/tools/text/kramdown-rfc2629/default.nix18
-rw-r--r--pkgs/tools/text/kramdown-rfc2629/gemset.nix33
-rw-r--r--pkgs/tools/text/kytea/default.nix6
-rw-r--r--pkgs/tools/text/l2md/default.nix32
-rw-r--r--pkgs/tools/text/languagetool/default.nix19
-rw-r--r--pkgs/tools/text/ledger2beancount/default.nix59
-rw-r--r--pkgs/tools/text/link-grammar/default.nix55
-rw-r--r--pkgs/tools/text/lv/default.nix4
-rw-r--r--pkgs/tools/text/m2r/default.nix32
-rw-r--r--pkgs/tools/text/mairix/default.nix8
-rw-r--r--pkgs/tools/text/mark/default.nix24
-rw-r--r--pkgs/tools/text/markdown-pp/default.nix14
-rw-r--r--pkgs/tools/text/mawk/default.nix4
-rw-r--r--pkgs/tools/text/mb2md/default.nix4
-rw-r--r--pkgs/tools/text/mdbook-mermaid/default.nix24
-rw-r--r--pkgs/tools/text/mdbook/default.nix12
-rw-r--r--pkgs/tools/text/mdcat/default.nix54
-rw-r--r--pkgs/tools/text/mecab/default.nix4
-rw-r--r--pkgs/tools/text/miller/default.nix10
-rw-r--r--pkgs/tools/text/mpage/default.nix7
-rw-r--r--pkgs/tools/text/multitran/data/default.nix6
-rw-r--r--pkgs/tools/text/multitran/libbtree/default.nix6
-rw-r--r--pkgs/tools/text/multitran/libfacet/default.nix8
-rw-r--r--pkgs/tools/text/multitran/libmtquery/default.nix6
-rw-r--r--pkgs/tools/text/multitran/libmtsupport/default.nix6
-rw-r--r--pkgs/tools/text/multitran/mtutils/default.nix8
-rw-r--r--pkgs/tools/text/namazu/default.nix30
-rw-r--r--pkgs/tools/text/nawk/default.nix28
-rw-r--r--pkgs/tools/text/nkf/default.nix8
-rw-r--r--pkgs/tools/text/num-utils/default.nix29
-rw-r--r--pkgs/tools/text/numdiff/default.nix9
-rw-r--r--pkgs/tools/text/ocrmypdf/0001-Make-compatible-with-pdfminer.six-version-20200720.patch52
-rw-r--r--pkgs/tools/text/ocrmypdf/default.nix25
-rw-r--r--pkgs/tools/text/odt2txt/default.nix6
-rw-r--r--pkgs/tools/text/opencc/default.nix15
-rw-r--r--pkgs/tools/text/papertrail/default.nix6
-rw-r--r--pkgs/tools/text/papertrail/gemset.nix2
-rw-r--r--pkgs/tools/text/par/default.nix9
-rw-r--r--pkgs/tools/text/patchutils/generic.nix4
-rw-r--r--pkgs/tools/text/pbgopy/default.nix22
-rw-r--r--pkgs/tools/text/peco/default.nix17
-rw-r--r--pkgs/tools/text/peco/deps.nix57
-rw-r--r--pkgs/tools/text/platinum-searcher/default.nix6
-rw-r--r--pkgs/tools/text/pn/default.nix24
-rw-r--r--pkgs/tools/text/podiff/default.nix12
-rw-r--r--pkgs/tools/text/poedit/default.nix32
-rw-r--r--pkgs/tools/text/popfile/default.nix9
-rw-r--r--pkgs/tools/text/proselint/default.nix4
-rw-r--r--pkgs/tools/text/qgrep/default.nix12
-rw-r--r--pkgs/tools/text/qprint/default.nix8
-rw-r--r--pkgs/tools/text/qshowdiff/default.nix6
-rw-r--r--pkgs/tools/text/reckon/Gemfile.lock12
-rw-r--r--pkgs/tools/text/reckon/default.nix6
-rw-r--r--pkgs/tools/text/reckon/gemset.nix35
-rw-r--r--pkgs/tools/text/recode/default.nix12
-rw-r--r--pkgs/tools/text/replace/default.nix13
-rw-r--r--pkgs/tools/text/rgxg/default.nix18
-rw-r--r--pkgs/tools/text/ripgrep-all/default.nix9
-rw-r--r--pkgs/tools/text/ripgrep/default.nix35
-rw-r--r--pkgs/tools/text/robodoc/default.nix48
-rw-r--r--pkgs/tools/text/rpl/default.nix4
-rw-r--r--pkgs/tools/text/rs/default.nix4
-rw-r--r--pkgs/tools/text/rst2html5/default.nix21
-rw-r--r--pkgs/tools/text/ruby-zoom/gemset.nix2
-rw-r--r--pkgs/tools/text/ruplacer/default.nix10
-rw-r--r--pkgs/tools/text/schema2ldif/default.nix6
-rw-r--r--pkgs/tools/text/sd/default.nix19
-rw-r--r--pkgs/tools/text/sgml/jade/default.nix6
-rw-r--r--pkgs/tools/text/sgml/openjade/default.nix6
-rw-r--r--pkgs/tools/text/sgml/opensp/default.nix10
-rw-r--r--pkgs/tools/text/shfmt/default.nix23
-rw-r--r--pkgs/tools/text/shocco/default.nix4
-rw-r--r--pkgs/tools/text/sift/default.nix2
-rw-r--r--pkgs/tools/text/silver-searcher/default.nix10
-rw-r--r--pkgs/tools/text/snippetpixie/default.nix16
-rw-r--r--pkgs/tools/text/source-highlight/default.nix37
-rw-r--r--pkgs/tools/text/tab/default.nix18
-rw-r--r--pkgs/tools/text/transifex-client/default.nix6
-rw-r--r--pkgs/tools/text/txt2tags/default.nix8
-rw-r--r--pkgs/tools/text/ucg/default.nix40
-rw-r--r--pkgs/tools/text/ugrep/default.nix26
-rw-r--r--pkgs/tools/text/uni2ascii/default.nix10
-rw-r--r--pkgs/tools/text/unoconv/default.nix6
-rw-r--r--pkgs/tools/text/unrtf/default.nix18
-rw-r--r--pkgs/tools/text/untex/default.nix4
-rw-r--r--pkgs/tools/text/uwc/default.nix24
-rw-r--r--pkgs/tools/text/vale/default.nix16
-rw-r--r--pkgs/tools/text/vgrep/default.nix32
-rw-r--r--pkgs/tools/text/wdiff/default.nix20
-rw-r--r--pkgs/tools/text/wgetpaste/default.nix12
-rw-r--r--pkgs/tools/text/wrap/default.nix36
-rw-r--r--pkgs/tools/text/xidel/default.nix4
-rw-r--r--pkgs/tools/text/xml/basex/default.nix31
-rw-r--r--pkgs/tools/text/xml/html-xml-utils/default.nix8
-rw-r--r--pkgs/tools/text/xml/jing-trang/default.nix4
-rw-r--r--pkgs/tools/text/xml/rnv/default.nix4
-rw-r--r--pkgs/tools/text/xml/rxp/default.nix6
-rw-r--r--pkgs/tools/text/xml/xml2/default.nix6
-rw-r--r--pkgs/tools/text/xml/xmldiff/default.nix41
-rw-r--r--pkgs/tools/text/xml/xmlformat/default.nix6
-rw-r--r--pkgs/tools/text/xml/xmloscopy/default.nix2
-rw-r--r--pkgs/tools/text/xml/xmlstarlet/default.nix10
-rw-r--r--pkgs/tools/text/xml/xpf/default.nix8
-rw-r--r--pkgs/tools/text/xsv/default.nix8
-rw-r--r--pkgs/tools/text/xurls/default.nix4
-rw-r--r--pkgs/tools/text/yaml-merge/default.nix6
-rw-r--r--pkgs/tools/text/zimreader/default.nix38
-rw-r--r--pkgs/tools/text/zimwriterfs/default.nix16
-rw-r--r--pkgs/tools/text/zoekt/default.nix29
-rw-r--r--pkgs/tools/text/zstxtns-utils/default.nix39
189 files changed, 2996 insertions, 949 deletions
diff --git a/pkgs/tools/text/a2ps/default.nix b/pkgs/tools/text/a2ps/default.nix
index c29060cb82f..978839ab1fd 100644
--- a/pkgs/tools/text/a2ps/default.nix
+++ b/pkgs/tools/text/a2ps/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchpatch, autoconf, bison, libpaper, gperf, file, perl }:
+{ lib, stdenv, fetchurl, fetchpatch, autoconf, bison, libpaper, gperf, file, perl }:
 
 stdenv.mkDerivation rec {
   name = "a2ps-4.14";
@@ -31,7 +31,7 @@ stdenv.mkDerivation rec {
   nativeBuildInputs = [ autoconf file bison perl ];
   buildInputs = [ libpaper gperf ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An Anything to PostScript converter and pretty-printer";
     longDescription = ''
       GNU a2ps converts files into PostScript for printing or viewing. It uses a nice default format,
diff --git a/pkgs/tools/text/agrep/default.nix b/pkgs/tools/text/agrep/default.nix
index c0816f8ab76..9fe158b426a 100644
--- a/pkgs/tools/text/agrep/default.nix
+++ b/pkgs/tools/text/agrep/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub }:
+{ lib, stdenv, fetchFromGitHub }:
 
 stdenv.mkDerivation {
   pname = "agrep";
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
   };
 
   # Related: https://github.com/Wikinaut/agrep/pull/11
-  prePatch = stdenv.lib.optionalString (stdenv.hostPlatform.isMusl || stdenv.isDarwin) ''
+  prePatch = lib.optionalString (stdenv.hostPlatform.isMusl || stdenv.isDarwin) ''
     sed -i '1i#include <sys/stat.h>' checkfil.c newmgrep.c recursiv.c
   '';
   installPhase = ''
@@ -23,7 +23,7 @@ stdenv.mkDerivation {
 
   makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Approximate grep for fast fuzzy string searching";
     homepage = "https://www.tgries.de/agrep/";
     license = licenses.isc;
diff --git a/pkgs/tools/text/aha/default.nix b/pkgs/tools/text/aha/default.nix
index 1a6d65c52cd..4ac07cef7ee 100644
--- a/pkgs/tools/text/aha/default.nix
+++ b/pkgs/tools/text/aha/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub }:
+{ lib, stdenv, fetchFromGitHub }:
 
 stdenv.mkDerivation rec {
   pname = "aha";
@@ -15,7 +15,7 @@ stdenv.mkDerivation rec {
 
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "ANSI HTML Adapter";
     longDescription = ''
       aha takes ANSI SGR-coloured input and produces W3C-conformant HTML code.
diff --git a/pkgs/tools/text/amber/default.nix b/pkgs/tools/text/amber/default.nix
index 22a18b1cffb..1cd9e74f194 100644
--- a/pkgs/tools/text/amber/default.nix
+++ b/pkgs/tools/text/amber/default.nix
@@ -1,23 +1,23 @@
-{ stdenv, fetchFromGitHub, rustPlatform
-, Security
+{ lib, stdenv, fetchFromGitHub, rustPlatform
+, libiconv, Security
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "amber";
-  version = "0.5.4";
+  version = "0.5.9";
 
   src = fetchFromGitHub {
     owner = "dalance";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0pqz3spb5lmrj7w8hynmah9nrcfjsb1s0bmrr0cng9a9jx8amwzn";
+    sha256 = "sha256-mmgJCD7kJjvpxyagsoe5CSzqIEZcIiYMAMP3axRphv4=";
   };
 
-  cargoSha256 = "1ps70swh96xbfn4hng5krlmwvw2bwrl2liqvx9v9vy6pr86643s6";
+  cargoSha256 = "sha256-opRinhTmhZxpAwHNiVOLXL8boQf09Y1NXrWQ6HWQYQ0=";
 
-  buildInputs = stdenv.lib.optional stdenv.isDarwin Security;
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv Security ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A code search-and-replace tool";
     homepage = "https://github.com/dalance/amber";
     license = with licenses; [ mit ];
diff --git a/pkgs/tools/text/angle-grinder/default.nix b/pkgs/tools/text/angle-grinder/default.nix
new file mode 100644
index 00000000000..02235b057d4
--- /dev/null
+++ b/pkgs/tools/text/angle-grinder/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "angle-grinder";
+  version = "0.17.0";
+
+  src = fetchFromGitHub {
+    owner = "rcoh";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-jG3jHFqFOrIT/e5oyLOEckw5C3LIs7amFAa4QDEI/EY=";
+  };
+
+  cargoSha256 = "sha256-Rkex+fnnacV+DCRpX3Zh9J3vGuG4QfFhFezHTs33peY=";
+
+  meta = with lib; {
+    description = "Slice and dice logs on the command line";
+    homepage = "https://github.com/rcoh/angle-grinder";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bbigras ];
+  };
+}
diff --git a/pkgs/tools/text/ansifilter/default.nix b/pkgs/tools/text/ansifilter/default.nix
index 00c8c075ed6..97b06b9a0c7 100644
--- a/pkgs/tools/text/ansifilter/default.nix
+++ b/pkgs/tools/text/ansifilter/default.nix
@@ -1,15 +1,15 @@
-{ fetchurl, stdenv, pkgconfig, boost, lua }:
+{ fetchurl, lib, stdenv, pkg-config, boost, lua }:
 
 stdenv.mkDerivation rec {
   pname = "ansifilter";
-  version = "2.16";
+  version = "2.18";
 
   src = fetchurl {
     url = "http://www.andre-simon.de/zip/ansifilter-${version}.tar.bz2";
-    sha256 = "1wmszcykhaipxa7kxj4ml0lkmd5z7i9ryaachg9jpkhbaaijzkbz";
+    sha256 = "sha256-Zs8BfTakPV9q4gYJzjtYZHSU7mwOQfxoLFmL/859fTk=";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ boost lua ];
 
   postPatch = ''
@@ -21,7 +21,7 @@ stdenv.mkDerivation rec {
     "conf_dir=/etc/ansifilter"
   ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Tool to convert ANSI to other formats";
     longDescription = ''
       Tool to remove ANSI or convert them to another format
diff --git a/pkgs/tools/text/ascii/default.nix b/pkgs/tools/text/ascii/default.nix
index 94ab5286f8c..f596c8d330d 100644
--- a/pkgs/tools/text/ascii/default.nix
+++ b/pkgs/tools/text/ascii/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "ascii";
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
     mkdir -vp "$out/bin" "$out/share/man/man1"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Interactive ASCII name and synonym chart";
     homepage = "http://www.catb.org/~esr/ascii/";
     license = licenses.bsd3;
diff --git a/pkgs/tools/text/asciigraph/default.nix b/pkgs/tools/text/asciigraph/default.nix
new file mode 100644
index 00000000000..27c2a1ff28e
--- /dev/null
+++ b/pkgs/tools/text/asciigraph/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildGoPackage, fetchFromGitHub }:
+
+buildGoPackage rec {
+  pname = "asciigraph";
+  version = "0.5.2";
+
+  goPackagePath = "github.com/guptarohit/asciigraph";
+
+  src = fetchFromGitHub {
+    owner = "guptarohit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-iVgJtxt0B6nMA3bieZ1CmZucwLMb5av6Wn5BMDRWfcI=";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/guptarohit/asciigraph";
+    description = "Lightweight ASCII line graph ╭┈╯ command line app";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.mmahut ];
+  };
+}
diff --git a/pkgs/tools/text/bcat/gemset.nix b/pkgs/tools/text/bcat/gemset.nix
index 75de0e5cf38..9471ffae8dd 100644
--- a/pkgs/tools/text/bcat/gemset.nix
+++ b/pkgs/tools/text/bcat/gemset.nix
@@ -20,4 +20,4 @@
     };
     version = "1.6.11";
   };
-}
\ No newline at end of file
+}
diff --git a/pkgs/tools/text/boxes/default.nix b/pkgs/tools/text/boxes/default.nix
index b9d54d3a9e7..f39349b2fbf 100644
--- a/pkgs/tools/text/boxes/default.nix
+++ b/pkgs/tools/text/boxes/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, bison, flex }:
+{ lib, stdenv, fetchFromGitHub, bison, flex }:
 
 stdenv.mkDerivation rec {
   pname = "boxes";
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
                 "GLOBALCONF=${placeholder "out"}/share/boxes/boxes-config"
   '';
 
-  makeFlags = stdenv.lib.optionals stdenv.isDarwin [ "CC=cc" ];
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
 
   installPhase = ''
     install -Dm755 -t $out/bin src/boxes
@@ -33,7 +33,7 @@ stdenv.mkDerivation rec {
     install -Dm644 -t $out/share/man/man1 doc/boxes.1
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Command line ASCII boxes unlimited!";
     longDescription = ''
       Boxes is a command line filter program that draws ASCII art boxes around
diff --git a/pkgs/tools/text/catdoc/default.nix b/pkgs/tools/text/catdoc/default.nix
index 64ef092f36b..61570a70b7d 100644
--- a/pkgs/tools/text/catdoc/default.nix
+++ b/pkgs/tools/text/catdoc/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchpatch }:
+{ lib, stdenv, fetchurl, fetchpatch }:
 
 stdenv.mkDerivation rec {
   pname = "catdoc";
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
 
   configureFlags = [ "--disable-wordview" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "MS-Word/Excel/PowerPoint to text converter";
     platforms = platforms.all;
     license = licenses.gpl2;
diff --git a/pkgs/tools/text/catdocx/default.nix b/pkgs/tools/text/catdocx/default.nix
index f24864f754b..adf78397fcb 100644
--- a/pkgs/tools/text/catdocx/default.nix
+++ b/pkgs/tools/text/catdocx/default.nix
@@ -20,7 +20,7 @@ stdenv.mkDerivation {
     ln -s $out/libexec/catdocx.sh $out/bin/catdocx
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Extracts plain text from docx files";
     homepage = "https://github.com/jncraton/catdocx";
     license = with licenses; [ bsd3 ];
diff --git a/pkgs/tools/text/cconv/default.nix b/pkgs/tools/text/cconv/default.nix
index 8fe400aaab2..e918d620c67 100644
--- a/pkgs/tools/text/cconv/default.nix
+++ b/pkgs/tools/text/cconv/default.nix
@@ -1,21 +1,22 @@
-{ stdenv, fetchurl, autoreconfHook }:
-let version = "0.6.3"; in
-  stdenv.mkDerivation {
+{ lib, stdenv, fetchurl, autoreconfHook, libiconv }:
+
+stdenv.mkDerivation rec {
   pname = "cconv";
-  inherit version;
-  
+  version = "0.6.3";
+
   src = fetchurl {
     url = "https://github.com/xiaoyjy/cconv/archive/v${version}.tar.gz";
     sha256 = "82f46a94829f5a8157d6f686e302ff5710108931973e133d6e19593061b81d84";
   };
 
   nativeBuildInputs = [ autoreconfHook ];
-  
-  meta = with stdenv.lib; {
+  buildInputs = [ libiconv ];
+
+  meta = with lib; {
     description = "A iconv based simplified-traditional chinese conversion tool";
     homepage = "https://github.com/xiaoyjy/cconv";
     license = licenses.mit;
-    platforms = platforms.linux;
+    platforms = platforms.all;
     maintainers = [ maintainers.redfish64 ];
   };
 }
diff --git a/pkgs/tools/text/chars/default.nix b/pkgs/tools/text/chars/default.nix
new file mode 100644
index 00000000000..c8d1b1064ac
--- /dev/null
+++ b/pkgs/tools/text/chars/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, fetchFromGitHub
+, rustPlatform
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "chars";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "antifuchs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1pyda3b6svxzc98d7ggl7v9xd0xhilmpjrnajzh77zcwzq42s17l";
+  };
+
+  cargoSha256 = "0ywywbcnc9jm0cfd6kbq8vl6r5dl16sxn7pwi2k6l0sj75pm1i6h";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  meta = with lib; {
+    description = "Commandline tool to display information about unicode characters";
+    homepage = "https://github.com/antifuchs/chars";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bbigras ];
+  };
+}
diff --git a/pkgs/tools/text/choose/default.nix b/pkgs/tools/text/choose/default.nix
new file mode 100644
index 00000000000..f5cded1beab
--- /dev/null
+++ b/pkgs/tools/text/choose/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "choose";
+  version = "1.3.2";
+
+  src = fetchFromGitHub {
+    owner = "theryangeary";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-QX0tAo1cGPpRhggiAPxsVhKXg6TgaVl1lcp3na7jUNw=";
+  };
+
+  cargoSha256 = "sha256-3pK7y/zC5iZkto5p5Xerlpu3yfN6sB2kjLF2fURlUj0=";
+
+  meta = with lib; {
+    description = "A human-friendly and fast alternative to cut and (sometimes) awk";
+    homepage = "https://github.com/theryangeary/choose";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ sohalt ];
+  };
+}
diff --git a/pkgs/tools/text/chroma/default.nix b/pkgs/tools/text/chroma/default.nix
new file mode 100644
index 00000000000..1b9cbcd3727
--- /dev/null
+++ b/pkgs/tools/text/chroma/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "chroma";
+  version = "0.9.2";
+
+  src = fetchFromGitHub {
+    owner  = "alecthomas";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "19d7yr6q8kwrm91yyglmw9n7wa861sgi6dbwn8sl6dp55czfwvaq";
+    # populate values otherwise taken care of by goreleaser,
+    # unfortunately these require us to use git. By doing
+    # this in postFetch we can delete .git afterwards and
+    # maintain better reproducibility of the src.
+    leaveDotGit = true;
+    postFetch = ''
+      cd "$out"
+
+      commit="$(git rev-parse HEAD)"
+      date=$(git show -s --format=%aI "$commit")
+
+      substituteInPlace "$out/cmd/chroma/main.go" \
+        --replace 'version = "?"' 'version = "${version}"' \
+        --replace 'commit  = "?"' "commit = \"$commit\"" \
+        --replace 'date    = "?"' "date = \"$date\""
+
+      find "$out" -name .git -print0 | xargs -0 rm -rf
+    '';
+  };
+
+  vendorSha256 = "0y8mp08zccn9qxrsj9j7vambz8dwzsxbbgrlppzam53rg8rpxhrg";
+
+  subPackages = [ "cmd/chroma" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/alecthomas/chroma";
+    description = "A general purpose syntax highlighter in pure Go";
+    license = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/pkgs/tools/text/cmigemo/default.nix b/pkgs/tools/text/cmigemo/default.nix
new file mode 100644
index 00000000000..6787d68991d
--- /dev/null
+++ b/pkgs/tools/text/cmigemo/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub, fetchurl, gzip, libiconv, nkf, perl, skk-dicts, which }:
+
+stdenv.mkDerivation {
+  pname = "cmigemo";
+  version = "1.3e";
+
+  src = fetchFromGitHub {
+    owner = "koron";
+    repo = "cmigemo";
+    rev = "5c014a885972c77e67d0d17d367d05017c5873f7";
+    sha256 = "0xrblwhaf70m0knkd5584iahaq84rlk0926bhdsrzmakpw77hils";
+  };
+
+  nativeBuildInputs = [ gzip libiconv nkf perl which ];
+
+  postUnpack = ''
+    cp ${skk-dicts}/share/SKK-JISYO.L source/dict/
+  '';
+
+  patches = [ ./no-http-tool-check.patch ];
+
+  makeFlags = [ "INSTALL=install" ];
+
+  buildPhase = if stdenv.isDarwin then "make osx-all" else "make gcc-all";
+
+  installTargets = [ (if stdenv.isDarwin then "osx-install" else "gcc-install") ];
+
+  meta = with lib; {
+    description = "A tool that supports Japanese incremental search with Romaji";
+    homepage = "https://www.kaoriya.net/software/cmigemo";
+    license = licenses.mit;
+    maintainers = [ maintainers.cohei ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/tools/text/cmigemo/no-http-tool-check.patch b/pkgs/tools/text/cmigemo/no-http-tool-check.patch
new file mode 100644
index 00000000000..518bfa0e617
--- /dev/null
+++ b/pkgs/tools/text/cmigemo/no-http-tool-check.patch
@@ -0,0 +1,23 @@
+diff --git a/configure b/configure
+index 4480261..2fb9b34 100755
+--- a/configure
++++ b/configure
+@@ -28,18 +28,6 @@ do
+   esac
+ done
+ 
+-# Check HTTP access tool
+-if CHECK_COMMAND curl ; then
+-  PROGRAM_HTTP="curl -O"
+-elif CHECK_COMMAND wget ; then
+-  PROGRAM_HTTP="wget"
+-elif CHECK_COMMAND fetch ; then
+-  PROGRAM_HTTP="fetch"
+-else
+-  echo "ERROR: Require one of HTTP access tools (curl, wget or fetch)."
+-  exit 1
+-fi
+-
+ # Check encoding filter
+ if CHECK_COMMAND qkc ; then
+   PROGRAM_ENCODEFILTER="qkc -q -u"
diff --git a/pkgs/tools/text/codesearch/default.nix b/pkgs/tools/text/codesearch/default.nix
index 7f706cf1376..9c3e9fbd840 100644
--- a/pkgs/tools/text/codesearch/default.nix
+++ b/pkgs/tools/text/codesearch/default.nix
@@ -1,9 +1,9 @@
 # This file was generated by go2nix.
-{ stdenv, buildGoPackage, fetchgit }:
+{ lib, buildGoPackage, fetchgit }:
 
 buildGoPackage rec {
   pname = "codesearch";
-  version = "20150717-${stdenv.lib.strings.substring 0 7 rev}";
+  version = "20150717-${lib.strings.substring 0 7 rev}";
   rev = "a45d81b686e85d01f2838439deaf72126ccd5a96";
 
   goPackagePath = "github.com/google/codesearch";
@@ -14,13 +14,11 @@ buildGoPackage rec {
     sha256 = "12bv3yz0l3bmsxbasfgv7scm9j719ch6pmlspv4bd4ix7wjpyhny";
   };
 
-  goDeps = ./deps.nix;
-
   meta = {
     description = "Fast, indexed regexp search over large file trees";
     homepage = "https://github.com/google/codesearch";
-    license = [ stdenv.lib.licenses.bsd3 ];
-    maintainers = [ stdenv.lib.maintainers.bennofs ];
-    platforms = stdenv.lib.platforms.unix;
+    license = [ lib.licenses.bsd3 ];
+    maintainers = [ lib.maintainers.bennofs ];
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/codesearch/deps.nix b/pkgs/tools/text/codesearch/deps.nix
deleted file mode 100644
index 2d1dad70634..00000000000
--- a/pkgs/tools/text/codesearch/deps.nix
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file was generated by go2nix.
-[
-]
diff --git a/pkgs/tools/text/colordiff/default.nix b/pkgs/tools/text/colordiff/default.nix
index c3da9a60555..364d3c6edc4 100644
--- a/pkgs/tools/text/colordiff/default.nix
+++ b/pkgs/tools/text/colordiff/default.nix
@@ -1,26 +1,36 @@
-{ stdenv, fetchurl, perl /*, xmlto */}:
+{ lib, stdenv, fetchFromGitHub, docbook_xml_dtd_412, docbook_xsl, perl, w3m, xmlto }:
 
 stdenv.mkDerivation rec {
-  name = "colordiff-1.0.19";
+  pname = "colordiff";
+  version = "1.0.19";
 
-  src = fetchurl {
-    urls = [
-      "https://www.colordiff.org/${name}.tar.gz"
-      "http://www.colordiff.org/archive/${name}.tar.gz"
-    ];
-    sha256 = "069vzzgs7b44bmfh3ks2psrdb26s1w19gp9w4xxbgi7nhx6w3s26";
+  src = fetchFromGitHub {
+    owner = "daveewart";
+    repo = "colordiff";
+    rev = "v${version}";
+    sha256 = "1v7s1yn0qvn08iwm5js8mxn442392qyr7s9ij506byfd497ag7qk";
   };
 
-  buildInputs = [ perl /* xmlto */ ];
+  nativeBuildInputs = [ docbook_xml_dtd_412 docbook_xsl perl w3m xmlto ];
 
-  dontBuild = 1; # do not build doc yet.
+  buildInputs = [ perl ];
 
-  installPhase = ''make INSTALL_DIR=/bin MAN_DIR=/share/man/man1 DESTDIR="$out" install'';
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace 'TMPDIR=colordiff-''${VERSION}' ""
+  '';
 
-  meta = with stdenv.lib; {
+  installFlags = [
+    "INSTALL_DIR=/bin"
+    "MAN_DIR=/share/man/man1"
+    "DESTDIR=${placeholder "out"}"
+  ];
+
+  meta = with lib; {
     description = "Wrapper for 'diff' that produces the same output but with pretty 'syntax' highlighting";
     homepage = "https://www.colordiff.org/";
-    license = licenses.gpl3;
-    platforms = platforms.linux ++ platforms.darwin;
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ SuperSandro2000 ];
   };
 }
diff --git a/pkgs/tools/text/coloursum/default.nix b/pkgs/tools/text/coloursum/default.nix
index 38f544496d5..8391b75a67b 100644
--- a/pkgs/tools/text/coloursum/default.nix
+++ b/pkgs/tools/text/coloursum/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, rustPlatform, Security }:
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
 
 rustPlatform.buildRustPackage rec {
   pname = "coloursum";
@@ -11,11 +11,11 @@ rustPlatform.buildRustPackage rec {
     sha256 = "1piz0l7qdcvjzfykm6rzqc8s1daxp3cj3923v9cmm41bc2v0p5q0";
   };
 
-  cargoSha256 = "1w0q5w0bf1682jvzcml8cgmr9mrgi4if0p63wzchyjav330dp6pk";
+  cargoSha256 = "08l01ivmln9gwabwa1p0gk454qyxlcpnlxx840vys476f4pw7vvf";
 
-  buildInputs = stdenv.lib.optional stdenv.isDarwin Security;
+  buildInputs = lib.optional stdenv.isDarwin Security;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Colourise your checksum output";
     homepage = "https://github.com/ticky/coloursum";
     license = licenses.mit;
diff --git a/pkgs/tools/text/convertlit/default.nix b/pkgs/tools/text/convertlit/default.nix
index a947ef98a68..18dc01c01d0 100644
--- a/pkgs/tools/text/convertlit/default.nix
+++ b/pkgs/tools/text/convertlit/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchzip, libtommath}:
+{lib, stdenv, fetchzip, libtommath}:
 
 stdenv.mkDerivation {
   name = "convertlit-1.8";
@@ -30,7 +30,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://www.convertlit.com/";
     description = "A tool for converting Microsoft Reader ebooks to more open formats";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/copyright-update/default.nix b/pkgs/tools/text/copyright-update/default.nix
index ca815f915db..e0318c20a0e 100644
--- a/pkgs/tools/text/copyright-update/default.nix
+++ b/pkgs/tools/text/copyright-update/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, perl }:
+{ lib, stdenv, fetchFromGitHub, perl }:
 
 stdenv.mkDerivation rec {
   pname = "copyright-update";
@@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
 
   installFlags = [ "INSTALL=install" "prefix=$(out)" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/jaalto/project--copyright-update";
     description = "Updates the copyright information in a set of files";
     license = licenses.gpl2Plus;
diff --git a/pkgs/tools/text/csvkit/default.nix b/pkgs/tools/text/csvkit/default.nix
index 7a0240fc730..56f5bae3123 100644
--- a/pkgs/tools/text/csvkit/default.nix
+++ b/pkgs/tools/text/csvkit/default.nix
@@ -1,36 +1,37 @@
-{ lib, python3, glibcLocales }:
+{ lib, fetchpatch, python3 }:
 
 python3.pkgs.buildPythonApplication rec {
   pname = "csvkit";
-  version = "1.0.4";
+  version = "1.0.5";
 
   src = python3.pkgs.fetchPypi {
     inherit pname version;
-    sha256 = "1830lb95rh1iyi3drlwxzb6y3pqkii0qiyzd40c1kvhvaf1s6lqk";
+    sha256 = "1ffmbzk4rxnl1yhqfl58v7kvl5m9cbvjm8v7xp4mvr00sgs91lvv";
   };
 
+  patches = [
+    # Fixes a failing dbf related test. Won't be needed on 1.0.6 or later.
+    (fetchpatch {
+      url = "https://github.com/wireservice/csvkit/commit/5f22e664121b13d9ff005a9206873a8f97431dca.patch";
+      sha256 = "1kg00z65x7l6dnm5nfsr5krs8m7mv23hhb1inkaqf5m5fpkpnvv7";
+    })
+  ];
+
   propagatedBuildInputs = with python3.pkgs; [
     agate
     agate-excel
     agate-dbf
-    # sql test fail with agate-sql-0.5.4
-    (agate-sql.overridePythonAttrs(old: rec {
-      version = "0.5.3";
-      src = python3.pkgs.fetchPypi {
-        inherit (old) pname;
-        inherit version;
-        sha256 = "1d6rbahmdix7xi7ma2v86fpk5yi32q5dba5vama35w5mmn2pnyw7";
-      };}))
+    agate-sql
     six
+    setuptools
   ];
 
   checkInputs = with python3.pkgs; [
-    glibcLocales nose
+    nose
+    pytestCheckHook
   ];
 
-  checkPhase = ''
-    LC_ALL="en_US.UTF-8" nosetests -e test_csvsql
-  '';
+  pythonImportsCheck = [ "csvkit" ];
 
   meta = with lib; {
     description = "A suite of command-line tools for converting to and working with CSV";
diff --git a/pkgs/tools/text/dadadodo/default.nix b/pkgs/tools/text/dadadodo/default.nix
index 5de8e25e6fb..a70a7efda72 100644
--- a/pkgs/tools/text/dadadodo/default.nix
+++ b/pkgs/tools/text/dadadodo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "dadadodo";
@@ -9,6 +9,8 @@ stdenv.mkDerivation rec {
     sha256 = "1pzwp3mim58afjrc92yx65mmgr1c834s1v6z4f4gyihwjn8bn3if";
   };
 
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
   installPhase = ''
     mkdir -p $out/bin
     cp dadadodo $out/bin
@@ -16,10 +18,10 @@ stdenv.mkDerivation rec {
 
   hardeningDisable = [ "format" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Markov chain-based text generator";
     homepage = "http://www.jwz.org/dadadodo";
     maintainers = with maintainers; [ pSub ];
-    platforms = with platforms; linux;
+    platforms = platforms.all;
   };
 }
diff --git a/pkgs/tools/text/dcs/default.nix b/pkgs/tools/text/dcs/default.nix
new file mode 100644
index 00000000000..511931f0380
--- /dev/null
+++ b/pkgs/tools/text/dcs/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, yuicompressor
+, zopfli
+, stdenv
+}:
+buildGoModule {
+  pname = "dcs";
+  version = "unstable-2021-04-07";
+
+  src = fetchFromGitHub {
+    owner = "Debian";
+    repo = "dcs";
+    rev = "da46accc4d55e9bfde1a6852ac5a9e730fcbbb2c";
+    sha256 = "N+6BXlKn1YTlh0ZdPNWa0nuJNcQtlUIc9TocM8cbzQk=";
+  };
+
+  vendorSha256 = "l2mziuisx0HzuP88rS5M+Wha6lu8P036wJYZlmzjWfs=";
+
+  # Depends on dcs binaries
+  doCheck = false;
+
+  nativeBuildInputs = [
+    yuicompressor
+    zopfli
+  ];
+
+  postBuild = ''
+    make -C static -j$NIX_BUILD_CORES
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/dcs
+    cp -r cmd/dcs-web/templates $out/share/dcs
+    cp -r static $out/share/dcs
+  '';
+
+  meta = with lib; {
+    description = "Debian Code Search";
+    homepage = "https://github.com/Debian/dcs";
+    license = licenses.bsd3;
+    maintainers = teams.determinatesystems.members;
+    broken = stdenv.isAarch64;
+  };
+}
diff --git a/pkgs/tools/text/dfmt/default.nix b/pkgs/tools/text/dfmt/default.nix
new file mode 100644
index 00000000000..16702bb6966
--- /dev/null
+++ b/pkgs/tools/text/dfmt/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, python3
+}:
+
+let
+  inherit (python3.pkgs)
+    buildPythonApplication
+    fetchPypi
+    pythonOlder;
+in
+buildPythonApplication rec {
+  pname = "dfmt";
+  version = "1.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7af6360ca8d556f1cfe82b97f03b8d1ea5a9d6de1fa3018290c844b6566d9d6e";
+  };
+
+  meta = with lib; {
+    description = "Format paragraphs, comments and doc strings";
+    homepage = "https://github.com/dmerejkowsky/dfmt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ cole-h ];
+  };
+}
diff --git a/pkgs/tools/text/diction/default.nix b/pkgs/tools/text/diction/default.nix
index f43cd94a83e..be486cccf54 100644
--- a/pkgs/tools/text/diction/default.nix
+++ b/pkgs/tools/text/diction/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "diction";
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
       characteristics of a document, including sentence length and other
       readability measures.
     '';
-    license = stdenv.lib.licenses.gpl3Plus;
-    platforms = stdenv.lib.platforms.unix;
+    license = lib.licenses.gpl3Plus;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/diffr/default.nix b/pkgs/tools/text/diffr/default.nix
index 4fa7814ad00..a77a5dc081e 100644
--- a/pkgs/tools/text/diffr/default.nix
+++ b/pkgs/tools/text/diffr/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, rustPlatform, Security }:
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
 
 rustPlatform.buildRustPackage rec {
   pname = "diffr";
@@ -11,15 +11,15 @@ rustPlatform.buildRustPackage rec {
     sha256 = "18ks5g4bx6iz9hdjxmi6a41ncxpb1hnsscdlddp2gr40k3vgd0pa";
   };
 
-  cargoSha256 = "09yn02985yv40n9y0ipz0jmj7iqhz7l8hd3ry9ib3fyw9pyklnfa";
+  cargoSha256 = "05rfjangmyvmqm0bvl4bcvc7m4zhg66gknh85sxr3bzrlwzacwgw";
 
-  buildInputs = (stdenv.lib.optional stdenv.isDarwin Security);
+  buildInputs = (lib.optional stdenv.isDarwin Security);
 
   preCheck = ''
     export DIFFR_TESTS_BINARY_PATH=$releaseDir/diffr
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Yet another diff highlighting tool";
     homepage = "https://github.com/mookid/diffr";
     license = with licenses; [ mit ];
diff --git a/pkgs/tools/text/diffstat/default.nix b/pkgs/tools/text/diffstat/default.nix
index bed34e30e79..c8ff1e973a5 100644
--- a/pkgs/tools/text/diffstat/default.nix
+++ b/pkgs/tools/text/diffstat/default.nix
@@ -1,17 +1,17 @@
-{ fetchurl, stdenv }:
+{ fetchurl, lib, stdenv }:
 
 stdenv.mkDerivation rec {
-  name = "diffstat-1.63";
+  name = "diffstat-1.64";
 
   src = fetchurl {
     urls = [
       "ftp://ftp.invisible-island.net/diffstat/${name}.tgz"
       "https://invisible-mirror.net/archives/diffstat/${name}.tgz"
     ];
-    sha256 = "0vyw200s5dv1257pmrh6c6fdkmw3slyz5szpqfx916xr04sdbpby";
+    sha256 = "sha256-uK7jjZ0uHQWSbmtVgQqdLC3UB/JNaiZzh1Y6RDbj9/w=";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Read output of diff and display a histogram of the changes";
     longDescription = ''
       diffstat reads the output of diff and displays a histogram of the
diff --git a/pkgs/tools/text/diffutils/default.nix b/pkgs/tools/text/diffutils/default.nix
index 6fd69a9ba4c..d95e7ae399d 100644
--- a/pkgs/tools/text/diffutils/default.nix
+++ b/pkgs/tools/text/diffutils/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, xz, coreutils ? null }:
+{ lib, stdenv, fetchurl, xz, coreutils ? null }:
 
 # Note: this package is used for bootstrapping fetchurl, and thus
 # cannot use fetchpatch! All mutable patches (generated by GitHub or
@@ -6,10 +6,11 @@
 # files.
 
 stdenv.mkDerivation rec {
-  name = "diffutils-3.7";
+  pname = "diffutils";
+  version = "3.7";
 
   src = fetchurl {
-    url = "mirror://gnu/diffutils/${name}.tar.xz";
+    url = "mirror://gnu/diffutils/diffutils-${version}.tar.xz";
     sha256 = "09isrg0isjinv8c535nxsi1s86wfdfzml80dbw41dj9x3hiad9xk";
   };
 
@@ -22,10 +23,10 @@ stdenv.mkDerivation rec {
   configureFlags =
     # "pr" need not be on the PATH as a run-time dep, so we need to tell
     # configure where it is. Covers the cross and native case alike.
-    stdenv.lib.optional (coreutils != null) "PR_PROGRAM=${coreutils}/bin/pr"
-    ++ stdenv.lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "gl_cv_func_getopt_gnu=yes";
+    lib.optional (coreutils != null) "PR_PROGRAM=${coreutils}/bin/pr"
+    ++ lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "gl_cv_func_getopt_gnu=yes";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://www.gnu.org/software/diffutils/diffutils.html";
     description = "Commands for showing the differences between files (diff, cmp, etc.)";
     license = licenses.gpl3;
diff --git a/pkgs/tools/text/dirdiff/default.nix b/pkgs/tools/text/dirdiff/default.nix
new file mode 100644
index 00000000000..b49df59b29e
--- /dev/null
+++ b/pkgs/tools/text/dirdiff/default.nix
@@ -0,0 +1,59 @@
+{ copyDesktopItems, fetchurl, lib, makeDesktopItem, stdenv, tcl, tk }:
+
+stdenv.mkDerivation rec {
+  pname = "dirdiff";
+  version = "2.1";
+
+  src = fetchurl {
+    url = "https://www.samba.org/ftp/paulus/${pname}-${version}.tar.gz";
+    sha256 = "0lljd8av68j70733yshzzhxjr1lm0vgmbqsm8f02g03qsma3cdyb";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems ];
+  buildInputs = [ tcl tk ];
+
+  # Some light path patching.
+  patches = [ ./dirdiff-2.1-vars.patch ];
+  postPatch = ''
+    for file in dirdiff Makefile; do
+      substituteInPlace "$file" \
+          --subst-var out \
+          --subst-var-by tcl ${tcl} \
+          --subst-var-by tk ${tk}
+    done
+  '';
+
+  # If we don't create the directories ourselves, then 'make install' creates
+  # files named 'bin' and 'lib'.
+  preInstall = ''
+    mkdir -p $out/bin $out/lib
+  '';
+
+  installFlags = [
+    "BINDIR=${placeholder "out"}/bin"
+    "LIBDIR=${placeholder "out"}/lib"
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "dirdiff";
+      exec = "dirdiff";
+      desktopName = "Dirdiff";
+      genericName = "Directory Diff Viewer";
+      comment = "Diff and merge directory trees";
+      categories = "Development;";
+    })
+  ];
+
+  meta = with lib; {
+    description = "Graphical directory tree diff and merge tool";
+    longDescription = ''
+      Dirdiff is a graphical tool for displaying the differences between
+      directory trees and for merging changes from one tree into another.
+    '';
+    homepage = "https://www.samba.org/ftp/paulus/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ khumba ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch b/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch
new file mode 100644
index 00000000000..4e7aa025754
--- /dev/null
+++ b/pkgs/tools/text/dirdiff/dirdiff-2.1-vars.patch
@@ -0,0 +1,32 @@
+diff '--color=auto' -ru dirdiff-2.1/dirdiff dirdiff-2.1-patched/dirdiff
+--- dirdiff-2.1/dirdiff	2005-04-20 03:09:53.000000000 -0700
++++ dirdiff-2.1-patched/dirdiff	2021-02-14 22:54:09.837692023 -0800
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+ # Tcl ignores the next line \
+-exec wish "$0" -- "${1+$@}"
++exec @tk@/bin/wish "$0" -- "${1+$@}"
+ 
+ # Copyright (C) 1999-2004 Paul Mackerras.  All rights reserved.
+ # This program is free software; it may be used, copied, modified
+@@ -17,7 +17,7 @@
+ set TclExe [info nameofexecutable]
+ set compound_ok [expr {$tcl_version >= 8.4}]
+ 
+-set nofilecmp [catch {load libfilecmp.so.0.0}]
++set nofilecmp [catch {load @out@/lib/libfilecmp.so.0.0}]
+ set rcsflag {}
+ set diffbflag {}
+ set diffBflag {}
+diff '--color=auto' -ru dirdiff-2.1/Makefile dirdiff-2.1-patched/Makefile
+--- dirdiff-2.1/Makefile	2005-04-19 03:22:01.000000000 -0700
++++ dirdiff-2.1-patched/Makefile	2021-02-14 22:54:58.575400923 -0800
+@@ -7,7 +7,7 @@
+ INSTALL=install
+ 
+ # You may need to change the -I arguments depending on your system
+-CFLAGS=-O3 -I/usr/include/tcl8.3/ -I/usr/include/tcl
++CFLAGS=-O3 -I@tcl@/include
+ 
+ all:	libfilecmp.so.0.0
+ 
diff --git a/pkgs/tools/text/discount/default.nix b/pkgs/tools/text/discount/default.nix
index 5a4dfd5de85..264e944028e 100644
--- a/pkgs/tools/text/discount/default.nix
+++ b/pkgs/tools/text/discount/default.nix
@@ -1,14 +1,14 @@
-{ stdenv, fetchFromGitHub }:
+{ lib, stdenv, fetchFromGitHub }:
 
 stdenv.mkDerivation rec {
-  version = "2.2.6";
+  version = "2.2.7";
   pname = "discount";
 
   src = fetchFromGitHub {
     owner = "Orc";
     repo = pname;
     rev = "v${version}";
-    sha256 = "1y066jkxfas0vdixbqq66j9p00a102sbfgq5gbrblfczqjrmc38w";
+    sha256 = "0p2gznrsvv82zxbajqir8y2ap1ribbgagqg1bzhv3i81p2byhjh7";
   };
 
   patches = ./fix-configure-path.patch;
@@ -23,7 +23,7 @@ stdenv.mkDerivation rec {
 
   doCheck = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Implementation of Markdown markup language in C";
     homepage = "http://www.pell.portland.or.us/~orc/Code/discount/";
     license = licenses.bsd3;
diff --git a/pkgs/tools/text/dos2unix/default.nix b/pkgs/tools/text/dos2unix/default.nix
index b7efe02f4cd..f694b91762c 100644
--- a/pkgs/tools/text/dos2unix/default.nix
+++ b/pkgs/tools/text/dos2unix/default.nix
@@ -1,22 +1,23 @@
-{stdenv, fetchurl, perl, gettext }:
+{lib, stdenv, fetchurl, perl, gettext }:
 
 stdenv.mkDerivation rec {
   pname = "dos2unix";
-  version = "7.4.1";
+  version = "7.4.2";
 
   src = fetchurl {
     url = "https://waterlan.home.xs4all.nl/dos2unix/${pname}-${version}.tar.gz";
-    sha256 = "08w6yywzirsxq8bh87jycvvw922ybhc2l426j2iqzliyn1h8mm8w";
+    sha256 = "00dfsf4rfyjb5j12gan8xjiirm0asshdz6dmd3l34a7ays6wadb0";
   };
 
   nativeBuildInputs = [ perl gettext ];
   makeFlags = [ "prefix=${placeholder "out"}" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Convert text files with DOS or Mac line breaks to Unix line breaks and vice versa";
     homepage = "https://waterlan.home.xs4all.nl/dos2unix.html";
     changelog = "https://sourceforge.net/p/dos2unix/dos2unix/ci/dos2unix-${version}/tree/dos2unix/NEWS.txt?format=raw";
     license = licenses.bsd2;
     maintainers = with maintainers; [ c0bw3b ];
+    platforms = platforms.all;
   };
 }
diff --git a/pkgs/tools/text/each/default.nix b/pkgs/tools/text/each/default.nix
new file mode 100644
index 00000000000..0218cf5dde2
--- /dev/null
+++ b/pkgs/tools/text/each/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "each";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "arraypad";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "04rx8jf871l4darfx6029dhpnbpmzwjgzazayp1qcaadsk8207z5";
+  };
+
+  cargoSha256 = "1r7nzfh7v2mlp0wdrcpqfj68h3zmip2m3d4z2nwxyikmw7c80car";
+
+  meta = with lib; {
+    description = " A better way of working with structured data on the command line";
+    homepage = "https://github.com/arraypad/each";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ thiagokokada ];
+  };
+}
diff --git a/pkgs/tools/text/ebook-tools/default.nix b/pkgs/tools/text/ebook-tools/default.nix
index 2a6af785692..bb93b217ea2 100644
--- a/pkgs/tools/text/ebook-tools/default.nix
+++ b/pkgs/tools/text/ebook-tools/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, cmake, pkgconfig, libxml2, libzip }:
+{ lib, stdenv, fetchurl, cmake, pkg-config, libxml2, libzip }:
 
 stdenv.mkDerivation rec {
   name = "ebook-tools-0.2.2";
@@ -8,18 +8,19 @@ stdenv.mkDerivation rec {
     sha256 = "1bi7wsz3p5slb43kj7lgb3r6lb91lvb6ldi556k4y50ix6b5khyb";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ cmake libxml2 libzip ];
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ libxml2 libzip ];
 
-  preConfigure = 
+  preConfigure =
     ''
       NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE $(pkg-config --cflags libzip)"
     '';
 
-  meta = {
+  meta = with lib; {
     homepage = "http://ebook-tools.sourceforge.net";
     description = "Tools and library for dealing with various ebook file formats";
     maintainers = [ ];
-    platforms = stdenv.lib.platforms.all;
+    platforms = platforms.all;
+    license = licenses.mit;
   };
 }
diff --git a/pkgs/tools/text/enca/default.nix b/pkgs/tools/text/enca/default.nix
index 6cfb4721066..7015bd4453c 100644
--- a/pkgs/tools/text/enca/default.nix
+++ b/pkgs/tools/text/enca/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libiconv, recode }:
+{ lib, stdenv, fetchurl, libiconv, recode }:
 
 stdenv.mkDerivation rec {
   pname = "enca";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ recode libiconv ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Detects the encoding of text files and reencodes them";
 
     longDescription = ''
@@ -23,6 +23,6 @@ stdenv.mkDerivation rec {
     '';
 
     license = licenses.gpl2;
-   
+
   };
 }
diff --git a/pkgs/tools/text/enscript/default.nix b/pkgs/tools/text/enscript/default.nix
index 670e052772e..1918029317a 100644
--- a/pkgs/tools/text/enscript/default.nix
+++ b/pkgs/tools/text/enscript/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, gettext }:
+{ lib, stdenv, fetchurl, gettext }:
 
 stdenv.mkDerivation rec {
   name = "enscript-1.6.6";
@@ -33,11 +33,11 @@ stdenv.mkDerivation rec {
          it has many options that can be used to customize printouts.
       '';
 
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
 
     homepage = "https://www.gnu.org/software/enscript/";
 
     maintainers = [ ];
-    platforms = stdenv.lib.platforms.all;
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/epubcheck/default.nix b/pkgs/tools/text/epubcheck/default.nix
index b40769e5522..88ead40541f 100644
--- a/pkgs/tools/text/epubcheck/default.nix
+++ b/pkgs/tools/text/epubcheck/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchzip
+{ lib, stdenv, fetchzip
 , jre, makeWrapper }:
 
 stdenv.mkDerivation rec {
@@ -31,7 +31,7 @@ stdenv.mkDerivation rec {
       --add-flags "-classpath $classpath com.adobe.epubcheck.tool.Checker"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/w3c/epubcheck";
     description = "Validation tool for EPUB";
     license = with licenses; [ asl20 bsd3 mpl10 w3c ];
diff --git a/pkgs/tools/text/esh/default.nix b/pkgs/tools/text/esh/default.nix
index 171d90026be..a1d6db2a7c2 100644
--- a/pkgs/tools/text/esh/default.nix
+++ b/pkgs/tools/text/esh/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, asciidoctor, gawk, gnused, runtimeShell }:
+{ lib, stdenv, fetchFromGitHub, asciidoctor, gawk, gnused, runtimeShell }:
 
 stdenv.mkDerivation rec {
   pname = "esh";
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
   doCheck = true;
   checkTarget = "test";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Simple templating engine based on shell";
     homepage = "https://github.com/jirutka/esh";
     license = licenses.mit;
diff --git a/pkgs/tools/text/fanficfare/default.nix b/pkgs/tools/text/fanficfare/default.nix
index 1dbe4514363..5fb70f63dc3 100644
--- a/pkgs/tools/text/fanficfare/default.nix
+++ b/pkgs/tools/text/fanficfare/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, python3Packages }:
+{ lib, python3Packages }:
 
 python3Packages.buildPythonApplication rec {
   pname = "FanFicFare";
@@ -18,12 +18,11 @@ python3Packages.buildPythonApplication rec {
 
   doCheck = false; # no tests exist
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Tool for making eBooks from fanfiction web sites";
     homepage = "https://github.com/JimmXinu/FanFicFare";
     license = licenses.gpl3;
-    platforms = platforms.linux;
+    platforms = platforms.unix;
     maintainers = with maintainers; [ dwarfmaster ];
-    inherit version;
   };
 }
diff --git a/pkgs/tools/text/fastmod/default.nix b/pkgs/tools/text/fastmod/default.nix
index d15683894a2..d6e2dc4dd1f 100644
--- a/pkgs/tools/text/fastmod/default.nix
+++ b/pkgs/tools/text/fastmod/default.nix
@@ -1,25 +1,26 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , rustPlatform
+, libiconv
 , Security
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "fastmod";
-  version = "0.4.0";
+  version = "0.4.2";
 
   src = fetchFromGitHub {
     owner = "facebookincubator";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0089a17h0wgan3fs6x1la35lzjs1pib7p81wqkh3zcwvx8ffa8z8";
+    sha256 = "sha256-Lv8hARD/aVWiWpJQmPWPeACpX15+3NogoUl5yh63E7A=";
   };
 
-  cargoSha256 = "02nkxjwfiljndmi0pv98chfsw9vmjzgmp5r14mchpayp4943qk9m";
+  cargoSha256 = "sha256-L1MKoVacVKcpEG2IfS+eENxFZNiSaTDTxfFbFlvzYl8=";
 
-  buildInputs = stdenv.lib.optional stdenv.isDarwin Security;
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv Security ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A utility that makes sweeping changes to large, shared code bases";
     homepage = "https://github.com/facebookincubator/fastmod";
     license = licenses.asl20;
diff --git a/pkgs/tools/text/frangipanni/default.nix b/pkgs/tools/text/frangipanni/default.nix
new file mode 100644
index 00000000000..58da1a4be4d
--- /dev/null
+++ b/pkgs/tools/text/frangipanni/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "frangipanni";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "birchb1024";
+    repo = "frangipanni";
+    rev = "v${version}";
+    sha256 = "sha256-jIXyqwZWfCBSDTTodHTct4V5rjYv7h4Vcw7cXOFk17w=";
+  };
+
+  vendorSha256 = "sha256-TSN5M/UCTtfoTf1hDCfrJMCFdSwL/NVXssgt4aefom8=";
+
+  meta = with lib; {
+    description = "Convert lines of text into a tree structure";
+    homepage = "https://github.com/birchb1024/frangipanni";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/pkgs/tools/text/fst/0001-cargo-lockfile.patch b/pkgs/tools/text/fst/0001-cargo-lockfile.patch
new file mode 100644
index 00000000000..c8c56ffdb62
--- /dev/null
+++ b/pkgs/tools/text/fst/0001-cargo-lockfile.patch
@@ -0,0 +1,935 @@
+From 84797e8fb8ead8822ebfd251b47c72433555860e Mon Sep 17 00:00:00 2001
+From: "Robert T. McGibbon" <rmcgibbo@gmail.com>
+Date: Fri, 5 Mar 2021 16:59:41 -0500
+Subject: [PATCH 1/1] Create cargo lock file for 0.4.5
+
+---
+ Cargo.lock | 916 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 916 insertions(+)
+ create mode 100644 Cargo.lock
+
+diff --git a/Cargo.lock b/Cargo.lock
+new file mode 100644
+index 0000000..136677d
+--- /dev/null
++++ b/Cargo.lock
+@@ -0,0 +1,916 @@
++# This file is automatically @generated by Cargo.
++# It is not intended for manual editing.
++[[package]]
++name = "anyhow"
++version = "1.0.38"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1"
++
++[[package]]
++name = "atty"
++version = "0.2.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
++dependencies = [
++ "hermit-abi",
++ "libc",
++ "winapi",
++]
++
++[[package]]
++name = "autocfg"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
++
++[[package]]
++name = "bit-set"
++version = "0.5.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
++dependencies = [
++ "bit-vec",
++]
++
++[[package]]
++name = "bit-vec"
++version = "0.6.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
++
++[[package]]
++name = "bitflags"
++version = "1.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
++
++[[package]]
++name = "bstr"
++version = "0.2.15"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d"
++dependencies = [
++ "lazy_static",
++ "memchr",
++ "regex-automata",
++ "serde",
++]
++
++[[package]]
++name = "bumpalo"
++version = "3.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe"
++
++[[package]]
++name = "byteorder"
++version = "1.4.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"
++
++[[package]]
++name = "cast"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
++dependencies = [
++ "rustc_version",
++]
++
++[[package]]
++name = "cfg-if"
++version = "0.1.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
++
++[[package]]
++name = "cfg-if"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
++
++[[package]]
++name = "clap"
++version = "2.33.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
++dependencies = [
++ "bitflags",
++ "textwrap",
++ "unicode-width",
++]
++
++[[package]]
++name = "criterion"
++version = "0.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ab327ed7354547cc2ef43cbe20ef68b988e70b4b593cbd66a2a61733123a3d23"
++dependencies = [
++ "atty",
++ "cast",
++ "clap",
++ "criterion-plot",
++ "csv",
++ "itertools 0.10.0",
++ "lazy_static",
++ "num-traits",
++ "oorandom",
++ "plotters",
++ "rayon",
++ "regex",
++ "serde",
++ "serde_cbor",
++ "serde_derive",
++ "serde_json",
++ "tinytemplate",
++ "walkdir",
++]
++
++[[package]]
++name = "criterion-plot"
++version = "0.4.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d"
++dependencies = [
++ "cast",
++ "itertools 0.9.0",
++]
++
++[[package]]
++name = "crossbeam-channel"
++version = "0.4.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
++dependencies = [
++ "crossbeam-utils 0.7.2",
++ "maybe-uninit",
++]
++
++[[package]]
++name = "crossbeam-channel"
++version = "0.5.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
++dependencies = [
++ "cfg-if 1.0.0",
++ "crossbeam-utils 0.8.3",
++]
++
++[[package]]
++name = "crossbeam-deque"
++version = "0.8.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
++dependencies = [
++ "cfg-if 1.0.0",
++ "crossbeam-epoch",
++ "crossbeam-utils 0.8.3",
++]
++
++[[package]]
++name = "crossbeam-epoch"
++version = "0.9.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12"
++dependencies = [
++ "cfg-if 1.0.0",
++ "crossbeam-utils 0.8.3",
++ "lazy_static",
++ "memoffset",
++ "scopeguard",
++]
++
++[[package]]
++name = "crossbeam-utils"
++version = "0.7.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
++dependencies = [
++ "autocfg",
++ "cfg-if 0.1.10",
++ "lazy_static",
++]
++
++[[package]]
++name = "crossbeam-utils"
++version = "0.8.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49"
++dependencies = [
++ "autocfg",
++ "cfg-if 1.0.0",
++ "lazy_static",
++]
++
++[[package]]
++name = "csv"
++version = "1.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f9d58633299b24b515ac72a3f869f8b91306a3cec616a602843a383acd6f9e97"
++dependencies = [
++ "bstr",
++ "csv-core",
++ "itoa",
++ "ryu",
++ "serde",
++]
++
++[[package]]
++name = "csv-core"
++version = "0.1.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
++dependencies = [
++ "memchr",
++]
++
++[[package]]
++name = "doc-comment"
++version = "0.3.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
++
++[[package]]
++name = "either"
++version = "1.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
++
++[[package]]
++name = "fnv"
++version = "1.0.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
++
++[[package]]
++name = "fst"
++version = "0.4.5"
++dependencies = [
++ "doc-comment",
++ "fnv",
++ "memmap",
++ "quickcheck",
++ "rand 0.7.3",
++ "utf8-ranges",
++]
++
++[[package]]
++name = "fst"
++version = "0.4.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d79238883cf0307100b90aba4a755d8051a3182305dfe7f649a1e9dc0517006f"
++dependencies = [
++ "utf8-ranges",
++]
++
++[[package]]
++name = "fst-bench"
++version = "0.0.1"
++dependencies = [
++ "criterion",
++ "fnv",
++ "fst 0.4.5",
++]
++
++[[package]]
++name = "fst-bin"
++version = "0.4.1"
++dependencies = [
++ "anyhow",
++ "bit-set",
++ "bstr",
++ "clap",
++ "crossbeam-channel 0.4.4",
++ "csv",
++ "fst 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memmap",
++ "num_cpus",
++ "regex-automata",
++ "serde",
++ "tempfile",
++]
++
++[[package]]
++name = "getrandom"
++version = "0.1.16"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "wasi 0.9.0+wasi-snapshot-preview1",
++]
++
++[[package]]
++name = "getrandom"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "wasi 0.10.2+wasi-snapshot-preview1",
++]
++
++[[package]]
++name = "half"
++version = "1.7.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "62aca2aba2d62b4a7f5b33f3712cb1b0692779a56fb510499d5c0aa594daeaf3"
++
++[[package]]
++name = "hermit-abi"
++version = "0.1.18"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
++dependencies = [
++ "libc",
++]
++
++[[package]]
++name = "itertools"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
++dependencies = [
++ "either",
++]
++
++[[package]]
++name = "itertools"
++version = "0.10.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319"
++dependencies = [
++ "either",
++]
++
++[[package]]
++name = "itoa"
++version = "0.4.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
++
++[[package]]
++name = "js-sys"
++version = "0.3.48"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dc9f84f9b115ce7843d60706df1422a916680bfdfcbdb0447c5614ff9d7e4d78"
++dependencies = [
++ "wasm-bindgen",
++]
++
++[[package]]
++name = "lazy_static"
++version = "1.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
++
++[[package]]
++name = "libc"
++version = "0.2.88"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "03b07a082330a35e43f63177cc01689da34fbffa0105e1246cf0311472cac73a"
++
++[[package]]
++name = "log"
++version = "0.4.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "maybe-uninit"
++version = "2.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
++
++[[package]]
++name = "memchr"
++version = "2.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
++
++[[package]]
++name = "memmap"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
++dependencies = [
++ "libc",
++ "winapi",
++]
++
++[[package]]
++name = "memoffset"
++version = "0.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
++dependencies = [
++ "autocfg",
++]
++
++[[package]]
++name = "num-traits"
++version = "0.2.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
++dependencies = [
++ "autocfg",
++]
++
++[[package]]
++name = "num_cpus"
++version = "1.13.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
++dependencies = [
++ "hermit-abi",
++ "libc",
++]
++
++[[package]]
++name = "oorandom"
++version = "11.1.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
++
++[[package]]
++name = "plotters"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "45ca0ae5f169d0917a7c7f5a9c1a3d3d9598f18f529dd2b8373ed988efea307a"
++dependencies = [
++ "num-traits",
++ "plotters-backend",
++ "plotters-svg",
++ "wasm-bindgen",
++ "web-sys",
++]
++
++[[package]]
++name = "plotters-backend"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b07fffcddc1cb3a1de753caa4e4df03b79922ba43cf882acc1bdd7e8df9f4590"
++
++[[package]]
++name = "plotters-svg"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b38a02e23bd9604b842a812063aec4ef702b57989c37b655254bb61c471ad211"
++dependencies = [
++ "plotters-backend",
++]
++
++[[package]]
++name = "ppv-lite86"
++version = "0.2.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
++
++[[package]]
++name = "proc-macro2"
++version = "1.0.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
++dependencies = [
++ "unicode-xid",
++]
++
++[[package]]
++name = "quickcheck"
++version = "0.9.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f"
++dependencies = [
++ "rand 0.7.3",
++ "rand_core 0.5.1",
++]
++
++[[package]]
++name = "quote"
++version = "1.0.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
++dependencies = [
++ "proc-macro2",
++]
++
++[[package]]
++name = "rand"
++version = "0.7.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
++dependencies = [
++ "getrandom 0.1.16",
++ "libc",
++ "rand_chacha 0.2.2",
++ "rand_core 0.5.1",
++ "rand_hc 0.2.0",
++]
++
++[[package]]
++name = "rand"
++version = "0.8.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
++dependencies = [
++ "libc",
++ "rand_chacha 0.3.0",
++ "rand_core 0.6.2",
++ "rand_hc 0.3.0",
++]
++
++[[package]]
++name = "rand_chacha"
++version = "0.2.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
++dependencies = [
++ "ppv-lite86",
++ "rand_core 0.5.1",
++]
++
++[[package]]
++name = "rand_chacha"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
++dependencies = [
++ "ppv-lite86",
++ "rand_core 0.6.2",
++]
++
++[[package]]
++name = "rand_core"
++version = "0.5.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
++dependencies = [
++ "getrandom 0.1.16",
++]
++
++[[package]]
++name = "rand_core"
++version = "0.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"
++dependencies = [
++ "getrandom 0.2.2",
++]
++
++[[package]]
++name = "rand_hc"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
++dependencies = [
++ "rand_core 0.5.1",
++]
++
++[[package]]
++name = "rand_hc"
++version = "0.3.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
++dependencies = [
++ "rand_core 0.6.2",
++]
++
++[[package]]
++name = "rayon"
++version = "1.5.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
++dependencies = [
++ "autocfg",
++ "crossbeam-deque",
++ "either",
++ "rayon-core",
++]
++
++[[package]]
++name = "rayon-core"
++version = "1.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
++dependencies = [
++ "crossbeam-channel 0.5.0",
++ "crossbeam-deque",
++ "crossbeam-utils 0.8.3",
++ "lazy_static",
++ "num_cpus",
++]
++
++[[package]]
++name = "redox_syscall"
++version = "0.2.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"
++dependencies = [
++ "bitflags",
++]
++
++[[package]]
++name = "regex"
++version = "1.4.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a"
++dependencies = [
++ "regex-syntax",
++]
++
++[[package]]
++name = "regex-automata"
++version = "0.1.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4"
++dependencies = [
++ "byteorder",
++ "fst 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "regex-syntax",
++]
++
++[[package]]
++name = "regex-syntax"
++version = "0.6.22"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581"
++
++[[package]]
++name = "remove_dir_all"
++version = "0.5.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
++dependencies = [
++ "winapi",
++]
++
++[[package]]
++name = "rustc_version"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
++dependencies = [
++ "semver",
++]
++
++[[package]]
++name = "ryu"
++version = "1.0.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
++
++[[package]]
++name = "same-file"
++version = "1.0.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
++dependencies = [
++ "winapi-util",
++]
++
++[[package]]
++name = "scopeguard"
++version = "1.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
++
++[[package]]
++name = "semver"
++version = "0.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
++dependencies = [
++ "semver-parser",
++]
++
++[[package]]
++name = "semver-parser"
++version = "0.7.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
++
++[[package]]
++name = "serde"
++version = "1.0.123"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae"
++dependencies = [
++ "serde_derive",
++]
++
++[[package]]
++name = "serde_cbor"
++version = "0.11.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622"
++dependencies = [
++ "half",
++ "serde",
++]
++
++[[package]]
++name = "serde_derive"
++version = "1.0.123"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++]
++
++[[package]]
++name = "serde_json"
++version = "1.0.64"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
++dependencies = [
++ "itoa",
++ "ryu",
++ "serde",
++]
++
++[[package]]
++name = "syn"
++version = "1.0.61"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ed22b90a0e734a23a7610f4283ac9e5acfb96cbb30dfefa540d66f866f1c09c5"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "unicode-xid",
++]
++
++[[package]]
++name = "tempfile"
++version = "3.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "rand 0.8.3",
++ "redox_syscall",
++ "remove_dir_all",
++ "winapi",
++]
++
++[[package]]
++name = "textwrap"
++version = "0.11.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
++dependencies = [
++ "unicode-width",
++]
++
++[[package]]
++name = "tinytemplate"
++version = "1.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
++dependencies = [
++ "serde",
++ "serde_json",
++]
++
++[[package]]
++name = "unicode-width"
++version = "0.1.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
++
++[[package]]
++name = "unicode-xid"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
++
++[[package]]
++name = "utf8-ranges"
++version = "1.0.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba"
++
++[[package]]
++name = "walkdir"
++version = "2.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
++dependencies = [
++ "same-file",
++ "winapi",
++ "winapi-util",
++]
++
++[[package]]
++name = "wasi"
++version = "0.9.0+wasi-snapshot-preview1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
++
++[[package]]
++name = "wasi"
++version = "0.10.2+wasi-snapshot-preview1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
++
++[[package]]
++name = "wasm-bindgen"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7ee1280240b7c461d6a0071313e08f34a60b0365f14260362e5a2b17d1d31aa7"
++dependencies = [
++ "cfg-if 1.0.0",
++ "wasm-bindgen-macro",
++]
++
++[[package]]
++name = "wasm-bindgen-backend"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5b7d8b6942b8bb3a9b0e73fc79b98095a27de6fa247615e59d096754a3bc2aa8"
++dependencies = [
++ "bumpalo",
++ "lazy_static",
++ "log",
++ "proc-macro2",
++ "quote",
++ "syn",
++ "wasm-bindgen-shared",
++]
++
++[[package]]
++name = "wasm-bindgen-macro"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e5ac38da8ef716661f0f36c0d8320b89028efe10c7c0afde65baffb496ce0d3b"
++dependencies = [
++ "quote",
++ "wasm-bindgen-macro-support",
++]
++
++[[package]]
++name = "wasm-bindgen-macro-support"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cc053ec74d454df287b9374ee8abb36ffd5acb95ba87da3ba5b7d3fe20eb401e"
++dependencies = [
++ "proc-macro2",
++ "quote",
++ "syn",
++ "wasm-bindgen-backend",
++ "wasm-bindgen-shared",
++]
++
++[[package]]
++name = "wasm-bindgen-shared"
++version = "0.2.71"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7d6f8ec44822dd71f5f221a5847fb34acd9060535c1211b70a05844c0f6383b1"
++
++[[package]]
++name = "web-sys"
++version = "0.3.48"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ec600b26223b2948cedfde2a0aa6756dcf1fef616f43d7b3097aaf53a6c4d92b"
++dependencies = [
++ "js-sys",
++ "wasm-bindgen",
++]
++
++[[package]]
++name = "winapi"
++version = "0.3.9"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
++dependencies = [
++ "winapi-i686-pc-windows-gnu",
++ "winapi-x86_64-pc-windows-gnu",
++]
++
++[[package]]
++name = "winapi-i686-pc-windows-gnu"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
++
++[[package]]
++name = "winapi-util"
++version = "0.1.5"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
++dependencies = [
++ "winapi",
++]
++
++[[package]]
++name = "winapi-x86_64-pc-windows-gnu"
++version = "0.4.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+-- 
+2.29.2
+
diff --git a/pkgs/tools/text/fst/default.nix b/pkgs/tools/text/fst/default.nix
new file mode 100644
index 00000000000..99c90400522
--- /dev/null
+++ b/pkgs/tools/text/fst/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, libiconv
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "fst";
+  version = "0.4.5";
+
+  src = fetchFromGitHub {
+    owner = "BurntSushi";
+    repo = pname;
+    rev = version;
+    sha256 = "01qdj7zzgwb1zqcznfmnks3dnl6hnf8ib0sm0sgimsbcvajmhab3";
+  };
+
+  cargoPatches = [
+    # Add Cargo.lock lockfile, which upstream does not include
+    ./0001-cargo-lockfile.patch
+  ];
+
+  cargoBuildFlags = [ "--workspace" ];
+  cargoSha256 = "0440p0hb3nlq9wwk3zac9dldanslrddvqn4gib0vl7aikxkcvh4l";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  doInstallCheck = true;
+  installCheckPhase = ''
+    csv="$(mktemp)"
+    fst="$(mktemp)"
+    printf "abc,1\nabcd,1" > "$csv"
+    $out/bin/fst map "$csv" "$fst" --force
+    $out/bin/fst fuzzy "$fst" 'abc'
+    $out/bin/fst --help > /dev/null
+  '';
+
+  meta = with lib; {
+    description = "Represent large sets and maps compactly with finite state transducers";
+    homepage = "https://github.com/BurntSushi/fst";
+    license = with licenses; [ unlicense /* or */ mit ];
+    maintainers = with maintainers; [ rmcgibbo ];
+  };
+}
diff --git a/pkgs/tools/text/gawk/default.nix b/pkgs/tools/text/gawk/default.nix
index 73e2b8a6de4..b7eb00ee594 100644
--- a/pkgs/tools/text/gawk/default.nix
+++ b/pkgs/tools/text/gawk/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 # TODO: links -lsigsegv but loses the reference for some reason
 , withSigsegv ? (false && stdenv.hostPlatform.system != "x86_64-cygwin"), libsigsegv
 , interactive ? false, readline
@@ -16,7 +16,7 @@
 assert (doCheck && stdenv.isLinux) -> glibcLocales != null;
 
 let
-  inherit (stdenv.lib) optional;
+  inherit (lib) optional;
 in
 stdenv.mkDerivation rec {
   name = "gawk-5.1.0";
@@ -56,7 +56,7 @@ stdenv.mkDerivation rec {
     libsigsegv = if withSigsegv then libsigsegv else null; # for stdenv bootstrap
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://www.gnu.org/software/gawk/";
     description = "GNU implementation of the Awk programming language";
 
@@ -81,4 +81,3 @@ stdenv.mkDerivation rec {
     maintainers = [ ];
   };
 }
-
diff --git a/pkgs/tools/text/gawk/gawk-with-extensions.nix b/pkgs/tools/text/gawk/gawk-with-extensions.nix
index 751e5181bb5..1b82d798d33 100644
--- a/pkgs/tools/text/gawk/gawk-with-extensions.nix
+++ b/pkgs/tools/text/gawk/gawk-with-extensions.nix
@@ -1,7 +1,8 @@
 { runCommand, gawk, extensions, makeWrapper }:
 
 runCommand "gawk-with-extensions" {
-  buildInputs = [ makeWrapper gawk ] ++ extensions;
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ gawk ] ++ extensions;
 } ''
   mkdir -p $out/bin
   for i in ${gawk}/bin/*; do
diff --git a/pkgs/tools/text/gawk/gawkextlib.nix b/pkgs/tools/text/gawk/gawkextlib.nix
index e15b2d4e257..1d3f14ea336 100644
--- a/pkgs/tools/text/gawk/gawkextlib.nix
+++ b/pkgs/tools/text/gawk/gawkextlib.nix
@@ -1,10 +1,10 @@
-{ stdenv, recurseIntoAttrs, fetchgit, writeText, pkgconfig, autoreconfHook
+{ lib, stdenv, recurseIntoAttrs, fetchgit, writeText, pkg-config, autoreconfHook
 , autoconf, automake, libiconv, libtool, texinfo, gettext, gawk, rapidjson, gd
 , shapelib, libharu, lmdb, gmp, glibcLocales, mpfr, more, postgresql, hiredis
 , expat, tre, makeWrapper }:
 
 let
-  buildExtension = stdenv.lib.makeOverridable
+  buildExtension = lib.makeOverridable
     ({ name, gawkextlib, extraBuildInputs ? [ ], doCheck ? true }:
       let is_extension = !isNull gawkextlib;
       in stdenv.mkDerivation rec {
@@ -26,13 +26,13 @@ let
           automake
           libtool
           autoreconfHook
-          pkgconfig
+          pkg-config
           texinfo
           gettext
         ];
 
         buildInputs = [ gawk ] ++ extraBuildInputs;
-        propagatedBuildInputs = stdenv.lib.optional is_extension gawkextlib;
+        propagatedBuildInputs = lib.optional is_extension gawkextlib;
 
         setupHook = if is_extension then ./setup-hook.sh else null;
         inherit gawk;
@@ -40,7 +40,7 @@ let
         inherit doCheck;
         checkInputs = [ more ];
 
-        meta = with stdenv.lib; {
+        meta = with lib; {
           homepage = "https://sourceforge.net/projects/gawkextlib/";
           description = "Dynamically loaded extension libraries for GNU AWK";
           longDescription = ''
diff --git a/pkgs/tools/text/gist/default.nix b/pkgs/tools/text/gist/default.nix
index a4a26e139fb..d2676b37997 100644
--- a/pkgs/tools/text/gist/default.nix
+++ b/pkgs/tools/text/gist/default.nix
@@ -4,8 +4,8 @@ buildRubyGem rec {
   inherit ruby;
   name = "${gemName}-${version}";
   gemName = "gist";
-  version = "5.1.0";
-  source.sha256 = "0s69y6hi5iq5k6317j1kjmhi3mk586j1543q8wa608grwcmbq3fw";
+  version = "6.0.0";
+  source.sha256 = "0qnd1jqd7b04871v4l73grcmi7c0pivm8nsfrqvwivm4n4b3c2hd";
 
   meta = with lib; {
     description = "Upload code to https://gist.github.com (or github enterprise)";
diff --git a/pkgs/tools/text/gjo/default.nix b/pkgs/tools/text/gjo/default.nix
index 28af709c30e..da8fa212940 100644
--- a/pkgs/tools/text/gjo/default.nix
+++ b/pkgs/tools/text/gjo/default.nix
@@ -1,4 +1,4 @@
-{ stdenv
+{ lib
 , buildGoModule
 , fetchFromGitHub
 }:
@@ -14,9 +14,9 @@ buildGoModule rec {
     sha256 = "07halr0jzds4rya6hlvp45bjf7vg4yf49w5q60mch05hk8qkjjdw";
   };
 
-  vendorSha256 = "0sjjj9z1dhilhpc8pq4154czrb79z9cm044jvn75kxcjv6v5l2m5";
+  vendorSha256 = null;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Small utility to create JSON objects";
     homepage = "https://github.com/skanehira/gjo";
     license = licenses.mit;
diff --git a/pkgs/tools/text/glogg/default.nix b/pkgs/tools/text/glogg/default.nix
index dff7262bed2..6bdd6dea029 100644
--- a/pkgs/tools/text/glogg/default.nix
+++ b/pkgs/tools/text/glogg/default.nix
@@ -1,4 +1,4 @@
-{ mkDerivation, stdenv, fetchFromGitHub, qmake, boost }:
+{ mkDerivation, lib, stdenv, fetchFromGitHub, qmake, boost }:
 
 mkDerivation rec {
   pname = "glogg";
@@ -11,7 +11,7 @@ mkDerivation rec {
     sha256 = "0hf1c2m8n88frmxmyn0ndr8129p7iky49nq565sw1asaydm5z6pb";
   };
 
-  postPatch = stdenv.lib.optionalString stdenv.isDarwin ''
+  postPatch = lib.optionalString stdenv.isDarwin ''
     substituteInPlace glogg.pro \
       --replace "boost_program_options-mt" "boost_program_options"
   '';
@@ -22,14 +22,14 @@ mkDerivation rec {
   qmakeFlags = [ "VERSION=${version}" ];
   enableParallelBuilding = true;
 
-  postInstall = stdenv.lib.optionalString stdenv.isDarwin ''
+  postInstall = lib.optionalString stdenv.isDarwin ''
     mkdir -p $out/Applications
     mv $out/bin/glogg.app $out/Applications/glogg.app
     rm -fr $out/{bin,share}
     wrapQtApp $out/Applications/glogg.app/Contents/MacOS/glogg
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "The fast, smart log explorer";
     longDescription = ''
       A multi-platform GUI application to browse and search through long or complex log files. It is designed with programmers and system administrators in mind. glogg can be seen as a graphical, interactive combination of grep and less.
diff --git a/pkgs/tools/text/gnugrep/default.nix b/pkgs/tools/text/gnugrep/default.nix
index f7e3cd42a9b..42a9d913dd2 100644
--- a/pkgs/tools/text/gnugrep/default.nix
+++ b/pkgs/tools/text/gnugrep/default.nix
@@ -1,11 +1,11 @@
-{ stdenv, fetchurl, pcre, libiconv, perl }:
+{ lib, stdenv, fetchurl, pcre, libiconv, perl }:
 
 # Note: this package is used for bootstrapping fetchurl, and thus
 # cannot use fetchpatch! All mutable patches (generated by GitHub or
 # cgit) that are needed here should be included directly in Nixpkgs as
 # files.
 
-let version = "3.4"; in
+let version = "3.6"; in
 
 stdenv.mkDerivation {
   pname = "gnugrep";
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
 
   src = fetchurl {
     url = "mirror://gnu/grep/grep-${version}.tar.xz";
-    sha256 = "1yy33kiwrxrwj2nxa4fg15bvmwyghqbs8qwkdvy5phm784f7brjq";
+    sha256 = "0gipv6bzkm1aihj0ncqpyh164xrzgcxcv9r1kwzyk2g1mzl1azk6";
   };
 
   # Perl is needed for testing
@@ -46,7 +46,7 @@ stdenv.mkDerivation {
       chmod +x $out/bin/egrep $out/bin/fgrep
     '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://www.gnu.org/software/grep/";
     description = "GNU implementation of the Unix grep command";
 
diff --git a/pkgs/tools/text/gnupatch/default.nix b/pkgs/tools/text/gnupatch/default.nix
index 8cca7f15962..97d3136e7e7 100644
--- a/pkgs/tools/text/gnupatch/default.nix
+++ b/pkgs/tools/text/gnupatch/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl
+{ lib, stdenv, fetchurl
 , ed, autoreconfHook
 }:
 
@@ -32,7 +32,7 @@ stdenv.mkDerivation rec {
 
   nativeBuildInputs = [ autoreconfHook ];
 
-  configureFlags = stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+  configureFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
     "ac_cv_func_strnlen_working=yes"
   ];
 
@@ -50,9 +50,9 @@ stdenv.mkDerivation rec {
 
     homepage = "https://savannah.gnu.org/projects/patch";
 
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
 
     maintainers = [ ];
-    platforms = stdenv.lib.platforms.all;
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/gnused/422.nix b/pkgs/tools/text/gnused/422.nix
index 7ea637dc8c9..80aa9f654a6 100644
--- a/pkgs/tools/text/gnused/422.nix
+++ b/pkgs/tools/text/gnused/422.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation {
   name = "gnused-4.2.2";
@@ -8,7 +8,7 @@ stdenv.mkDerivation {
     sha256 = "f048d1838da284c8bc9753e4506b85a1e0cc1ea8999d36f6995bcb9460cddbd7";
   };
 
-  configureFlags = stdenv.lib.optional stdenv.hostPlatform.isMinGW "ac_cv_func__set_invalid_parameter_handler=no";
+  configureFlags = lib.optional stdenv.hostPlatform.isMinGW "ac_cv_func__set_invalid_parameter_handler=no";
 
   outputs = [ "out" "info" ];
 
@@ -25,9 +25,9 @@ stdenv.mkDerivation {
       multiple occurrences of a string within a file.
     '';
 
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
 
-    platforms = stdenv.lib.platforms.all;
+    platforms = lib.platforms.all;
     maintainers = [ ];
   };
 }
diff --git a/pkgs/tools/text/gnused/default.nix b/pkgs/tools/text/gnused/default.nix
index d4da6f2c8ce..23b2794bf13 100644
--- a/pkgs/tools/text/gnused/default.nix
+++ b/pkgs/tools/text/gnused/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, perl }:
+{ lib, stdenv, fetchurl, perl }:
 
 stdenv.mkDerivation rec {
   pname = "gnused";
@@ -30,9 +30,9 @@ stdenv.mkDerivation rec {
       multiple occurrences of a string within a file.
     '';
 
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
 
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = [ ];
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ mic92 ];
   };
 }
diff --git a/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch b/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch
new file mode 100644
index 00000000000..b47b444009a
--- /dev/null
+++ b/pkgs/tools/text/gpt2tc/0001-add-python-shebang.patch
@@ -0,0 +1,10 @@
+diff --git a/gpt2convert.py b/gpt2convert.py
+index 34ca909..6e6cac5 100644
+--- a/gpt2convert.py
++++ b/gpt2convert.py
+@@ -1,3 +1,5 @@
++#!/usr/bin/env python3
++
+ import sys
+ import tensorflow as tf
+ import numpy as np
diff --git a/pkgs/tools/text/gpt2tc/default.nix b/pkgs/tools/text/gpt2tc/default.nix
new file mode 100644
index 00000000000..3714a418548
--- /dev/null
+++ b/pkgs/tools/text/gpt2tc/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, autoPatchelfHook, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "gpt2tc";
+  version = "2021-04-24";
+
+  src = fetchurl {
+    url = "https://bellard.org/libnc/gpt2tc-${version}.tar.gz";
+    hash = "sha256-kHnRziSNRewifM/oKDQwG27rXRvntuUUX8M+PUNHpA4=";
+  };
+
+  patches = [
+    # Add a shebang to the python script so that nix detects it as such and
+    # wraps it properly. Otherwise, it runs in shell and freezes the system.
+    ./0001-add-python-shebang.patch
+  ];
+
+  nativeBuildInputs = [ autoPatchelfHook ];
+
+  buildInputs = [
+    (python3.withPackages (p: with p; [ numpy tensorflow ]))
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D -m755 -t $out/lib libnc${stdenv.hostPlatform.extensions.sharedLibrary}
+    addAutoPatchelfSearchPath $out/lib
+    install -D -m755 -t $out/bin gpt2tc
+    install -T -m755 download_model.sh $out/bin/gpt2-download-model
+    install -T -m755 gpt2convert.py $out/bin/gpt2-convert
+    install -D -m644 -t $out/share/gpt2tc readme.txt gpt2vocab.txt Changelog
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Text completion and compression using GPT-2";
+    homepage = "https://bellard.org/nncp/gpt2tc.html";
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ anna328p ];
+  };
+}
diff --git a/pkgs/tools/text/grin/default.nix b/pkgs/tools/text/grin/default.nix
index 611507da75c..5d89619001b 100644
--- a/pkgs/tools/text/grin/default.nix
+++ b/pkgs/tools/text/grin/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, python2Packages }:
+{ lib, fetchFromGitHub, python2Packages }:
 
 python2Packages.buildPythonApplication rec {
   program = "grin";
@@ -18,7 +18,7 @@ python2Packages.buildPythonApplication rec {
   meta = {
     homepage = "https://github.com/rkern/grin";
     description = "A grep program configured the way I like it";
-    platforms = stdenv.lib.platforms.all;
-    maintainers = [ stdenv.lib.maintainers.sjagoe ];
+    platforms = lib.platforms.all;
+    maintainers = [ lib.maintainers.sjagoe ];
   };
 }
diff --git a/pkgs/tools/text/grip-search/default.nix b/pkgs/tools/text/grip-search/default.nix
index 921691a40af..57f0139dbc9 100644
--- a/pkgs/tools/text/grip-search/default.nix
+++ b/pkgs/tools/text/grip-search/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, boost, pkgconfig, cmake, catch2 }:
+{ lib, stdenv, fetchFromGitHub, boost, pkg-config, cmake, catch2 }:
 
 stdenv.mkDerivation rec {
   pname = "grip-search";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "0bkqarylgzhis6fpj48qbifcd6a26cgnq8784hgnm707rq9kb0rx";
   };
 
-  nativeBuildInputs = [ pkgconfig cmake catch2 ];
+  nativeBuildInputs = [ pkg-config cmake catch2 ];
 
   doCheck = true;
 
@@ -21,7 +21,7 @@ stdenv.mkDerivation rec {
     substituteInPlace src/general/config.h --replace "CUSTOM-BUILD" "${version}"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fast, indexed regexp search over large file trees";
     homepage = "https://github.com/sc0ty/grip";
     license = licenses.gpl3;
diff --git a/pkgs/tools/text/groff/default.nix b/pkgs/tools/text/groff/default.nix
index 8c98a4aba46..5b158f2cbb0 100644
--- a/pkgs/tools/text/groff/default.nix
+++ b/pkgs/tools/text/groff/default.nix
@@ -1,9 +1,9 @@
-{ stdenv, fetchurl, perl
+{ lib, stdenv, fetchurl, fetchpatch, perl
 , ghostscript #for postscript and html output
 , psutils, netpbm #for html output
 , buildPackages
 , autoreconfHook
-, pkgconfig
+, pkg-config
 , texinfo
 }:
 
@@ -22,24 +22,31 @@ stdenv.mkDerivation rec {
 
   patches = [
     ./0001-Fix-cross-compilation-by-looking-for-ar.patch
+  ]
+  ++ lib.optionals (stdenv.cc.isClang && lib.versionAtLeast stdenv.cc.version "9") [
+    # https://trac.macports.org/ticket/59783
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/openembedded/openembedded-core/ce265cf467f1c3e5ba2edbfbef2170df1a727a52/meta/recipes-extended/groff/files/0001-Include-config.h.patch";
+      sha256 = "1b0mg31xkpxkzlx696nr08rcc7ndpaxdplvysy0hw5099c4n1wyf";
+    })
   ];
 
-  postPatch = stdenv.lib.optionalString (psutils != null) ''
+  postPatch = lib.optionalString (psutils != null) ''
     substituteInPlace src/preproc/html/pre-html.cpp \
       --replace "psselect" "${psutils}/bin/psselect"
-  '' + stdenv.lib.optionalString (netpbm != null) ''
+  '' + lib.optionalString (netpbm != null) ''
     substituteInPlace src/preproc/html/pre-html.cpp \
-      --replace "pnmcut" "${stdenv.lib.getBin netpbm}/bin/pnmcut" \
-      --replace "pnmcrop" "${stdenv.lib.getBin netpbm}/bin/pnmcrop" \
-      --replace "pnmtopng" "${stdenv.lib.getBin netpbm}/bin/pnmtopng"
+      --replace "pnmcut" "${lib.getBin netpbm}/bin/pnmcut" \
+      --replace "pnmcrop" "${lib.getBin netpbm}/bin/pnmcrop" \
+      --replace "pnmtopng" "${lib.getBin netpbm}/bin/pnmtopng"
     substituteInPlace tmac/www.tmac \
-      --replace "pnmcrop" "${stdenv.lib.getBin netpbm}/bin/pnmcrop" \
-      --replace "pngtopnm" "${stdenv.lib.getBin netpbm}/bin/pngtopnm" \
-      --replace "@PNMTOPS_NOSETPAGE@" "${stdenv.lib.getBin netpbm}/bin/pnmtops -nosetpage"
+      --replace "pnmcrop" "${lib.getBin netpbm}/bin/pnmcrop" \
+      --replace "pngtopnm" "${lib.getBin netpbm}/bin/pngtopnm" \
+      --replace "@PNMTOPS_NOSETPAGE@" "${lib.getBin netpbm}/bin/pnmtops -nosetpage"
   '';
 
   buildInputs = [ ghostscript psutils netpbm perl ];
-  nativeBuildInputs = [ autoreconfHook pkgconfig texinfo ];
+  nativeBuildInputs = [ autoreconfHook pkg-config texinfo ];
 
   # Builds running without a chroot environment may detect the presence
   # of /usr/X11 in the host system, leading to an impure build of the
@@ -48,13 +55,14 @@ stdenv.mkDerivation rec {
   # have to pass "--with-appresdir", too.
   configureFlags = [
     "--without-x"
-  ] ++ stdenv.lib.optionals (ghostscript != null) [
+  ] ++ lib.optionals (ghostscript != null) [
     "--with-gs=${ghostscript}/bin/gs"
-  ] ++ stdenv.lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+  ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
     "ac_cv_path_PERL=${buildPackages.perl}/bin/perl"
+    "gl_cv_func_signbit=yes"
   ];
 
-  makeFlags = stdenv.lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+  makeFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
     # Trick to get the build system find the proper 'native' groff
     # http://www.mail-archive.com/bug-groff@gnu.org/msg01335.html
     "GROFF_BIN_PATH=${buildPackages.groff}/bin"
@@ -82,10 +90,6 @@ stdenv.mkDerivation rec {
     moveToOutput bin/afmtodit $perl
     moveToOutput bin/gperl $perl
     moveToOutput bin/chem $perl
-    moveToOutput share/groff/${version}/font/devpdf $perl
-
-    # idk if this is needed, but Fedora does it
-    moveToOutput share/groff/${version}/tmac/pdf.tmac $perl
 
     moveToOutput bin/gpinyin $perl
     moveToOutput lib/groff/gpinyin $perl
@@ -102,11 +106,11 @@ stdenv.mkDerivation rec {
     substituteInPlace $perl/bin/grog \
       --replace $out/lib/groff/grog $perl/lib/groff/grog
 
-  '' + stdenv.lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
+  '' + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
     find $perl/ -type f -print0 | xargs --null sed -i 's|${buildPackages.perl}|${perl}|'
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://www.gnu.org/software/groff/";
     description = "GNU Troff, a typesetting package that reads plain text and produces formatted output";
     license = licenses.gpl3Plus;
diff --git a/pkgs/tools/text/groff/site.tmac b/pkgs/tools/text/groff/site.tmac
index 8ef1040ca4a..776a7abb1da 100644
--- a/pkgs/tools/text/groff/site.tmac
+++ b/pkgs/tools/text/groff/site.tmac
@@ -14,3 +14,6 @@
 .  if '\V[GROFF_SGR]'' \
 .    output x X tty: sgr 0
 .\}
+.
+.ds doc-default-operating-system Nixpkgs
+.ds doc-volume-operating-system Nixpkgs
diff --git a/pkgs/tools/text/gtranslator/default.nix b/pkgs/tools/text/gtranslator/default.nix
index 5f217e69ea5..5bc99724e3f 100644
--- a/pkgs/tools/text/gtranslator/default.nix
+++ b/pkgs/tools/text/gtranslator/default.nix
@@ -1,14 +1,15 @@
-{ stdenv
+{ lib, stdenv
 , fetchurl
 , meson
 , ninja
-, pkgconfig
+, pkg-config
 , itstool
 , gettext
 , python3
 , wrapGAppsHook
 , libxml2
 , libgda
+, libhandy
 , libsoup
 , json-glib
 , gspell
@@ -16,23 +17,23 @@
 , libdazzle
 , gtk3
 , gtksourceview4
-, gnome3
+, gnome
 , gsettings-desktop-schemas
 }:
 
 stdenv.mkDerivation rec {
   pname = "gtranslator";
-  version = "3.36.0";
+  version = "40.0";
 
   src = fetchurl {
-    url = "mirror://gnome/sources/${pname}/${stdenv.lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "1lxd2nkji4jk8g2xmyc1a1r3ww710ddk91zh9psmx8xlb4xivaid";
+    url = "mirror://gnome/sources/${pname}/${lib.versions.major version}/${pname}-${version}.tar.xz";
+    sha256 = "0d48nc11z0m91scy21ah56ysxns82zvswx8lglvlkig1vqvblgpc";
   };
 
   nativeBuildInputs = [
     meson
     ninja
-    pkgconfig
+    pkg-config
     itstool
     gettext
     python3
@@ -46,6 +47,7 @@ stdenv.mkDerivation rec {
     libdazzle
     gtksourceview4
     libgda
+    libhandy
     libsoup
     json-glib
     gettext
@@ -59,12 +61,12 @@ stdenv.mkDerivation rec {
   '';
 
   passthru = {
-    updateScript = gnome3.updateScript {
+    updateScript = gnome.updateScript {
       packageName = pname;
     };
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "GNOME translation making program";
     homepage = "https://wiki.gnome.org/Apps/Gtranslator";
     license = licenses.gpl3Plus;
diff --git a/pkgs/tools/text/gucci/default.nix b/pkgs/tools/text/gucci/default.nix
index 1667f2e45b5..943b86d3b05 100644
--- a/pkgs/tools/text/gucci/default.nix
+++ b/pkgs/tools/text/gucci/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, buildGoPackage, fetchFromGitHub }:
+{ lib, buildGoPackage, fetchFromGitHub }:
 
 buildGoPackage rec {
   pname = "gucci";
@@ -19,7 +19,7 @@ buildGoPackage rec {
     -ldflags=-X main.AppVersion=${version}
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A simple CLI templating tool written in golang";
     homepage = "https://github.com/noqcks/gucci";
     license = licenses.mit;
diff --git a/pkgs/tools/text/highlight/default.nix b/pkgs/tools/text/highlight/default.nix
index a918770aa7b..f44ddc9d0e9 100644
--- a/pkgs/tools/text/highlight/default.nix
+++ b/pkgs/tools/text/highlight/default.nix
@@ -1,26 +1,26 @@
-{ stdenv, fetchFromGitLab, getopt, lua, boost, pkgconfig, swig, perl, gcc }:
+{ lib, stdenv, fetchFromGitLab, getopt, lua, boost, pkg-config, swig, perl, gcc }:
 
-with stdenv.lib;
+with lib;
 
 let
   self = stdenv.mkDerivation rec {
     pname = "highlight";
-    version = "3.57";
+    version = "4.1";
 
     src = fetchFromGitLab {
       owner = "saalen";
       repo = "highlight";
       rev = "v${version}";
-      sha256 = "1xrk7c7akjiwh3wh9bll0qh4g0kqvbzjz9ancpadnk0k7bqi0kxf";
+      sha256 = "sha256-KktwbnL13Tcc2iWAjgqQSMSenUN6nYBEGbFrpB1kkr0=";
     };
 
     enableParallelBuilding = true;
 
-    nativeBuildInputs = [ pkgconfig swig perl ] ++ optional stdenv.isDarwin gcc;
+    nativeBuildInputs = [ pkg-config swig perl ] ++ optional stdenv.isDarwin gcc;
 
     buildInputs = [ getopt lua boost ];
 
-    prePatch = stdenv.lib.optionalString stdenv.cc.isClang ''
+    prePatch = lib.optionalString stdenv.cc.isClang ''
       substituteInPlace src/makefile \
           --replace 'CXX=g++' 'CXX=clang++'
     '';
@@ -45,7 +45,7 @@ let
       make -C extras/swig clean # Clean up intermediate files.
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "Source code highlighting tool";
       homepage = "http://www.andre-simon.de/doku/highlight/en/highlight.php";
       platforms = platforms.unix;
diff --git a/pkgs/tools/text/hottext/default.nix b/pkgs/tools/text/hottext/default.nix
new file mode 100644
index 00000000000..2e9d0a909a2
--- /dev/null
+++ b/pkgs/tools/text/hottext/default.nix
@@ -0,0 +1,100 @@
+{ lib, stdenv, fetchurl, fetchFromGitHub, nim, gentium, SDL2, makeDesktopItem }:
+
+let
+  treeformLibs = lib.attrsets.mapAttrsToList (repo: args:
+    fetchFromGitHub ({
+      inherit repo;
+      owner = "treeform";
+    } // args)) {
+      bumpy = {
+        rev = "1.0.3";
+        sha256 = "sha256-mDmDlhOGoYYjKgF5j808oT2NqRlfcOdLSDE3WtdJFQ0=";
+      };
+      chroma = {
+        rev = "0.2.5";
+        sha256 = "sha256-6lNHpO2aMorgkaPfo6kRcOs9r5R6T/kislVmkeoulw8=";
+      };
+      flatty = {
+        rev = "0.2.1";
+        sha256 = "sha256-TqNnRh2+i6n98ktLRVQxt9CVw17FGLNYq29rJoMus/0=";
+      };
+      pixie = {
+        rev = "1.1.3";
+        sha256 = "sha256-xKIejVxOd19mblL1ZwpJH91dgKQS5g8U08EL8lGGelA=";
+      };
+      typography = {
+        rev = "0.7.9";
+        sha256 = "sha256-IYjw3PCp5XzVed2fGGCt9Hb60cxFeF0BUZ7L5PedTLU=";
+      };
+      vmath = {
+        rev = "1.0.3";
+        sha256 = "sha256-zzSKXjuTZ46HTFUs0N47mxEKTKIdS3dwr+60sQYSdn0=";
+      };
+    };
+
+  nimLibs = treeformLibs ++ [
+    (fetchFromGitHub {
+      owner = "nim-lang";
+      repo = "sdl2";
+      rev = "v2.0.2";
+      sha256 = "sha256-Ivx/gxDa2HVDjCVrJVu23i4d0pDzzv+ThmwqNjtkjsA=";
+    })
+    (fetchFromGitHub {
+      owner = "guzba";
+      repo = "nimsimd";
+      rev = "1.0.0";
+      sha256 = "sha256-kp61fylAJ6MSN9hLYLi7CU2lxVR/lbrNCvZTe0LJLGo=";
+    })
+    (fetchFromGitHub {
+      owner = "guzba";
+      repo = "zippy";
+      rev = "0.5.6";
+      sha256 = "sha256-axp4t9+8TFSpvnATlRKZyuOGLA0e/XKfvrVSwreXpC4=";
+    })
+  ];
+
+in stdenv.mkDerivation rec {
+  pname = "hottext";
+  version = "1.3";
+
+  src = fetchurl {
+    url = "https://git.sr.ht/~ehmry/hottext/archive/v${version}.tar.gz";
+    sha256 = "sha256-iz7Z2x0/yi/E6gGFkYgq/yZDOxrZGwQmumPoO9kckLQ=";
+  };
+
+  nativeBuildInputs = [ nim ];
+  buildInputs = [ SDL2 ];
+
+  nimFlags = [ "-d:release" ] ++ map (lib: "--path:${lib}/src") nimLibs;
+
+  HOTTEXT_FONT_PATH = "${gentium}/share/fonts/truetype/GentiumPlus-Regular.ttf";
+
+  buildPhase = ''
+    runHook preBuild
+    HOME=$TMPDIR
+    nim $nimFlags compile src/$pname
+    runHook postBuild
+  '';
+
+  desktopItem = makeDesktopItem {
+    categories = "Utility;";
+    comment = meta.description;
+    desktopName = pname;
+    exec = pname;
+    name = pname;
+  };
+
+  installPhase = ''
+    runHook preInstall
+    install -Dt $out/bin src/$pname
+    cp -r $desktopItem/* $out
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Simple RSVP speed-reading utility";
+    license = licenses.unlicense;
+    homepage = "https://git.sr.ht/~ehmry/hottext";
+    maintainers = with maintainers; [ ehmry ];
+  };
+}
diff --git a/pkgs/tools/text/html-tidy/default.nix b/pkgs/tools/text/html-tidy/default.nix
index 28e1759fea5..d4bb26a0a77 100644
--- a/pkgs/tools/text/html-tidy/default.nix
+++ b/pkgs/tools/text/html-tidy/default.nix
@@ -1,14 +1,14 @@
-{ stdenv, fetchFromGitHub, cmake, libxslt }:
+{ lib, stdenv, fetchFromGitHub, cmake, libxslt }:
 
 stdenv.mkDerivation rec {
   pname = "html-tidy";
-  version = "5.6.0";
+  version = "5.8.0";
 
   src = fetchFromGitHub {
     owner = "htacg";
     repo = "tidy-html5";
     rev = version;
-    sha256 = "0w175c5d1babq0w1zzdzw9gl6iqbgyq58v8587s7srp05y3hwy9k";
+    sha256 = "sha256-ZMz0NySxzX2XHiqB8f5asvwjIG6kdIcq8Gb3EbAxBaU=";
   };
 
   nativeBuildInputs = [ cmake libxslt/*manpage*/ ];
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
   # ATM bin/tidy is statically linked, as upstream provides no other option yet.
   # https://github.com/htacg/tidy-html5/issues/326#issuecomment-160322107
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A HTML validator and `tidier'";
     longDescription = ''
       HTML Tidy is a command-line tool and C library that can be
diff --git a/pkgs/tools/text/html2text/default.nix b/pkgs/tools/text/html2text/default.nix
index 7cf276f2da3..ae92f3ba9d9 100644
--- a/pkgs/tools/text/html2text/default.nix
+++ b/pkgs/tools/text/html2text/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation {
   name = "html2text-1.3.2a";
@@ -25,8 +25,8 @@ stdenv.mkDerivation {
   meta = {
     description = "Convert HTML to plain text";
     homepage = "http://www.mbayer.de/html2text/";
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = [ stdenv.lib.maintainers.eikek ];
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.eikek ];
   };
 }
diff --git a/pkgs/tools/text/icdiff/default.nix b/pkgs/tools/text/icdiff/default.nix
index 15739432a19..c051560151a 100644
--- a/pkgs/tools/text/icdiff/default.nix
+++ b/pkgs/tools/text/icdiff/default.nix
@@ -1,6 +1,6 @@
-{ stdenv, fetchFromGitHub, pythonPackages }:
+{ lib, fetchFromGitHub, python3Packages, bash, git, less }:
 
-pythonPackages.buildPythonApplication rec {
+python3Packages.buildPythonApplication rec {
   pname = "icdiff";
   version = "1.9.5";
 
@@ -11,7 +11,21 @@ pythonPackages.buildPythonApplication rec {
     sha256 = "080v8h09pv8qwplin4kwfm0kmqjwdqjfxbpcdrv16sv4hwfwl5qd";
   };
 
-  meta = with stdenv.lib; {
+  checkInputs = [
+    bash
+    git
+    less
+  ];
+
+  # error: could not lock config file /homeless-shelter/.gitconfig: No such file or directory
+  doCheck = false;
+
+  checkPhase = ''
+    patchShebangs test.sh
+    ./test.sh ${python3Packages.python.interpreter}
+  '';
+
+  meta = with lib; {
     homepage = "https://www.jefftk.com/icdiff";
     description = "Side-by-side highlighted command line diffs";
     maintainers = with maintainers; [ aneeshusa ];
diff --git a/pkgs/tools/text/invoice2data/default.nix b/pkgs/tools/text/invoice2data/default.nix
index 78ab971f0c0..8007724f4a5 100644
--- a/pkgs/tools/text/invoice2data/default.nix
+++ b/pkgs/tools/text/invoice2data/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, python3Packages, xpdf, imagemagick, tesseract }:
+{ lib, python3Packages, xpdf, imagemagick, tesseract }:
 
 python3Packages.buildPythonPackage rec {
   pname = "invoice2data";
@@ -9,14 +9,14 @@ python3Packages.buildPythonPackage rec {
     sha256 = "1phz0a8jxg074k0im7shrrdfvdps7bn1fa4zwcf8q3sa2iig26l4";
   };
 
-  makeWrapperArgs = ["--prefix" "PATH" ":" (stdenv.lib.makeBinPath [ imagemagick xpdf tesseract ]) ];
+  makeWrapperArgs = ["--prefix" "PATH" ":" (lib.makeBinPath [ imagemagick xpdf tesseract ]) ];
 
   propagatedBuildInputs = with python3Packages; [ unidecode dateparser pyyaml pillow chardet pdfminer ];
 
   # Tests fails even when ran manually on my ubuntu machine !!
   doCheck = false;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Data extractor for PDF invoices";
     homepage = "https://github.com/invoice-x/invoice2data";
     license = licenses.mit;
diff --git a/pkgs/tools/text/ispell/default.nix b/pkgs/tools/text/ispell/default.nix
index 2f61536ed2c..f4403f4991f 100644
--- a/pkgs/tools/text/ispell/default.nix
+++ b/pkgs/tools/text/ispell/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, bison, ncurses }:
+{ lib, stdenv, fetchurl, bison, ncurses }:
 
 stdenv.mkDerivation rec {
   pname = "ispell";
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
 
   postPatch = ''
     cat >> local.h <<EOF
-    ${stdenv.lib.optionalString (!stdenv.isDarwin) "#define USG"}
+    ${lib.optionalString (!stdenv.isDarwin) "#define USG"}
     #define TERMLIB "-lncurses"
     #define LANGUAGES "{american,MASTERDICTS=american.med,HASHFILES=americanmed.hash}"
     #define MASTERHASH "americanmed.hash"
@@ -49,7 +49,7 @@ stdenv.mkDerivation rec {
     done
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "An interactive spell-checking program for Unix";
     homepage = "https://www.cs.hmc.edu/~geoff/ispell.html";
     license = licenses.free;
diff --git a/pkgs/tools/text/jbofihe/default.nix b/pkgs/tools/text/jbofihe/default.nix
new file mode 100644
index 00000000000..111b019c3b1
--- /dev/null
+++ b/pkgs/tools/text/jbofihe/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, bison, flex, perl, }:
+
+stdenv.mkDerivation rec {
+  pname = "jbofihe";
+  version = "0.43";
+
+  src = fetchFromGitHub {
+    owner = "lojban";
+    repo = "jbofihe";
+    rev = "v${version}";
+    sha256 = "1xx7x1256sjncyzx656jl6jl546vn8zz0siymqalz6v9yf341p98";
+  };
+
+  nativeBuildInputs = [ bison flex perl ];
+
+  doCheck = true;
+  checkPhase = ''
+    runHook preCheck
+    (cd tests && ./run *.in)
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Parser & analyser for Lojban";
+    homepage = "https://github.com/lojban/jbofihe";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ chkno ];
+  };
+}
diff --git a/pkgs/tools/text/jsawk/default.nix b/pkgs/tools/text/jsawk/default.nix
index 4f2ad403e36..4efaf56ccf6 100644
--- a/pkgs/tools/text/jsawk/default.nix
+++ b/pkgs/tools/text/jsawk/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, makeWrapper, spidermonkey }:
+{ lib, stdenv, fetchFromGitHub, makeWrapper, spidermonkey_78 }:
 
 stdenv.mkDerivation {
   pname = "jsawk";
@@ -10,19 +10,19 @@ stdenv.mkDerivation {
     sha256 = "0z3vdr3c8nvdrrxkjv9b4xg47mdb2hsknxpimw6shgwbigihapyr";
   };
   dontBuild = true;
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
   installPhase = ''
     mkdir -p $out/bin
     cp $src/jsawk $out/bin/
     wrapProgram $out/bin/jsawk \
-      --prefix PATH : "${spidermonkey}/bin"
+      --prefix PATH : "${spidermonkey_78}/bin"
   '';
 
   meta = {
-    description = "Jsawk is like awk, but for JSON";
+    description = "Like awk, but for JSON";
     homepage = "https://github.com/micha/jsawk";
-    license = stdenv.lib.licenses.publicDomain;
-    maintainers = with stdenv.lib.maintainers; [ puffnfresh ];
-    platforms = stdenv.lib.platforms.unix;
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.maintainers; [ puffnfresh ];
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/jumanpp/default.nix b/pkgs/tools/text/jumanpp/default.nix
index ecadb4a89d8..5578ed417a2 100644
--- a/pkgs/tools/text/jumanpp/default.nix
+++ b/pkgs/tools/text/jumanpp/default.nix
@@ -1,15 +1,19 @@
-{ stdenv, fetchurl, cmake, protobuf }:
+{ lib, stdenv, fetchurl, cmake, protobuf, libiconv }:
+
 stdenv.mkDerivation rec {
   pname = "jumanpp";
-  version = "2.0.0-rc2";
+  version = "2.0.0-rc3";
 
   src = fetchurl {
     url = "https://github.com/ku-nlp/${pname}/releases/download/v${version}/${pname}-${version}.tar.xz";
-    sha256 = "17fzmd0f5m9ayfhsr0mg7hjp3pg1mhbgknhgyd8v87x46g8bg6qp";
+    sha256 = "sha256-ASdr6qbkSe71M7QmuuwidCa4xQhDVoXBJ2XqvSY53pQ=";
   };
-  buildInputs = [ cmake protobuf ];
 
-  meta = with stdenv.lib; {
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ protobuf ]
+    ++ lib.optional stdenv.isDarwin libiconv;
+
+  meta = with lib; {
     description = "A Japanese morphological analyser using a recurrent neural network language model (RNNLM)";
     longDescription = ''
       JUMAN++ is a new morphological analyser that considers semantic
diff --git a/pkgs/tools/text/kakasi/default.nix b/pkgs/tools/text/kakasi/default.nix
index 62645573259..609b8aff9b5 100644
--- a/pkgs/tools/text/kakasi/default.nix
+++ b/pkgs/tools/text/kakasi/default.nix
@@ -1,11 +1,11 @@
-{ stdenv, fetchurl, libiconv }:
+{ lib, stdenv, fetchurl, libiconv }:
 
 stdenv.mkDerivation rec {
   name = "kakasi-2.3.6";
 
-  buildInputs = stdenv.lib.optional stdenv.isDarwin [ libiconv ];
+  buildInputs = lib.optional stdenv.isDarwin [ libiconv ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Kanji Kana Simple Inverter";
     longDescription = ''
       KAKASI is the language processing filter to convert Kanji
diff --git a/pkgs/tools/text/kdiff3/default.nix b/pkgs/tools/text/kdiff3/default.nix
index 9c0526c3e63..c230278c0a0 100644
--- a/pkgs/tools/text/kdiff3/default.nix
+++ b/pkgs/tools/text/kdiff3/default.nix
@@ -6,11 +6,11 @@
 
 mkDerivation rec {
   pname = "kdiff3";
-  version = "1.8.3";
+  version = "1.8.5";
 
   src = fetchurl {
     url = "https://download.kde.org/stable/${pname}/${pname}-${version}.tar.xz";
-    sha256 = "1awb62y09kbkjhz22mdkrppd6w5aihd3l0ssvpil8c9hg8syjd9g";
+    sha256 = "sha256-vJL30E6xI/nFbb4wR69nv3FSQPqZSHrB0czypF4IVME=";
   };
 
   nativeBuildInputs = [ extra-cmake-modules kdoctools wrapGAppsHook ];
@@ -18,7 +18,7 @@ mkDerivation rec {
   propagatedBuildInputs = [ kconfig kcrash kinit kparts kiconthemes ];
 
   meta = with lib; {
-    homepage = "http://kdiff3.sourceforge.net/";
+    homepage = "https://invent.kde.org/sdk/kdiff3";
     license = licenses.gpl2Plus;
     description = "Compares and merges 2 or 3 files or directories";
     maintainers = with maintainers; [ peterhoeg ];
diff --git a/pkgs/tools/text/kramdown-rfc2629/Gemfile b/pkgs/tools/text/kramdown-rfc2629/Gemfile
deleted file mode 100644
index 9b3347860b6..00000000000
--- a/pkgs/tools/text/kramdown-rfc2629/Gemfile
+++ /dev/null
@@ -1,2 +0,0 @@
-source 'https://rubygems.org'
-gem 'kramdown-rfc2629'
diff --git a/pkgs/tools/text/kramdown-rfc2629/Gemfile.lock b/pkgs/tools/text/kramdown-rfc2629/Gemfile.lock
deleted file mode 100644
index b50dc2fdbca..00000000000
--- a/pkgs/tools/text/kramdown-rfc2629/Gemfile.lock
+++ /dev/null
@@ -1,17 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    certified (1.0.0)
-    kramdown (1.17.0)
-    kramdown-rfc2629 (1.2.13)
-      certified (~> 1.0)
-      kramdown (~> 1.17.0)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  kramdown-rfc2629
-
-BUNDLED WITH
-   2.1.4
diff --git a/pkgs/tools/text/kramdown-rfc2629/default.nix b/pkgs/tools/text/kramdown-rfc2629/default.nix
deleted file mode 100644
index 945c676ca18..00000000000
--- a/pkgs/tools/text/kramdown-rfc2629/default.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-{ lib, bundlerApp }:
-
-# Not in the default ../../../development/ruby-modules/with-packages/Gemfile
-# because of version clash on the "kramdown" dependency.
-bundlerApp rec {
-  pname = "kramdown-rfc2629";
-  gemdir = ./.;
-  exes = [ "kramdown-rfc2629" ];
-
-  meta = with lib; {
-    description = "A markdown parser with multiple backends";
-    homepage    = "https://github.com/cabo/kramdown-rfc2629";
-    license     = with licenses; mit;
-    maintainers = with maintainers; [
-      vcunat # not really, but I expect to use it occasionally around IETF
-    ];
-  };
-}
diff --git a/pkgs/tools/text/kramdown-rfc2629/gemset.nix b/pkgs/tools/text/kramdown-rfc2629/gemset.nix
deleted file mode 100644
index 65d1c234de2..00000000000
--- a/pkgs/tools/text/kramdown-rfc2629/gemset.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  certified = {
-    groups = ["default"];
-    platforms = [];
-    source = {
-      remotes = ["https://rubygems.org"];
-      sha256 = "1706p6p0a8adyvd943af2a3093xakvislgffw3v9dvp7j07dyk5a";
-      type = "gem";
-    };
-    version = "1.0.0";
-  };
-  kramdown = {
-    groups = ["default"];
-    platforms = [];
-    source = {
-      remotes = ["https://rubygems.org"];
-      sha256 = "1n1c4jmrh5ig8iv1rw81s4mw4xsp4v97hvf8zkigv4hn5h542qjq";
-      type = "gem";
-    };
-    version = "1.17.0";
-  };
-  kramdown-rfc2629 = {
-    dependencies = ["certified" "kramdown"];
-    groups = ["default"];
-    platforms = [];
-    source = {
-      remotes = ["https://rubygems.org"];
-      sha256 = "0s53m46qlcdakik0czvx0p41mk46l9l36331cps8gpf364wf3l9d";
-      type = "gem";
-    };
-    version = "1.2.13";
-  };
-}
\ No newline at end of file
diff --git a/pkgs/tools/text/kytea/default.nix b/pkgs/tools/text/kytea/default.nix
index b120d43287a..9cbc2c030a4 100644
--- a/pkgs/tools/text/kytea/default.nix
+++ b/pkgs/tools/text/kytea/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
 
@@ -12,9 +12,9 @@ stdenv.mkDerivation rec {
 
   patches = [ ./gcc-O3.patch ];
 
-  NIX_CFLAGS_COMPILE = stdenv.lib.optionalString stdenv.cc.isClang "-Wno-error=c++11-narrowing";
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-error=c++11-narrowing";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://www.phontron.com/kytea/";
     description = "General toolkit developed for analyzing text";
 
diff --git a/pkgs/tools/text/l2md/default.nix b/pkgs/tools/text/l2md/default.nix
new file mode 100644
index 00000000000..e443cc42a2e
--- /dev/null
+++ b/pkgs/tools/text/l2md/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchgit, libgit2 }:
+
+stdenv.mkDerivation rec {
+  pname = "l2md";
+  version = "unstable-2020-07-31";
+
+  src = fetchgit {
+    url = "https://git.kernel.org/pub/scm/linux/kernel/git/dborkman/l2md.git";
+    rev = "2b9fae141fc2129940e0337732a35a3fc1c33455";
+    sha256 = "PNNoD3a+rJwKH6wbOkvVU1IW4+xF7+zQaLFAlyLlYOI=";
+  };
+
+  buildInputs = [ libgit2 ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp l2md $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Convert public-inbox archives to maildir messages";
+    longDescription = ''
+      Quick and dirty hack to import lore.kernel.org list archives via git,
+      to export them in maildir format or through a pipe, and to keep them
+      periodically synced.
+    '';
+    homepage = "https://git.kernel.org/pub/scm/linux/kernel/git/dborkman/l2md.git";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ yoctocell ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/tools/text/languagetool/default.nix b/pkgs/tools/text/languagetool/default.nix
index 0dd01d382ed..791d779bf83 100644
--- a/pkgs/tools/text/languagetool/default.nix
+++ b/pkgs/tools/text/languagetool/default.nix
@@ -1,19 +1,21 @@
-{ stdenv, fetchzip, jre, makeWrapper }:
+{ lib, stdenv, fetchzip, jre, makeWrapper }:
 
 stdenv.mkDerivation rec {
   pname = "LanguageTool";
-  version = "5.0";
+  version = "5.4";
 
   src = fetchzip {
     url = "https://www.languagetool.org/download/${pname}-${version}.zip";
-    sha256 = "1jyd4z62ldwhqx9r7v4b9k4pl300wr4b7ggj4f0yjf0gpwg7l9p7";
+    sha256 = "sha256-2khadADfzwkW+J0uafPWJ6xUQRSQDm8seiBHueQGmKI=";
   };
   nativeBuildInputs = [ makeWrapper ];
   buildInputs = [ jre ];
 
   installPhase = ''
+    runHook preInstall
+
     mkdir -p $out/share
-    mv * $out/share/
+    mv -- * $out/share/
 
     for lt in languagetool{,-commandline,-server};do
       makeWrapper ${jre}/bin/java $out/bin/$lt \
@@ -22,14 +24,15 @@ stdenv.mkDerivation rec {
 
     makeWrapper ${jre}/bin/java $out/bin/languagetool-http-server \
       --add-flags "-cp $out/share/languagetool-server.jar org.languagetool.server.HTTPServer"
+
+    runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://languagetool.org";
     license = licenses.lgpl21Plus;
-    maintainers = with maintainers; [
-      edwtjo
-    ];
+    maintainers = with maintainers; [ edwtjo ];
+    platforms = jre.meta.platforms;
     description = "A proofreading program for English, French German, Polish, and more";
   };
 }
diff --git a/pkgs/tools/text/ledger2beancount/default.nix b/pkgs/tools/text/ledger2beancount/default.nix
new file mode 100644
index 00000000000..12fe3a9c9e0
--- /dev/null
+++ b/pkgs/tools/text/ledger2beancount/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, perlPackages, beancount }:
+
+with lib;
+
+let
+  perlDeps = with perlPackages; [
+    DateCalc
+    DateTimeFormatStrptime
+    enum
+    FileBaseDir
+    GetoptLongDescriptive
+    ListMoreUtils
+    RegexpCommon
+    StringInterpolate
+    YAMLLibYAML
+  ];
+
+in stdenv.mkDerivation rec {
+  pname = "ledger2beancount";
+  version = "2.5";
+
+  src = fetchFromGitHub {
+    owner = "beancount";
+    repo = "ledger2beancount";
+    rev = version;
+    sha256 = "0kimp8l9ax37grfv5r5iw0g0xnrpkak022fl10y3i7kc4nyi1s99";
+  };
+
+  dontBuild = true;
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ perlPackages.perl beancount ] ++ perlDeps;
+
+  makeFlags = [ "prefix=$(out)" ];
+  installFlags = [ "INSTALL=install" ];
+
+  installPhase = ''
+    mkdir -p $out
+    cp -r $src/bin $out/bin
+  '';
+
+  postFixup = ''
+    wrapProgram "$out/bin/ledger2beancount" \
+      --set PERL5LIB "${perlPackages.makeFullPerlPath perlDeps}"
+  '';
+
+  meta = {
+    description = "Ledger to Beancount text-based converter";
+    longDescription = ''
+      A script to automatically convert Ledger-based textual ledgers to Beancount ones.
+
+      Conversion is based on (concrete) syntax, so that information that is not meaningful for accounting reasons but still valuable (e.g., comments, formatting, etc.) can be preserved.
+    '';
+    homepage = "https://github.com/beancount/ledger2beancount";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pablovsky ];
+  };
+}
diff --git a/pkgs/tools/text/link-grammar/default.nix b/pkgs/tools/text/link-grammar/default.nix
index 25a5d129c81..3a6686dba5f 100644
--- a/pkgs/tools/text/link-grammar/default.nix
+++ b/pkgs/tools/text/link-grammar/default.nix
@@ -1,28 +1,65 @@
-{ stdenv, fetchurl, pkgconfig, python3, sqlite, libedit, zlib }:
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, python3
+, sqlite
+, libedit
+, runCommand
+, dieHook
+}:
 
-stdenv.mkDerivation rec {
-  version = "5.8.0";
+let
+
+link-grammar = stdenv.mkDerivation rec {
   pname = "link-grammar";
+  version = "5.9.1";
 
   outputs = [ "bin" "out" "dev" "man" ];
 
   src = fetchurl {
     url = "http://www.abisource.com/downloads/${pname}/${version}/${pname}-${version}.tar.gz";
-    sha256 = "1v8ngx77nachxln68xpvyw2lh7z59pzsi99h8j0mnrm0gjsacrdd";
+    sha256 = "sha256-4D/rqoIGlvR+q7Az8E1xPYSQQMJMRVeRM9HQIbjssLo=";
   };
 
-  nativeBuildInputs = [ pkgconfig python3 ];
-  buildInputs = [ sqlite libedit zlib ];
+  nativeBuildInputs = [
+    pkg-config
+    python3
+  ];
+
+  buildInputs = [
+    sqlite
+    libedit
+  ];
 
   configureFlags = [
     "--disable-java-bindings"
   ];
 
-  meta = with stdenv.lib; {
+  doCheck = true;
+
+  passthru.tests = {
+    quick = runCommand "link-grammar-quick-test" {
+      buildInputs = [
+        link-grammar
+        dieHook
+      ];
+    } ''
+      echo "Furiously sleep ideas green colorless." | link-parser en | grep "No complete linkages found." || die "Grammaticaly invalid sentence was parsed."
+      echo "Colorless green ideas sleep furiously." | link-parser en | grep "Found .* linkages." || die "Grammaticaly valid sentence was not parsed."
+      touch $out
+    '';
+  };
+
+  meta = with lib; {
     description = "A Grammar Checking library";
     homepage = "https://www.abisource.com/projects/link-grammar/";
-    license = licenses.lgpl21;
+    changelog = "https://github.com/opencog/link-grammar/blob/link-grammar-${version}/ChangeLog";
+    license = licenses.lgpl21Only;
     maintainers = with maintainers; [ jtojnar ];
     platforms = platforms.unix;
   };
-}
+};
+
+in
+  link-grammar
diff --git a/pkgs/tools/text/lv/default.nix b/pkgs/tools/text/lv/default.nix
index 3e96858f9c9..48ed867c8e4 100644
--- a/pkgs/tools/text/lv/default.nix
+++ b/pkgs/tools/text/lv/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, ncurses }:
+{ lib, stdenv, fetchurl, ncurses }:
 
 stdenv.mkDerivation rec {
   pname = "lv";
@@ -23,7 +23,7 @@ stdenv.mkDerivation rec {
     mkdir -p $out/bin
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Powerful multi-lingual file viewer / grep";
     homepage = "https://web.archive.org/web/20160310122517/www.ff.iij4u.or.jp/~nrt/lv/";
     license = licenses.gpl2;
diff --git a/pkgs/tools/text/m2r/default.nix b/pkgs/tools/text/m2r/default.nix
new file mode 100644
index 00000000000..f6dda712d0b
--- /dev/null
+++ b/pkgs/tools/text/m2r/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, docutils
+, mistune
+, pygments
+}:
+
+buildPythonApplication rec {
+  pname = "m2r";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "miyakogi";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-JNLPEXMoiISh4RnKP+Afj9/PJp9Lrx9UYHsfuGAL7uI=";
+  };
+
+  buildInputs = [
+    docutils
+    mistune
+    pygments
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miyakogi/m2r";
+    description = "Markdown-to-RestructuredText converter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/pkgs/tools/text/mairix/default.nix b/pkgs/tools/text/mairix/default.nix
index a2ae91e974b..57e05bf19f6 100644
--- a/pkgs/tools/text/mairix/default.nix
+++ b/pkgs/tools/text/mairix/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, zlib, bzip2, bison, flex }:
+{ lib, stdenv, fetchurl, zlib, bzip2, bison, flex }:
 
 stdenv.mkDerivation rec {
   name = "mairix-0.24";
@@ -17,9 +17,9 @@ stdenv.mkDerivation rec {
 
   meta = {
     homepage = "http://www.rc0.org.uk/mairix";
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
     description = "Program for indexing and searching email messages stored in maildir, MH or mbox";
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; all;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; all;
   };
 }
diff --git a/pkgs/tools/text/mark/default.nix b/pkgs/tools/text/mark/default.nix
new file mode 100644
index 00000000000..0cccb644f9e
--- /dev/null
+++ b/pkgs/tools/text/mark/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "mark";
+  version = "5.5";
+
+  src = fetchFromGitHub {
+    owner  = "kovetskiy";
+    repo   = "mark";
+    rev    = version;
+    sha256 = "sha256-+mDUT9zkawa6Ad1uptc34RGK3bhU6WowwUZdwKbOnj4=";
+  };
+
+  vendorSha256 = "sha256-nneQ0B7PyHAqiOzrmWqSssZM8B3np4VFUJLBqUvkjZE=";
+
+  buildFlagsArray = [ "-ldflags=-s -w -X main.version=${version}" ];
+
+  meta = with lib; {
+    description = "A tool for syncing your markdown documentation with Atlassian Confluence pages";
+    homepage = "https://github.com/kovetskiy/mark";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rguevara84 ];
+  };
+}
diff --git a/pkgs/tools/text/markdown-pp/default.nix b/pkgs/tools/text/markdown-pp/default.nix
index eaaa0547964..c6e937eab27 100644
--- a/pkgs/tools/text/markdown-pp/default.nix
+++ b/pkgs/tools/text/markdown-pp/default.nix
@@ -1,13 +1,15 @@
-{ fetchFromGitHub, pythonPackages, stdenv }:
+{ lib
+, fetchFromGitHub
+, python3
+}:
 
-with pythonPackages;
-buildPythonApplication rec {
+python3.pkgs.buildPythonApplication rec {
   pname = "MarkdownPP";
   version = "1.5.1";
-  propagatedBuildInputs = [ pillow watchdog ];
+  propagatedBuildInputs = with python3.pkgs; [ pillow watchdog ];
   checkPhase = ''
     cd test
-    PATH=$out/bin:$PATH ${python}/bin/${python.executable} test.py
+    PATH=$out/bin:$PATH ${python3}/bin/${python3.executable} test.py
   '';
   src = fetchFromGitHub {
     owner = "jreese";
@@ -15,7 +17,7 @@ buildPythonApplication rec {
     rev = "v${version}";
     sha256 = "180i5wn9z6vdk2k2bh8345z3g80hj7zf5s2pq0h7k9vaxqpp7avc";
   };
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Preprocessor for Markdown files to generate a table of contents and other documentation needs";
     license = licenses.mit;
     homepage = "https://github.com/jreese/markdown-pp";
diff --git a/pkgs/tools/text/mawk/default.nix b/pkgs/tools/text/mawk/default.nix
index 204d346082c..d5f228d7873 100644
--- a/pkgs/tools/text/mawk/default.nix
+++ b/pkgs/tools/text/mawk/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   name = "mawk-1.3.4-20200120";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "0dw2icf8bnqd9y0clfd9pkcxz4b2phdihwci13z914mf3wgcvm3z";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Interpreter for the AWK Programming Language";
     homepage = "https://invisible-island.net/mawk/mawk.html";
     license = licenses.gpl2;
diff --git a/pkgs/tools/text/mb2md/default.nix b/pkgs/tools/text/mb2md/default.nix
index 91c958cf067..78ce7f59397 100644
--- a/pkgs/tools/text/mb2md/default.nix
+++ b/pkgs/tools/text/mb2md/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, makeWrapper, perlPackages }:
+{ lib, stdenv, fetchurl, makeWrapper, perlPackages }:
 
 let
   perlDeps = with perlPackages; [ TimeDate ];
@@ -29,7 +29,7 @@ stdenv.mkDerivation rec {
       --set PERL5LIB "${perlPackages.makePerlPath perlDeps}"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "mbox to maildir tool";
     license = licenses.publicDomain;
     platforms = platforms.all;
diff --git a/pkgs/tools/text/mdbook-mermaid/default.nix b/pkgs/tools/text/mdbook-mermaid/default.nix
new file mode 100644
index 00000000000..741bc652e51
--- /dev/null
+++ b/pkgs/tools/text/mdbook-mermaid/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, CoreServices }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mdbook-mermaid";
+  version = "0.8.3";
+
+  src = fetchFromGitHub {
+    owner = "badboy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-maYFOlWNqKFmyDM2nDF25rzYnUXMlV9Ry9TMoXReUUg=";
+  };
+
+  cargoSha256 = "sha256-GL5Z4KfRu0zQAzVCWRIhaYtG5FrDdQabsbyFX7SjZvg=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
+
+  meta = with lib; {
+    description = "A preprocessor for mdbook to add mermaid.js support";
+    homepage = "https://github.com/badboy/mdbook-mermaid";
+    license = [ licenses.mpl20 ];
+    maintainers = with maintainers; [ xrelkd ];
+  };
+}
diff --git a/pkgs/tools/text/mdbook/default.nix b/pkgs/tools/text/mdbook/default.nix
index 9cfdc9c9b7e..29007dd1282 100644
--- a/pkgs/tools/text/mdbook/default.nix
+++ b/pkgs/tools/text/mdbook/default.nix
@@ -1,21 +1,21 @@
-{ stdenv, fetchFromGitHub, rustPlatform, CoreServices, darwin }:
+{ lib, stdenv, fetchFromGitHub, rustPlatform, CoreServices }:
 
 rustPlatform.buildRustPackage rec {
   pname = "mdbook";
-  version = "0.4.2";
+  version = "0.4.10";
 
   src = fetchFromGitHub {
     owner = "rust-lang-nursery";
     repo = "mdBook";
     rev = "v${version}";
-    sha256 = "0rkl5k7a9a0vx06jqvbgki2bwag0ar2pcbg3qi88xnjnnmphzpzj";
+    sha256 = "sha256-1Ddy/kb2Q7P+tzyEr3EC3qWm6MGSsDL3/vnPJLAm/J0=";
   };
 
-  cargoSha256 = "1zhlb6wnjnayq833h62nm3ndlhiz1qajw8w5ccc88b8q8m4ipd7c";
+  cargoSha256 = "sha256-x2BwnvEwTqz378aDE7OHWuEwNEsUnRudLq7sUJjHRpA=";
 
-  buildInputs = stdenv.lib.optionals stdenv.isDarwin [ CoreServices ];
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Create books from MarkDown";
     homepage = "https://github.com/rust-lang-nursery/mdbook";
     license = [ licenses.mpl20 ];
diff --git a/pkgs/tools/text/mdcat/default.nix b/pkgs/tools/text/mdcat/default.nix
index 0d5f878af08..67f69ecc71d 100644
--- a/pkgs/tools/text/mdcat/default.nix
+++ b/pkgs/tools/text/mdcat/default.nix
@@ -1,38 +1,56 @@
-{ stdenv, fetchFromGitHub, rustPlatform, pkgconfig, openssl, Security, ansi2html }:
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, pkg-config
+, asciidoctor
+, openssl
+, Security
+, ansi2html
+, installShellFiles
+}:
 
 rustPlatform.buildRustPackage rec {
   pname = "mdcat";
-  version = "0.20.0";
+  version = "0.23.2";
 
   src = fetchFromGitHub {
     owner = "lunaryorn";
     repo = pname;
     rev = "mdcat-${version}";
-    hash = "sha256-1qxz6p7VaJ9eMcLQaTW/M4+Xo0WLihzyEAycbkjjPyA=";
+    sha256 = "sha256-PM6bx7qzEx4He9aX4WRO7ad/f9+wzT+gPGXKwYwG8+A=";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
-  buildInputs = [ openssl ] ++ stdenv.lib.optional stdenv.isDarwin Security;
+  nativeBuildInputs = [ pkg-config asciidoctor installShellFiles ];
+  buildInputs = [ openssl ]
+    ++ lib.optional stdenv.isDarwin Security;
 
-  cargoSha256 = "sha256-/mAwlxed1MOFUA1jDSrgPzJuURbKzwucBWORVVHlrt8=";
+  cargoSha256 = "sha256-GL9WGoyM1++QFAR+bzj0XkjaRaDCWcbcahles5amNpk=";
 
   checkInputs = [ ansi2html ];
-  checkPhase = ''
-    # Skip tests that use the network and that include files.
-    cargo test -- \
-      --skip magic::tests::detect_mimetype_of_larger_than_magic_param_bytes_max_length \
-      --skip magic::tests::detect_mimetype_of_magic_param_bytes_max_length \
-      --skip magic::tests::detect_mimetype_of_png_image \
-      --skip magic::tests::detect_mimetype_of_svg_image \
-      --skip resources::tests::read_url_with_http_url_fails_when_status_404 \
-      --skip resources::tests::read_url_with_http_url_returns_content_when_status_200 \
-      --skip iterm2_tests_render_md_samples_images_md
+  # Skip tests that use the network and that include files.
+  checkFlags = [
+    "--skip magic::tests::detect_mimetype_of_larger_than_magic_param_bytes_max_length"
+    "--skip magic::tests::detect_mimetype_of_magic_param_bytes_max_length"
+    "--skip magic::tests::detect_mimetype_of_png_image"
+    "--skip magic::tests::detect_mimetype_of_svg_image"
+    "--skip resources::tests::read_url_with_http_url_fails_when_size_limit_is_exceeded"
+    "--skip resources::tests::read_url_with_http_url_fails_when_status_404"
+    "--skip resources::tests::read_url_with_http_url_returns_content_when_status_200"
+    "--skip iterm2_tests_render_md_samples_images_md"
+  ];
+
+  postInstall = ''
+    installManPage $releaseDir/build/mdcat-*/out/mdcat.1
+    installShellCompletion --bash $releaseDir/build/mdcat-*/out/completions/mdcat.bash
+    installShellCompletion --fish $releaseDir/build/mdcat-*/out/completions/mdcat.fish
+    installShellCompletion --zsh $releaseDir/build/mdcat-*/out/completions/_mdcat
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "cat for markdown";
     homepage = "https://github.com/lunaryorn/mdcat";
     license = with licenses; [ asl20 ];
-    maintainers = with maintainers; [ davidtwco ];
+    maintainers = with maintainers; [ davidtwco SuperSandro2000 ];
   };
 }
diff --git a/pkgs/tools/text/mecab/default.nix b/pkgs/tools/text/mecab/default.nix
index 32060a6179a..c579dcb8a17 100644
--- a/pkgs/tools/text/mecab/default.nix
+++ b/pkgs/tools/text/mecab/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, mecab-ipadic }:
+{ lib, stdenv, fetchurl, mecab-ipadic }:
 
 let
   mecab-base = import ./base.nix { inherit fetchurl; };
@@ -10,7 +10,7 @@ stdenv.mkDerivation (mecab-base // {
       sed -i 's|^dicdir = .*$|dicdir = ${mecab-ipadic}|' "$out/etc/mecabrc"
     '';
 
-    meta = with stdenv.lib; {
+    meta = with lib; {
       description = "Japanese morphological analysis system";
       homepage = "http://taku910.github.io/mecab/";
       license = licenses.bsd3;
diff --git a/pkgs/tools/text/miller/default.nix b/pkgs/tools/text/miller/default.nix
index 4137fd4d278..670c0612b39 100644
--- a/pkgs/tools/text/miller/default.nix
+++ b/pkgs/tools/text/miller/default.nix
@@ -1,21 +1,21 @@
-{ stdenv, fetchFromGitHub, autoreconfHook, flex, libtool }:
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, flex, libtool }:
 
 stdenv.mkDerivation rec {
   pname = "miller";
 
-  version = "5.9.0";
+  version = "5.10.2";
 
   src = fetchFromGitHub {
     owner = "johnkerl";
     repo = "miller";
     rev = "v${version}";
-    sha256 = "14fi6jlqb980qjcpb90fk85cglskq9b9i2k0216bhpvjmagywgp7";
+    sha256 = "sha256-NI57U3FpUfQ6ouBEYrzzG+9kpL58BD4HoAuRAFJMO9k=";
   };
 
   nativeBuildInputs = [ autoreconfHook flex libtool ];
 
-  meta = with stdenv.lib; {
-    description = "Miller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON.";
+  meta = with lib; {
+    description = "Like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON";
     homepage    = "http://johnkerl.org/miller/";
     license     = licenses.bsd2;
     maintainers = with maintainers; [ mstarzyk ];
diff --git a/pkgs/tools/text/mpage/default.nix b/pkgs/tools/text/mpage/default.nix
index e86c9f2ad26..99cfec97a70 100644
--- a/pkgs/tools/text/mpage/default.nix
+++ b/pkgs/tools/text/mpage/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv }:
+{ fetchurl, lib, stdenv }:
 
 stdenv.mkDerivation rec {
   name = "mpage-2.5.7";
@@ -7,8 +7,9 @@ stdenv.mkDerivation rec {
     sha256 = "1zn37r5xrvjgjbw2bdkc0r7s6q8b1krmcryzj0yf0dyxbx79rasi";
   };
 
-  patchPhase = ''
+  postPatch = ''
     sed -i "Makefile" -e "s|^ *PREFIX *=.*$|PREFIX = $out|g"
+    substituteInPlace Makefile --replace 'gcc' '${stdenv.cc.targetPrefix}cc'
   '';
 
   meta = {
@@ -24,6 +25,6 @@ stdenv.mkDerivation rec {
 
     license = "liberal";  # a non-copyleft license, see `Copyright' file
     homepage = "http://www.mesa.nl/pub/mpage/";
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/multitran/data/default.nix b/pkgs/tools/text/multitran/data/default.nix
index 9b431f5b30b..a94f5bc9688 100644
--- a/pkgs/tools/text/multitran/data/default.nix
+++ b/pkgs/tools/text/multitran/data/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl} :
+{lib, stdenv, fetchurl} :
 
 # This package requires a locale ru_RU.cp1251 locale entry.
 # Waiting for a better idea, I created it modifying a store file using:
@@ -19,7 +19,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://multitran.sourceforge.net/";
     description = "Multitran data english-russian";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.unix;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/multitran/libbtree/default.nix b/pkgs/tools/text/multitran/libbtree/default.nix
index 9a7e0fdbd07..893c1e1d931 100644
--- a/pkgs/tools/text/multitran/libbtree/default.nix
+++ b/pkgs/tools/text/multitran/libbtree/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl} :
+{lib, stdenv, fetchurl} :
 
 stdenv.mkDerivation {
   name = "libbtree-0.0.1alpha2";
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://multitran.sourceforge.net/";
     description = "Multitran lib: library for reading Multitran's BTREE database format";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/multitran/libfacet/default.nix b/pkgs/tools/text/multitran/libfacet/default.nix
index f359819aa73..3895f3a922c 100644
--- a/pkgs/tools/text/multitran/libfacet/default.nix
+++ b/pkgs/tools/text/multitran/libfacet/default.nix
@@ -1,8 +1,8 @@
-{ stdenv, fetchurl, libmtsupport }:
+{ lib, stdenv, fetchurl, libmtsupport }:
 
 stdenv.mkDerivation {
   name = "libfacet-0.0.1alpha2";
-  
+
   src = fetchurl {
     url = "mirror://sourceforge/multitran/libfacet-0.0.1alpha2.tar.bz2";
     sha256 = "dc53351c4035a3c27dc6c1d0410e808346fbc107e7e7c112ec65c59d0df7a144";
@@ -19,7 +19,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://multitran.sourceforge.net/";
     description = "Multitran lib: enchanced locale facets";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/multitran/libmtquery/default.nix b/pkgs/tools/text/multitran/libmtquery/default.nix
index 2c03de6ede8..3b7dd681e8a 100644
--- a/pkgs/tools/text/multitran/libmtquery/default.nix
+++ b/pkgs/tools/text/multitran/libmtquery/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, libmtsupport, libfacet, libbtree, multitrandata } :
+{lib, stdenv, fetchurl, libmtsupport, libfacet, libbtree, multitrandata } :
 
 stdenv.mkDerivation {
   name = "libmtquery-0.0.1alpha3";
@@ -23,7 +23,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://multitran.sourceforge.net/";
     description = "Multitran lib: main engine to query translations";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/multitran/libmtsupport/default.nix b/pkgs/tools/text/multitran/libmtsupport/default.nix
index bc5a77be4fb..eebc88189f2 100644
--- a/pkgs/tools/text/multitran/libmtsupport/default.nix
+++ b/pkgs/tools/text/multitran/libmtsupport/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl} :
+{lib, stdenv, fetchurl} :
 
 stdenv.mkDerivation {
   name = "libmtsupport-0.0.1alpha2";
@@ -13,7 +13,7 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://multitran.sourceforge.net/";
     description = "Multitran lib: basic useful functions";
-    license = stdenv.lib.licenses.gpl2;
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/multitran/mtutils/default.nix b/pkgs/tools/text/multitran/mtutils/default.nix
index 9d701421d11..00325276fdb 100644
--- a/pkgs/tools/text/multitran/mtutils/default.nix
+++ b/pkgs/tools/text/multitran/mtutils/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, libmtsupport, libfacet, libbtree, libmtquery, help2man} :
+{lib, stdenv, fetchurl, libmtsupport, libfacet, libbtree, libmtquery, help2man} :
 
 stdenv.mkDerivation {
   name = "mt-utils-0.0.1alpha3";
@@ -25,8 +25,8 @@ stdenv.mkDerivation {
   meta = {
     homepage = "http://multitran.sourceforge.net/";
     description = "Multitran: simple command line utilities for dictionary maintenance";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [viric];
-    platforms = with stdenv.lib.platforms; linux;
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/tools/text/namazu/default.nix b/pkgs/tools/text/namazu/default.nix
index 93fc9dc75de..e748515b051 100644
--- a/pkgs/tools/text/namazu/default.nix
+++ b/pkgs/tools/text/namazu/default.nix
@@ -1,30 +1,21 @@
-{ fetchurl, stdenv, perl }:
+{ fetchurl, lib, stdenv, perl, perlPackages, makeWrapper }:
 
 stdenv.mkDerivation rec {
-  name = "namazu-2.0.21";
+  pname = "namazu";
+  version = "2.0.21";
 
   src = fetchurl {
-    url = "http://namazu.org/stable/${name}.tar.gz";
+    url = "http://namazu.org/stable/${pname}-${version}.tar.gz";
     sha256 = "1xvi7hrprdchdpzhg3fvk4yifaakzgydza5c0m50h1yvg6vay62w";
   };
 
-  buildInputs = [ perl ];
+  buildInputs = [ perl perlPackages.FileMMagic ];
+  nativeBuildInputs = [ makeWrapper ];
 
-  # First install the `File::MMagic' Perl module.
-  preConfigure = ''
-    ( cd File-MMagic &&                              \
-      perl Makefile.PL                               \
-        LIB="$out/${perl.libPrefix}/${perl.version}" \
-        INSTALLSITEMAN3DIR="$out/man" &&             \
-      make && make install )
-    export PERL5LIB="$out/${perl.libPrefix}/${perl.version}:$PERL5LIB"
+  postInstall = ''
+    wrapProgram $out/bin/mknmz --set PERL5LIB ${perlPackages.makeFullPerlPath [ perlPackages.FileMMagic ]}
   '';
 
-  # FIXME: The `tests/namazu-6' test fails on GNU/Linux, presumably because
-  # phrase searching is broken somehow.  However, it doesn't fail on other
-  # platforms.
-  doCheck = !stdenv.isLinux;
-
   meta = {
     description = "Full-text search engine";
 
@@ -34,11 +25,10 @@ stdenv.mkDerivation rec {
       but also as a personal search system for email or other files.
     '';
 
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
     homepage = "http://namazu.org/";
 
-    platforms = stdenv.lib.platforms.gnu ++ stdenv.lib.platforms.linux;  # arbitrary choice
+    platforms = lib.platforms.gnu ++ lib.platforms.linux;  # arbitrary choice
     maintainers = [ ];
-    broken = true; # File-MMagic is not compatible with our Perl version
   };
 }
diff --git a/pkgs/tools/text/nawk/default.nix b/pkgs/tools/text/nawk/default.nix
index aafce117ee4..580d30a5833 100644
--- a/pkgs/tools/text/nawk/default.nix
+++ b/pkgs/tools/text/nawk/default.nix
@@ -1,26 +1,28 @@
-{ stdenv, fetchFromGitHub, yacc }:
+{ lib, stdenv, fetchFromGitHub, bison, buildPackages }:
 
 stdenv.mkDerivation rec {
   pname = "nawk";
-  version = "20180827";
+  version = "unstable-2021-02-15";
 
   src = fetchFromGitHub {
     owner = "onetrueawk";
     repo = "awk";
-    rev = version;
-    sha256 = "0qcsxhcwg6g3c0zxmbipqa8d8d5n8zxrq0hymb8yavsaz103fcl6";
+    rev = "c0f4e97e4561ff42544e92512bbaf3d7d1f6a671";
+    sha256 = "kQCvItpSJnDJMDvlB8ruY+i0KdjmAphRDqCKw8f0m/8=";
   };
 
-  nativeBuildInputs = [ yacc ];
-
-  patchPhase = ''
-    substituteInPlace ./makefile \
-    --replace "YACC = yacc -d -S" ""
-  '';
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+  nativeBuildInputs = [ bison ];
+  makeFlags = [
+    "CC=${stdenv.cc.targetPrefix}cc"
+    "HOSTCC=${if stdenv.buildPlatform.isDarwin then "clang" else "cc"}"
+  ];
 
   installPhase = ''
+    runHook preInstall
     install -Dm755 a.out "$out/bin/nawk"
     install -Dm644 awk.1 "$out/share/man/man1/nawk.1"
+    runHook postInstall
   '';
 
   meta = {
@@ -31,8 +33,8 @@ stdenv.mkDerivation rec {
        (Addison-Wesley, 1988, ISBN 0-201-07981-X).
     '';
     homepage = "https://www.cs.princeton.edu/~bwk/btl.mirror/";
-    license = stdenv.lib.licenses.mit;
-    maintainers = [ stdenv.lib.maintainers.konimex ];
-    platforms = stdenv.lib.platforms.linux;
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.konimex ];
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/nkf/default.nix b/pkgs/tools/text/nkf/default.nix
index 8a314d44843..a2b5f66a6e9 100644
--- a/pkgs/tools/text/nkf/default.nix
+++ b/pkgs/tools/text/nkf/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "nkf";
@@ -14,8 +14,8 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Tool for converting encoding of Japanese text";
     homepage = "https://nkf.osdn.jp/";
-    license = stdenv.lib.licenses.zlib;
-    platforms = stdenv.lib.platforms.unix;
-    maintainers = [ stdenv.lib.maintainers.auntie ];
+    license = lib.licenses.zlib;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.auntie ];
   };
 }
diff --git a/pkgs/tools/text/num-utils/default.nix b/pkgs/tools/text/num-utils/default.nix
new file mode 100644
index 00000000000..14784a4e8cf
--- /dev/null
+++ b/pkgs/tools/text/num-utils/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "num-utils";
+  version = "0.5";
+
+  src = fetchurl {
+    url = "https://suso.suso.org/programs/num-utils/downloads/num-utils-${version}.tar.gz";
+    sha256 = "0kn6yskjww2agcqvas5l2xp55mp4njdxqkdicchlji3qzih2fn83";
+  };
+
+  buildInputs = [ perl ];
+
+  patchPhase = ''
+    substituteInPlace Makefile --replace "-o 0 -g 0" "" --replace "\$(RPMDIR)" ""
+  '';
+  makeFlags = [
+    "TOPDIR=${placeholder "out"}"
+    "PERL=${perl}/bin/perl"
+  ];
+
+  meta = with lib; {
+    description = "Programs for dealing with numbers from the command line";
+    homepage = "https://suso.suso.org/xulu/Num-utils";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.catern ];
+  };
+}
diff --git a/pkgs/tools/text/numdiff/default.nix b/pkgs/tools/text/numdiff/default.nix
index 6e0c7e75649..317d29003cd 100644
--- a/pkgs/tools/text/numdiff/default.nix
+++ b/pkgs/tools/text/numdiff/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl, libintl }:
 
 
 stdenv.mkDerivation rec {
@@ -9,7 +9,10 @@ stdenv.mkDerivation rec {
     url = "mirror://savannah/numdiff/numdiff-${version}.tar.gz";
     sha256 = "1vzmjh8mhwwysn4x4m2vif7q2k8i19x8azq7pzmkwwj4g48lla47";
   };
-  meta = with stdenv.lib; {
+
+  buildInputs = [ libintl ];
+
+  meta = with lib; {
     description = ''
       A little program that can be used to compare putatively similar files
       line by line and field by field, ignoring small numeric differences
@@ -18,6 +21,6 @@ stdenv.mkDerivation rec {
     homepage = "https://www.nongnu.org/numdiff/";
     license = licenses.gpl3Plus;
     maintainers = with maintainers; [];
-    platforms = platforms.gnu ++ platforms.linux;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/ocrmypdf/0001-Make-compatible-with-pdfminer.six-version-20200720.patch b/pkgs/tools/text/ocrmypdf/0001-Make-compatible-with-pdfminer.six-version-20200720.patch
deleted file mode 100644
index 967bcd3948c..00000000000
--- a/pkgs/tools/text/ocrmypdf/0001-Make-compatible-with-pdfminer.six-version-20200720.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 4315b58e0bffedd145cec61f96062292cd98278e Mon Sep 17 00:00:00 2001
-From: Pascal Bach <pascal.bach@nextrem.ch>
-Date: Thu, 23 Jul 2020 21:37:33 +0200
-Subject: [PATCH] Make compatible with pdfminer.six version 20200720
-
----
- setup.py                       | 2 +-
- src/ocrmypdf/pdfinfo/layout.py | 8 ++++++--
- 2 files changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/setup.py b/setup.py
-index bd95ed9..d1f4ab1 100644
---- a/setup.py
-+++ b/setup.py
-@@ -83,7 +83,7 @@ setup(
-         'cffi >= 1.9.1',  # must be a setup and install requirement
-         'coloredlogs >= 14.0',  # strictly optional
-         'img2pdf >= 0.3.0, < 0.4',  # pure Python, so track HEAD closely
--        'pdfminer.six >= 20191110, <= 20200517',
-+        'pdfminer.six >= 20191110, <= 20200720',
-         'pikepdf >= 1.14.0, < 2',
-         'Pillow >= 7.0.0',
-         'pluggy >= 0.13.0',
-diff --git a/src/ocrmypdf/pdfinfo/layout.py b/src/ocrmypdf/pdfinfo/layout.py
-index 98bd82e..8b41e14 100644
---- a/src/ocrmypdf/pdfinfo/layout.py
-+++ b/src/ocrmypdf/pdfinfo/layout.py
-@@ -26,7 +26,11 @@ import pdfminer.pdfdevice
- import pdfminer.pdfinterp
- from pdfminer.converter import PDFLayoutAnalyzer
- from pdfminer.layout import LAParams, LTChar, LTPage, LTTextBox
--from pdfminer.pdfdocument import PDFTextExtractionNotAllowed
-+try:
-+    from pdfminer.pdfdocument import PDFTextExtractionNotAllowedError
-+except ImportError:
-+    # Fallback for pdfminer < 20200720
-+    from pdfminer.pdfdocument import PDFTextExtractionNotAllowed as PDFTextExtractionNotAllowedError
- from pdfminer.pdffont import PDFSimpleFont, PDFUnicodeNotDefined
- from pdfminer.pdfpage import PDFPage
- from pdfminer.utils import bbox2str, matrix2str
-@@ -239,7 +243,7 @@ def get_page_analysis(infile, pageno, pscript5_mode):
-         with Path(infile).open('rb') as f:
-             page = PDFPage.get_pages(f, pagenos=[pageno], maxpages=0)
-             interp.process_page(next(page))
--    except PDFTextExtractionNotAllowed:
-+    except PDFTextExtractionNotAllowedError:
-         raise EncryptedPdfError()
-     finally:
-         if pscript5_mode:
--- 
-2.27.0
-
diff --git a/pkgs/tools/text/ocrmypdf/default.nix b/pkgs/tools/text/ocrmypdf/default.nix
index b7864b05b6e..0dff6d76fff 100644
--- a/pkgs/tools/text/ocrmypdf/default.nix
+++ b/pkgs/tools/text/ocrmypdf/default.nix
@@ -7,6 +7,7 @@
 , python3
 , python3Packages
 , qpdf
+, lib
 , stdenv
 , tesseract4
 , unpaper
@@ -29,21 +30,19 @@ let
 in
 buildPythonApplication rec {
   pname = "ocrmypdf";
-  version = "10.3.0";
-  disabled = ! python3Packages.isPy3k;
+  version = "12.3.0";
 
   src = fetchFromGitHub {
     owner = "jbarlow83";
     repo = "OCRmyPDF";
     rev = "v${version}";
-    sha256 = "0c6v7846lmkmbyfla07s35mpba4h09h0fx6pxqf0yvdjxmj46q8c";
+    sha256 = "122yv3p0v4fbx30zgppcznwnm7svg97gv0sa103xb6zcld68ggn2";
   };
 
   nativeBuildInputs = with python3Packages; [
-    pytestrunner
     setuptools
     setuptools-scm-git-archive
-    setuptools_scm
+    setuptools-scm
   ];
 
   propagatedBuildInputs = with python3Packages; [
@@ -64,9 +63,8 @@ buildPythonApplication rec {
     pypdf2
     pytest
     pytest-helpers-namespace
-    pytest_xdist
-    pytestcov
-    pytestrunner
+    pytest-xdist
+    pytest-cov
     python-xmp-toolkit
     pytestCheckHook
   ] ++ runtimeDeps;
@@ -74,19 +72,18 @@ buildPythonApplication rec {
   patches = [
     (substituteAll {
       src = ./liblept.patch;
-      liblept = "${stdenv.lib.getLib leptonica}/lib/liblept${stdenv.hostPlatform.extensions.sharedLibrary}";
+      liblept = "${lib.getLib leptonica}/lib/liblept${stdenv.hostPlatform.extensions.sharedLibrary}";
     })
-    # https://github.com/jbarlow83/OCRmyPDF/pull/596
-    ./0001-Make-compatible-with-pdfminer.six-version-20200720.patch
   ];
 
-  makeWrapperArgs = [ "--prefix PATH : ${stdenv.lib.makeBinPath [ ghostscript jbig2enc pngquant qpdf tesseract4 unpaper ]}" ];
+  makeWrapperArgs = [ "--prefix PATH : ${lib.makeBinPath [ ghostscript jbig2enc pngquant qpdf tesseract4 unpaper ]}" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/jbarlow83/OCRmyPDF";
     description = "Adds an OCR text layer to scanned PDF files, allowing them to be searched";
-    license = licenses.gpl3;
+    license = with licenses; [ mpl20 mit ];
     platforms = platforms.linux;
     maintainers = [ maintainers.kiwi ];
+    changelog  = "https://github.com/jbarlow83/OCRmyPDF/blob/v${version}/docs/release_notes.rst";
   };
 }
diff --git a/pkgs/tools/text/odt2txt/default.nix b/pkgs/tools/text/odt2txt/default.nix
index 2a64533a459..0eb18e8435d 100644
--- a/pkgs/tools/text/odt2txt/default.nix
+++ b/pkgs/tools/text/odt2txt/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, zlib, libiconv }:
+{ lib, stdenv, fetchurl, zlib, libiconv }:
 
 stdenv.mkDerivation rec {
   pname = "odt2txt";
@@ -16,8 +16,8 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Simple .odt to .txt converter";
     homepage = "https://github.com/dstosberg/odt2txt";
-    platforms = stdenv.lib.platforms.all;
-    license = stdenv.lib.licenses.gpl2;
+    platforms = lib.platforms.all;
+    license = lib.licenses.gpl2;
     maintainers = [ ];
   };
 }
diff --git a/pkgs/tools/text/opencc/default.nix b/pkgs/tools/text/opencc/default.nix
index 54027de9acd..f99062de413 100644
--- a/pkgs/tools/text/opencc/default.nix
+++ b/pkgs/tools/text/opencc/default.nix
@@ -1,29 +1,26 @@
-{ stdenv, fetchFromGitHub, cmake, python }:
+{ lib, stdenv, fetchFromGitHub, cmake, python }:
 
 stdenv.mkDerivation rec {
   pname = "opencc";
-  version = "1.0.6";
+  version = "1.1.2";
 
   src = fetchFromGitHub {
     owner = "BYVoid";
     repo = "OpenCC";
     rev = "ver.${version}";
-    sha256 = "1ygj2ygxsva72hs6cm0a6wdd2rp71k4nm0pd7cb20y2srdlzvdqk";
+    sha256 = "1a15p9idznh23b44r7rw2zjnirbxjs5pyq3k6xkz0k64cdh2zq6h";
   };
 
   nativeBuildInputs = [ cmake python ];
 
   # let intermediate tools find intermediate library
-  preBuild = stdenv.lib.optionalString stdenv.isLinux ''
+  preBuild = lib.optionalString stdenv.isLinux ''
     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$(pwd)/src
-  '' + stdenv.lib.optionalString stdenv.isDarwin ''
+  '' + lib.optionalString stdenv.isDarwin ''
     export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH''${DYLD_LIBRARY_PATH:+:}$(pwd)/src
   '';
 
-  # Parallel building occasionaly fails with: Error copying file "/tmp/nix-build-opencc-1.0.5.drv-0/OpenCC-ver.1.0.5/build/src/libopencc.so.1.0.0" to "/tmp/nix-build-opencc-1.0.5.drv-0/OpenCC-ver.1.0.5/build/src/tools".
-  enableParallelBuilding = false;
-
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/BYVoid/OpenCC";
     license = licenses.asl20;
     description = "A project for conversion between Traditional and Simplified Chinese";
diff --git a/pkgs/tools/text/papertrail/default.nix b/pkgs/tools/text/papertrail/default.nix
index d635fab74d5..c3d005a97e0 100644
--- a/pkgs/tools/text/papertrail/default.nix
+++ b/pkgs/tools/text/papertrail/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, bundlerEnv, ruby, bundlerUpdateScript }:
+{ lib, stdenv, bundlerEnv, ruby, bundlerUpdateScript }:
 
 let
   papertrail-env = bundlerEnv {
@@ -11,7 +11,7 @@ let
 in stdenv.mkDerivation {
   name = "papertrail-${(import ./gemset.nix).papertrail.version}";
 
-  phases = [ "installPhase" ];
+  dontUnpack = true;
 
   installPhase = ''
     mkdir -p $out/bin
@@ -20,7 +20,7 @@ in stdenv.mkDerivation {
 
   passthru.updateScript = bundlerUpdateScript "papertrail";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Command-line client for Papertrail log management service";
     homepage    = "https://github.com/papertrail/papertrail-cli/";
     license     = licenses.mit;
diff --git a/pkgs/tools/text/papertrail/gemset.nix b/pkgs/tools/text/papertrail/gemset.nix
index 91bfe319896..dcdfcdf7ea5 100644
--- a/pkgs/tools/text/papertrail/gemset.nix
+++ b/pkgs/tools/text/papertrail/gemset.nix
@@ -23,4 +23,4 @@
     };
     version = "0.10.1";
   };
-}
\ No newline at end of file
+}
diff --git a/pkgs/tools/text/par/default.nix b/pkgs/tools/text/par/default.nix
index 54b5e6566e8..e4c6c5d0c08 100644
--- a/pkgs/tools/text/par/default.nix
+++ b/pkgs/tools/text/par/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, fetchpatch}:
+{lib, stdenv, fetchurl, fetchpatch}:
 
 stdenv.mkDerivation {
   pname = "par";
@@ -18,7 +18,10 @@ stdenv.mkDerivation {
     })
   ];
 
-  buildPhase = ''make -f protoMakefile'';
+  makefile = "protoMakefile";
+  preBuild = ''
+    makeFlagsArray+=(CC="${stdenv.cc.targetPrefix}cc -c" LINK1=${stdenv.cc.targetPrefix}cc)
+  '';
 
   installPhase = ''
     mkdir -p $out/bin
@@ -29,7 +32,7 @@ stdenv.mkDerivation {
   '';
 
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "http://www.nicemice.net/par/";
     description = "Paragraph reflow for email";
     platforms = platforms.unix;
diff --git a/pkgs/tools/text/patchutils/generic.nix b/pkgs/tools/text/patchutils/generic.nix
index 52961e58c0e..d3e9da242e2 100644
--- a/pkgs/tools/text/patchutils/generic.nix
+++ b/pkgs/tools/text/patchutils/generic.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, perl
+{ lib, stdenv, fetchurl, perl
 , version, sha256, patches ? []
 , ...
 }:
@@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
 
   doCheck = false; # fails
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Tools to manipulate patch files";
     homepage = "http://cyberelk.net/tim/software/patchutils";
     license = licenses.gpl2Plus;
diff --git a/pkgs/tools/text/pbgopy/default.nix b/pkgs/tools/text/pbgopy/default.nix
new file mode 100644
index 00000000000..d4ed4eb0f03
--- /dev/null
+++ b/pkgs/tools/text/pbgopy/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "pbgopy";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "nakabonne";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-P/MFDFMsqSTVErTM9izJJSMIbiOcbQ9Ya10/w6NRcYw=";
+  };
+
+  vendorSha256 = "sha256-S2X74My6wyDZOsEYTDilCFaYgV2vQzU0jOAY9cEkJ6A=";
+
+  meta = with lib; {
+    description = "Copy and paste between devices";
+    homepage = "https://github.com/nakabonne/pbgopy";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivar ];
+  };
+}
diff --git a/pkgs/tools/text/peco/default.nix b/pkgs/tools/text/peco/default.nix
index c5655cb2a58..2928d532207 100644
--- a/pkgs/tools/text/peco/default.nix
+++ b/pkgs/tools/text/peco/default.nix
@@ -1,28 +1,25 @@
-{ stdenv, buildGoPackage, fetchFromGitHub }:
+{ lib, buildGoModule, fetchFromGitHub }:
 
-buildGoPackage rec {
+buildGoModule rec {
   pname = "peco";
-  version = "0.5.3";
+  version = "0.5.8";
 
-  goPackagePath = "github.com/peco/peco";
   subPackages = [ "cmd/peco" ];
 
   src = fetchFromGitHub {
     owner = "peco";
     repo = "peco";
     rev = "v${version}";
-    sha256 = "1m3s1jrrhqccgg3frfnq6iprwwi97j13wksckpcyrg51z6y5q041";
+    sha256 = "12xbqisk7bcy38fmjxcs069a0600gncbqzscqw6x37lgw6hlw52x";
   };
 
-  goDeps = ./deps.nix;
+  vendorSha256 = "1p8pc50ql2vqnn0crx0y558i3m0d6vcdaj3995h3f0908pnk6x7q";
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Simplistic interactive filtering tool";
     homepage = "https://github.com/peco/peco";
+    changelog = "https://github.com/peco/peco/blob/v${version}/Changes";
     license = licenses.mit;
-    # peco should work on Windows or other POSIX platforms, but the go package
-    # declares only linux and darwin.
-    platforms = platforms.linux ++ platforms.darwin;
     maintainers = with maintainers; [ pSub ];
   };
 }
diff --git a/pkgs/tools/text/peco/deps.nix b/pkgs/tools/text/peco/deps.nix
deleted file mode 100644
index 29bae2de5b5..00000000000
--- a/pkgs/tools/text/peco/deps.nix
+++ /dev/null
@@ -1,57 +0,0 @@
-# This file was generated by https://github.com/kamilchm/go2nix v1.2.1
-[
-  {
-    goPackagePath = "github.com/google/btree";
-    fetch = {
-      type = "git";
-      url = "https://github.com/google/btree";
-      rev = "0c3044bc8bada22db67b93f5760fe3f05d6a5c25";
-      sha256 = "05rdnf2c9r0yicg17zsq58i0sm32p0lk8zdnb7nhr0v5hqldvps4";
-    };
-  }
-  {
-    goPackagePath = "github.com/jessevdk/go-flags";
-    fetch = {
-      type = "git";
-      url = "https://github.com/jessevdk/go-flags";
-      rev = "8bc97d602c3bfeb5fc6fc9b5a9c898f245495637";
-      sha256 = "1h3il3ycgd54flbyqys4hm4gzx1lyn5ja1k79f2y7zbs6y0mf1lz";
-    };
-  }
-  {
-    goPackagePath = "github.com/lestrrat/go-pdebug";
-    fetch = {
-      type = "git";
-      url = "https://github.com/lestrrat/go-pdebug";
-      rev = "2e6eaaa5717f81bda41d27070d3c966f40a1e75f";
-      sha256 = "05dx1f1yln47nazyi50zix82xbnyva3hily4gh5gaz021h01npax";
-    };
-  }
-  {
-    goPackagePath = "github.com/mattn/go-runewidth";
-    fetch = {
-      type = "git";
-      url = "https://github.com/mattn/go-runewidth";
-      rev = "737072b4e32b7a5018b4a7125da8d12de90e8045";
-      sha256 = "09ni8bmj6p2b774bdh6mfcxl03bh5sqk860z03xpb6hv6yfxqkjm";
-    };
-  }
-  {
-    goPackagePath = "github.com/nsf/termbox-go";
-    fetch = {
-      type = "git";
-      url = "https://github.com/nsf/termbox-go";
-      rev = "e2050e41c8847748ec5288741c0b19a8cb26d084";
-      sha256 = "181b1df2b6fcn5wizq2qqxl1kwqbih5k15n08rx3bcz36q34n23s";
-    };
-  }
-  {
-    goPackagePath = "github.com/pkg/errors";
-    fetch = {
-      type = "git";
-      url = "https://github.com/pkg/errors";
-      rev = "248dadf4e9068a0b3e79f02ed0a610d935de5302";
-      sha256 = "03l80r0i9bxl0vz363w62k4a8apzglgbrz6viwym3044sxkl1qks";
-    };
-  }
-]
diff --git a/pkgs/tools/text/platinum-searcher/default.nix b/pkgs/tools/text/platinum-searcher/default.nix
index b53c5646e70..ca89b7dc2d8 100644
--- a/pkgs/tools/text/platinum-searcher/default.nix
+++ b/pkgs/tools/text/platinum-searcher/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, buildGoPackage, fetchFromGitHub }:
+{ lib, buildGoPackage, fetchFromGitHub }:
 
 buildGoPackage rec {
   pname = "the_platinum_searcher";
@@ -16,9 +16,9 @@ buildGoPackage rec {
 
   goDeps = ./deps.nix;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/monochromegane/the_platinum_searcher";
-    description = "A code search tool similar to ack and the_silver_searcher(ag).";
+    description = "A code search tool similar to ack and the_silver_searcher(ag)";
     license = licenses.mit;
   };
 }
diff --git a/pkgs/tools/text/pn/default.nix b/pkgs/tools/text/pn/default.nix
new file mode 100644
index 00000000000..81e4c1eb358
--- /dev/null
+++ b/pkgs/tools/text/pn/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, cmake, libphonenumber, icu, protobuf }:
+
+stdenv.mkDerivation rec {
+  pname = "pn";
+  version = "unstable-2021-01-28";
+
+  src = fetchFromGitHub {
+    owner = "Orange-OpenSource";
+    repo = pname;
+    rev = "41e1215397129ed0d42b5f137fb35b5e0648edda";
+    sha256 = "1g8r7y230k01ghraa55g1bhz3fiz6bjdgcsddy2dfa5ih8c4s3jm";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ libphonenumber icu protobuf ];
+
+  meta = with lib; {
+    description = "A libphonenumber command-line wrapper";
+    homepage = "https://github.com/Orange-OpenSource/pn";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/pkgs/tools/text/podiff/default.nix b/pkgs/tools/text/podiff/default.nix
index bee2c7a1a8f..2078c75f136 100644
--- a/pkgs/tools/text/podiff/default.nix
+++ b/pkgs/tools/text/podiff/default.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation {
   pname = "podiff";
-  version = "1.1";
+  version = "1.3";
 
   src = fetchurl {
-    url = "ftp://download.gnu.org.ua/pub/release/podiff/podiff-1.1.tar.gz";
-    sha256 = "1zz6bcmka5zvk2rq775qv122lqh54aijkxlghvx7z0r6kh880x59";
+    url = "ftp://download.gnu.org.ua/pub/release/podiff/podiff-1.3.tar.gz";
+    sha256 = "sha256-7fpix+GkXsfpRgnkHtk1iXF6ILHri7BtUhNPK6sDQFA=";
   };
 
   patchPhase = ''
@@ -15,11 +15,11 @@ stdenv.mkDerivation {
     mkdir -p $out/share/man/man1
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Finds differences in translations between two PO files, or revisions";
     homepage = "http://puszcza.gnu.org.ua/software/podiff";
     license = licenses.gpl3Plus;
     maintainers = [ maintainers.goibhniu ];
-    platforms = platforms.linux;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/poedit/default.nix b/pkgs/tools/text/poedit/default.nix
index ccd99a272b5..9a5226d98b2 100644
--- a/pkgs/tools/text/poedit/default.nix
+++ b/pkgs/tools/text/poedit/default.nix
@@ -1,23 +1,25 @@
-{ stdenv, fetchurl, autoconf, automake, libtool, gettext, pkgconfig, wxGTK30,
-  boost, icu, lucenepp, asciidoc, libxslt, xmlto, gtk2, gtkspell2, pugixml,
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, gettext, pkg-config, wxGTK30-gtk3,
+  boost, icu, lucenepp, asciidoc, libxslt, xmlto, gtk3, gtkspell3, pugixml,
   nlohmann_json, hicolor-icon-theme, wrapGAppsHook }:
 
 stdenv.mkDerivation rec {
   pname = "poedit";
-  version = "2.3.1";
+  version = "2.4.3";
 
-  src = fetchurl {
-    url = "https://github.com/vslavik/poedit/archive/v${version}-oss.tar.gz";
-    sha256 = "04f9za35rwyr7mabk8f8izc0fgvc3sfx45v8dml1xmi634n174ds";
+  src = fetchFromGitHub {
+    owner = "vslavik";
+    repo = "poedit";
+    rev = "v${version}-oss";
+    sha256 = "02xf2w3d2lnr3vqmil9vvg9pir7d21x4zrj9xwpgb7dhs0gimj0x";
   };
 
-  nativeBuildInputs = [ autoconf automake asciidoc wrapGAppsHook 
-    libxslt xmlto boost libtool pkgconfig ];
+  nativeBuildInputs = [ autoconf automake asciidoc wrapGAppsHook
+    libxslt xmlto boost libtool pkg-config ];
 
-  buildInputs = [ lucenepp nlohmann_json wxGTK30 icu pugixml gtk2 gtkspell2 hicolor-icon-theme ];
+  buildInputs = [ lucenepp nlohmann_json wxGTK30-gtk3 icu pugixml gtk3 gtkspell3 hicolor-icon-theme ];
 
   propagatedBuildInputs = [ gettext ];
-  
+
   preConfigure = "
     patchShebangs bootstrap
     ./bootstrap
@@ -29,18 +31,18 @@ stdenv.mkDerivation rec {
     "--with-boost-libdir=${boost.out}/lib"
     "CPPFLAGS=-I${nlohmann_json}/include/nlohmann/"
   ];
- 
+
   preFixup = ''
-    gappsWrapperArgs+=(--prefix PATH : "${stdenv.lib.makeBinPath [ gettext ]}")
+    gappsWrapperArgs+=(--prefix PATH : "${lib.makeBinPath [ gettext ]}")
   '';
- 
+
   enableParallelBuilding = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Cross-platform gettext catalogs (.po files) editor";
     homepage = "https://www.poedit.net/";
     license = licenses.mit;
     platforms = platforms.unix;
-    maintainers = with maintainers; [ domenkozar genesis ];
+    maintainers = with maintainers; [ dasj19 ];
   };
 }
diff --git a/pkgs/tools/text/popfile/default.nix b/pkgs/tools/text/popfile/default.nix
index b7134ba7356..e2f5952077f 100644
--- a/pkgs/tools/text/popfile/default.nix
+++ b/pkgs/tools/text/popfile/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchzip, makeWrapper, perlPackages,
+{ lib, stdenv, fetchzip, makeWrapper, perlPackages,
 ... }:
 
 stdenv.mkDerivation rec {
@@ -12,7 +12,8 @@ stdenv.mkDerivation rec {
     stripRoot = false;
   };
 
-  buildInputs = [ makeWrapper ] ++ (with perlPackages; [
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = (with perlPackages; [
     ## These are all taken from the popfile documentation as applicable to Linux
     ## http://getpopfile.org/docs/howtos:allplatformsrequireperl
     perl
@@ -49,11 +50,11 @@ stdenv.mkDerivation rec {
   meta = {
     description = "An email classification system that automatically sorts messages and fights spam";
     homepage = "http://getpopfile.org";
-    license = stdenv.lib.licenses.gpl2;
+    license = lib.licenses.gpl2;
 
     # Should work on macOS, but havent tested it.
     # Windows support is more complicated.
     # http://getpopfile.org/docs/faq:systemrequirements
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/proselint/default.nix b/pkgs/tools/text/proselint/default.nix
index 36a68f9406d..143c43f660d 100644
--- a/pkgs/tools/text/proselint/default.nix
+++ b/pkgs/tools/text/proselint/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, buildPythonApplication, click, future, six }:
+{ lib, fetchurl, buildPythonApplication, click, future, six }:
 
 buildPythonApplication rec {
   pname = "proselint";
@@ -13,7 +13,7 @@ buildPythonApplication rec {
 
   propagatedBuildInputs = [ click future six ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A linter for prose";
     homepage = "http://proselint.com";
     license = licenses.bsd3;
diff --git a/pkgs/tools/text/qgrep/default.nix b/pkgs/tools/text/qgrep/default.nix
index 30873e89d1b..032e9474128 100644
--- a/pkgs/tools/text/qgrep/default.nix
+++ b/pkgs/tools/text/qgrep/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, CoreServices, CoreFoundation, fetchpatch }:
+{ lib, stdenv, fetchFromGitHub, CoreServices, CoreFoundation, fetchpatch }:
 
 stdenv.mkDerivation rec {
   version = "1.1";
@@ -12,25 +12,25 @@ stdenv.mkDerivation rec {
     fetchSubmodules = true;
   };
 
-  patches = stdenv.lib.optionals stdenv.isDarwin [
+  patches = lib.optionals stdenv.isDarwin [
     (fetchpatch {
       url = "https://github.com/zeux/qgrep/commit/21c4d1a5ab0f0bdaa0b5ca993c1315c041418cc6.patch";
       sha256 = "0wpxzrd9pmhgbgby17vb8279xwvkxfdd99gvv7r74indgdxqg7v8";
     })
   ];
 
-  buildInputs = stdenv.lib.optionals stdenv.isDarwin [ CoreServices CoreFoundation ];
+  buildInputs = lib.optionals stdenv.isDarwin [ CoreServices CoreFoundation ];
 
-  postPatch = stdenv.lib.optionalString stdenv.isAarch64 ''
+  postPatch = lib.optionalString stdenv.isAarch64 ''
     substituteInPlace Makefile \
       --replace "-msse2" "" --replace "-DUSE_SSE2" ""
   '';
 
-  installPhase = '' 
+  installPhase = ''
     install -Dm755 qgrep $out/bin/qgrep
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Fast regular expression grep for source code with incremental index updates";
     homepage = "https://github.com/zeux/qgrep";
     license = licenses.mit;
diff --git a/pkgs/tools/text/qprint/default.nix b/pkgs/tools/text/qprint/default.nix
index d616d15ad75..e2621ab1876 100644
--- a/pkgs/tools/text/qprint/default.nix
+++ b/pkgs/tools/text/qprint/default.nix
@@ -1,4 +1,4 @@
-{ fetchurl, stdenv }:
+{ fetchurl, lib, stdenv }:
 
 stdenv.mkDerivation rec {
   name = "qprint-1.1";
@@ -19,10 +19,10 @@ stdenv.mkDerivation rec {
 
   meta = {
     homepage = "http://www.fourmilab.ch/webtools/qprint/";
-    license = stdenv.lib.licenses.publicDomain;
+    license = lib.licenses.publicDomain;
     description = "Encode and decode Quoted-Printable files";
-    maintainers = [ stdenv.lib.maintainers.tv ];
-    platforms = stdenv.lib.platforms.all;
+    maintainers = [ lib.maintainers.tv ];
+    platforms = lib.platforms.all;
   };
 
 }
diff --git a/pkgs/tools/text/qshowdiff/default.nix b/pkgs/tools/text/qshowdiff/default.nix
index bb2eeee8a9e..251427f03c5 100644
--- a/pkgs/tools/text/qshowdiff/default.nix
+++ b/pkgs/tools/text/qshowdiff/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, qt4, perl, pkgconfig }:
+{lib, stdenv, fetchurl, qt4, perl, pkg-config }:
 
 stdenv.mkDerivation rec {
   pname = "qshowdiff";
@@ -9,7 +9,7 @@ stdenv.mkDerivation rec {
     sha256 = "027959xbzvi5c2w9y1x122sr5i26k9mvp43banz2wln6gd860n1a";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ qt4 perl ];
 
   configurePhase = ''
@@ -20,6 +20,6 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "http://qshowdiff.danfis.cz/";
     description = "Colourful diff viewer";
-    license = stdenv.lib.licenses.gpl3Plus;
+    license = lib.licenses.gpl3Plus;
   };
 }
diff --git a/pkgs/tools/text/reckon/Gemfile.lock b/pkgs/tools/text/reckon/Gemfile.lock
index 94f0f8f506c..b1bfe4aaa8b 100644
--- a/pkgs/tools/text/reckon/Gemfile.lock
+++ b/pkgs/tools/text/reckon/Gemfile.lock
@@ -2,14 +2,12 @@ GEM
   remote: https://rubygems.org/
   specs:
     chronic (0.10.2)
-    fastercsv (1.5.5)
-    highline (1.7.8)
-    reckon (0.4.4)
+    highline (2.0.3)
+    rchardet (1.8.0)
+    reckon (0.7.1)
       chronic (>= 0.3.0)
-      fastercsv (>= 1.5.1)
       highline (>= 1.5.2)
-      terminal-table (>= 1.4.2)
-    terminal-table (1.6.0)
+      rchardet (>= 1.8.0)
 
 PLATFORMS
   ruby
@@ -18,4 +16,4 @@ DEPENDENCIES
   reckon
 
 BUNDLED WITH
-   2.1.4
+   1.17.2
diff --git a/pkgs/tools/text/reckon/default.nix b/pkgs/tools/text/reckon/default.nix
index 261149229b6..3af64e39ed1 100644
--- a/pkgs/tools/text/reckon/default.nix
+++ b/pkgs/tools/text/reckon/default.nix
@@ -4,9 +4,9 @@ stdenv.mkDerivation rec {
   pname = "reckon";
   version = (import ./gemset.nix).reckon.version;
 
-  phases = [ "installPhase" ];
+  dontUnpack = true;
 
-  buildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ makeWrapper ];
 
   installPhase = let
     env = bundlerEnv {
@@ -15,8 +15,10 @@ stdenv.mkDerivation rec {
       gemdir = ./.;
     };
   in ''
+    runHook preInstall
     mkdir -p $out/bin
     makeWrapper ${env}/bin/reckon $out/bin/reckon
+    runHook postInstall
   '';
 
   passthru.updateScript = bundlerUpdateScript "reckon";
diff --git a/pkgs/tools/text/reckon/gemset.nix b/pkgs/tools/text/reckon/gemset.nix
index e1e4a43188d..09a4e704d08 100644
--- a/pkgs/tools/text/reckon/gemset.nix
+++ b/pkgs/tools/text/reckon/gemset.nix
@@ -1,5 +1,7 @@
 {
   chronic = {
+    groups = ["default"];
+    platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
       sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
@@ -7,36 +9,35 @@
     };
     version = "0.10.2";
   };
-  fastercsv = {
-    source = {
-      remotes = ["https://rubygems.org"];
-      sha256 = "1df3vfgw5wg0s405z0pj0rfcvnl9q6wak7ka8gn0xqg4cag1k66h";
-      type = "gem";
-    };
-    version = "1.5.5";
-  };
   highline = {
+    groups = ["default"];
+    platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1nf5lgdn6ni2lpfdn4gk3gi47fmnca2bdirabbjbz1fk9w4p8lkr";
+      sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d";
       type = "gem";
     };
-    version = "1.7.8";
+    version = "2.0.3";
   };
-  reckon = {
+  rchardet = {
+    groups = ["default"];
+    platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1p6w8w7vpl8fq4yfggrxbv6ph76psg7l5b4q29a8zvfbzzx6a0xw";
+      sha256 = "1isj1b3ywgg2m1vdlnr41lpvpm3dbyarf1lla4dfibfmad9csfk9";
       type = "gem";
     };
-    version = "0.4.4";
+    version = "1.8.0";
   };
-  terminal-table = {
+  reckon = {
+    dependencies = ["chronic" "highline" "rchardet"];
+    groups = ["default"];
+    platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0hbmzfr17ji5ws5x5z3kypmb5irwwss7q7kkad0gs005ibqrxv0a";
+      sha256 = "0hsmzjxj1f5ma816gag1b3bdjbynhj2szgar955fcs3gbbzv4sk7";
       type = "gem";
     };
-    version = "1.6.0";
+    version = "0.7.1";
   };
-}
\ No newline at end of file
+}
diff --git a/pkgs/tools/text/recode/default.nix b/pkgs/tools/text/recode/default.nix
index b6503f88848..9b77c9d8b70 100644
--- a/pkgs/tools/text/recode/default.nix
+++ b/pkgs/tools/text/recode/default.nix
@@ -1,13 +1,13 @@
-{ stdenv, fetchurl, python3, perl, intltool, flex, texinfo, libiconv, libintl }:
+{ lib, stdenv, fetchurl, python3, perl, intltool, flex, texinfo, libiconv, libintl }:
 
 stdenv.mkDerivation rec {
   pname = "recode";
-  version = "3.7.7";
+  version = "3.7.8";
 
   # Use official tarball, avoid need to bootstrap/generate build system
   src = fetchurl {
     url = "https://github.com/rrthomas/${pname}/releases/download/v${version}/${pname}-${version}.tar.gz";
-    sha256 = "1yrqgw74qrdmy82lxd1cxlfclrf2fqi0qp7afjmfc6b7f0xzcih9";
+    sha256 = "19yg20z1smj9kag1axgvc4s4kd6jmw75h0pa8xqxl3xqqyn5rdsg";
   };
 
   nativeBuildInputs = [ python3 python3.pkgs.cython perl intltool flex texinfo libiconv ];
@@ -18,8 +18,8 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "https://github.com/rrthomas/recode";
     description = "Converts files between various character sets and usages";
-    platforms = stdenv.lib.platforms.unix;
-    license = stdenv.lib.licenses.gpl2Plus;
-    maintainers = with stdenv.lib.maintainers; [ jcumming ];
+    platforms = lib.platforms.unix;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ jcumming ];
   };
 }
diff --git a/pkgs/tools/text/replace/default.nix b/pkgs/tools/text/replace/default.nix
index 009c3dcd8c5..a0873d1c8d2 100644
--- a/pkgs/tools/text/replace/default.nix
+++ b/pkgs/tools/text/replace/default.nix
@@ -1,11 +1,12 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
-stdenv.mkDerivation {
-  name = "replace-2.24";
+stdenv.mkDerivation rec {
+  pname = "replace";
+  version = "2.24";
 
   src = fetchurl {
-    url = "ftp://hpux.connect.org.uk/hpux/Users/replace-2.24/replace-2.24-src-11.11.tar.gz";
-    sha256 = "1c2nkxx83vmlh1v3ib6r2xqh121gdb1rharwsimcb2h0xwc558dm";
+    url = "http://hpux.connect.org.uk/ftp/hpux/Users/replace-${version}/replace-${version}-src-11.31.tar.gz";
+    sha256 = "18hkwhaz25s6209n5mpx9hmkyznlzygqj488p2l7nvp9zrlxb9sf";
   };
 
   outputs = [ "out" "man" ];
@@ -24,6 +25,6 @@ stdenv.mkDerivation {
   meta = {
     homepage = "https://replace.richardlloyd.org.uk/";
     description = "A tool to replace verbatim strings";
-    platforms = stdenv.lib.platforms.unix;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/rgxg/default.nix b/pkgs/tools/text/rgxg/default.nix
new file mode 100644
index 00000000000..8e4d991e7bf
--- /dev/null
+++ b/pkgs/tools/text/rgxg/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, fetchzip }:
+
+stdenv.mkDerivation rec {
+  pname = "rgxg";
+  version = "0.1.2";
+
+  src = fetchzip {
+    url = "https://github.com/rgxg/rgxg/releases/download/v${version}/${pname}-${version}.tar.gz";
+    sha256 = "050jxc3qhfrm9fdbzd67hlsqlp4qk1fa20q1g2v919sh7s6v77si";
+  };
+
+  meta = with lib; {
+    description = "A C library and a command-line tool to generate (extended) regular expressions";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ hloeffler ];
+    homepage = "https://rgxg.github.io/";
+  };
+}
diff --git a/pkgs/tools/text/ripgrep-all/default.nix b/pkgs/tools/text/ripgrep-all/default.nix
index 8da7a54ebb2..0fc39b8da28 100644
--- a/pkgs/tools/text/ripgrep-all/default.nix
+++ b/pkgs/tools/text/ripgrep-all/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchFromGitHub, rustPlatform, makeWrapper, ffmpeg_3
+{ stdenv, lib, fetchFromGitHub, rustPlatform, makeWrapper, ffmpeg
 , pandoc, poppler_utils, ripgrep, Security, imagemagick, tesseract
 }:
 
@@ -13,13 +13,13 @@ rustPlatform.buildRustPackage rec {
     sha256 = "1wjpgi7m3lxybllkr3r60zaphp02ykq2syq72q9ail2760cjcir6";
   };
 
-  cargoSha256 = "0arwxqrpxdws4q1pnqzqkp1yv5aas08lkzh1vcgmf26j58sycniy";
+  cargoSha256 = "1l71xj5crfb51wfp2bdvdqp1l8kg182n5d6w23lq2wjszaqcj7cw";
   nativeBuildInputs = [ makeWrapper ];
   buildInputs = lib.optional stdenv.isDarwin Security;
 
   postInstall = ''
     wrapProgram $out/bin/rga \
-      --prefix PATH ":" "${lib.makeBinPath [ ffmpeg_3 pandoc poppler_utils ripgrep imagemagick tesseract ]}"
+      --prefix PATH ":" "${lib.makeBinPath [ ffmpeg pandoc poppler_utils ripgrep imagemagick tesseract ]}"
   '';
 
   # Use upstream's example data to run a couple of queries to ensure the dependencies
@@ -46,7 +46,7 @@ rustPlatform.buildRustPackage rec {
 
   doInstallCheck = true;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, and more";
     longDescription = ''
       Ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc.
@@ -58,5 +58,6 @@ rustPlatform.buildRustPackage rec {
     homepage = "https://github.com/phiresky/ripgrep-all";
     license = with licenses; [ agpl3Plus ];
     maintainers = with maintainers; [ zaninime ma27 ];
+    mainProgram = "rga";
   };
 }
diff --git a/pkgs/tools/text/ripgrep/default.nix b/pkgs/tools/text/ripgrep/default.nix
index 9a72e023d6d..3fa202135f5 100644
--- a/pkgs/tools/text/ripgrep/default.nix
+++ b/pkgs/tools/text/ripgrep/default.nix
@@ -1,43 +1,56 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , rustPlatform
 , asciidoctor
 , installShellFiles
+, pkg-config
 , Security
 , withPCRE2 ? true
-, pcre2 ? null
+, pcre2
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "ripgrep";
-  version = "12.1.1";
+  version = "13.0.0";
 
   src = fetchFromGitHub {
     owner = "BurntSushi";
     repo = pname;
     rev = version;
-    sha256 = "1hqps7l5qrjh9f914r5i6kmcz6f1yb951nv4lby0cjnp5l253kps";
+    sha256 = "0pdcjzfi0fclbzmmf701fdizb95iw427vy3m1svy6gdn2zwj3ldr";
   };
 
-  cargoSha256 = "03wf9r2csi6jpa7v5sw5lpxkrk4wfzwmzx7k3991q3bdjzcwnnwp";
+  cargoSha256 = "1kfdgh8dra4jxgcdb0lln5wwrimz0dpp33bq3h7jgs8ngaq2a9wp";
 
-  cargoBuildFlags = stdenv.lib.optional withPCRE2 "--features pcre2";
+  cargoBuildFlags = lib.optional withPCRE2 "--features pcre2";
 
-  nativeBuildInputs = [ asciidoctor installShellFiles ];
-  buildInputs = (stdenv.lib.optional withPCRE2 pcre2)
-  ++ (stdenv.lib.optional stdenv.isDarwin Security);
+  nativeBuildInputs = [ asciidoctor installShellFiles ]
+    ++ lib.optional withPCRE2 pkg-config;
+  buildInputs = lib.optional withPCRE2 pcre2
+    ++ lib.optional stdenv.isDarwin Security;
 
   preFixup = ''
     installManPage $releaseDir/build/ripgrep-*/out/rg.1
 
     installShellCompletion $releaseDir/build/ripgrep-*/out/rg.{bash,fish}
-    installShellCompletion --zsh "$src/complete/_rg"
+    installShellCompletion --zsh complete/_rg
   '';
 
-  meta = with stdenv.lib; {
+  doInstallCheck = true;
+  installCheckPhase = ''
+    file="$(mktemp)"
+    echo "abc\nbcd\ncde" > "$file"
+    $out/bin/rg -N 'bcd' "$file"
+    $out/bin/rg -N 'cd' "$file"
+  '' + lib.optionalString withPCRE2 ''
+    echo '(a(aa)aa)' | $out/bin/rg -P '\((a*|(?R))*\)'
+  '';
+
+  meta = with lib; {
     description = "A utility that combines the usability of The Silver Searcher with the raw speed of grep";
     homepage = "https://github.com/BurntSushi/ripgrep";
     license = with licenses; [ unlicense /* or */ mit ];
     maintainers = with maintainers; [ tailhook globin ma27 zowoq ];
+    mainProgram = "rg";
   };
 }
diff --git a/pkgs/tools/text/robodoc/default.nix b/pkgs/tools/text/robodoc/default.nix
new file mode 100644
index 00000000000..e30e8739797
--- /dev/null
+++ b/pkgs/tools/text/robodoc/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoreconfHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "robodoc";
+  version = "4.99.44";
+
+  src = fetchFromGitHub {
+    owner = "gumpu";
+    repo = "ROBODoc";
+    rev = "v${version}";
+    sha256 = "l3prSdaGhOvXmZfCPbsZJNocO7y20zJjLQpajRTJOqE=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gumpu/ROBODoc";
+    description = "Documentation Extraction Tool";
+    longDescription = ''
+      ROBODoc is program documentation tool. The idea is to include for every
+      function or procedure a standard header containing all sorts of
+      information about the procedure or function. ROBODoc extracts these
+      headers from the source file and puts them in a separate
+      autodocs-file. ROBODoc thus allows you to include the program
+      documentation in the source code and avoid having to maintain two separate
+      documents. Or as Petteri puts it: "robodoc is very useful - especially for
+      programmers who don't like writing documents with Word or some other
+      strange tool."
+
+      ROBODoc can format the headers in a number of different formats: HTML,
+      RTF, LaTeX, or XML DocBook. In HTML mode it can generate cross links
+      between headers. You can even include parts of your source code.
+
+      ROBODoc works with many programming languages: For instance C, Pascal,
+      Shell Scripts, Assembler, COBOL, Occam, Postscript, Forth, Tcl/Tk, C++,
+      Java -- basically any program in which you can use remarks/comments.
+    '';
+    license = with licenses; gpl3Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = with platforms; all;
+  };
+}
diff --git a/pkgs/tools/text/rpl/default.nix b/pkgs/tools/text/rpl/default.nix
index 7ac3790f8a9..97a30211621 100644
--- a/pkgs/tools/text/rpl/default.nix
+++ b/pkgs/tools/text/rpl/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, pythonPackages }:
+{ lib, fetchFromGitHub, pythonPackages }:
 
 pythonPackages.buildPythonApplication rec {
   pname = "rpl";
@@ -14,7 +14,7 @@ pythonPackages.buildPythonApplication rec {
     sha256 = "1xhpgcmq91ivy9ijfyz5ilg51m7fz8ar2077r7gq246j8gbf8ggr";
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Replace strings in files";
     homepage    = "https://github.com/kcoyner/rpl";
     license     = licenses.gpl2;
diff --git a/pkgs/tools/text/rs/default.nix b/pkgs/tools/text/rs/default.nix
index bd141f491d4..9aca92922a5 100644
--- a/pkgs/tools/text/rs/default.nix
+++ b/pkgs/tools/text/rs/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, libbsd }:
+{ lib, stdenv, fetchurl, libbsd }:
 
 stdenv.mkDerivation rec {
   pname = "rs";
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
     install -Dm 644 rs.1 -t $out/share/man/man1
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Reshape a data array from standard input";
     longDescription = ''
       rs reads the standard input, interpreting each line as a row of blank-
diff --git a/pkgs/tools/text/rst2html5/default.nix b/pkgs/tools/text/rst2html5/default.nix
index d20ce99dd74..c9e8b046986 100644
--- a/pkgs/tools/text/rst2html5/default.nix
+++ b/pkgs/tools/text/rst2html5/default.nix
@@ -1,19 +1,22 @@
-{ stdenv, fetchurl, pythonPackages }:
+{ lib, python3Packages }:
 
-pythonPackages.buildPythonPackage rec {
+let
   pname = "rst2html5";
-  version = "1.9.4";
+  version = "1.10.6";
+  format = "wheel";
+in python3Packages.buildPythonPackage {
+  inherit pname version format;
 
-  src = fetchurl {
-    url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${pname}-${version}.tar.gz";
-    sha256 = "d044589d30eeaf7336986078b7bd175510fd649a212b01a457d7806b279e6c73";
+  src = python3Packages.fetchPypi {
+    inherit pname version format;
+    sha256 = "sha256-jmToDFLQODqgTycBp2J8LyoJ1Zxho9w1VdhFMzvDFkg=";
   };
 
-  propagatedBuildInputs = with pythonPackages;
+  propagatedBuildInputs = with python3Packages;
   [ docutils genshi pygments beautifulsoup4 ];
 
-  meta = with stdenv.lib;{
-    homepage = "https://bitbucket.org/andre_felipe_dias/rst2html5";
+  meta = with lib;{
+    homepage = "https://pypi.org/project/rst2html5/";
     description = "Converts ReSTructuredText to (X)HTML5";
     license = licenses.mit;
     maintainers = with maintainers; [ AndersonTorres ];
diff --git a/pkgs/tools/text/ruby-zoom/gemset.nix b/pkgs/tools/text/ruby-zoom/gemset.nix
index f4c637aadf8..19584787d90 100644
--- a/pkgs/tools/text/ruby-zoom/gemset.nix
+++ b/pkgs/tools/text/ruby-zoom/gemset.nix
@@ -61,4 +61,4 @@
     };
     version = "1.0.0";
   };
-}
\ No newline at end of file
+}
diff --git a/pkgs/tools/text/ruplacer/default.nix b/pkgs/tools/text/ruplacer/default.nix
index 7ebf739414a..2f9249711ed 100644
--- a/pkgs/tools/text/ruplacer/default.nix
+++ b/pkgs/tools/text/ruplacer/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, rustPlatform, Security }:
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
 
 rustPlatform.buildRustPackage rec {
   pname = "ruplacer";
@@ -11,14 +11,14 @@ rustPlatform.buildRustPackage rec {
     sha256 = "0yj753d9wsnp4s5a71ph241jym5rfz3161a1v3qxfc4w23v86j1q";
   };
 
-  cargoSha256 = "0wrv4k63pc1v0apmxmmci9qaykcv9ig3nfxy6id5caqrckp73cr4";
+  cargoSha256 = "0z1i1yfj1wdzbzapnvfr9ngn9z30xwlkrfhz52npbirysy1al5xk";
 
-  buildInputs = (stdenv.lib.optional stdenv.isDarwin Security);
+  buildInputs = (lib.optional stdenv.isDarwin Security);
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Find and replace text in source files";
     homepage = "https://github.com/TankerHQ/ruplacer";
     license = [ licenses.bsd3 ];
-    maintainers = with maintainers; [ filalex77 ];
+    maintainers = with maintainers; [ Br1ght0ne ];
   };
 }
diff --git a/pkgs/tools/text/schema2ldif/default.nix b/pkgs/tools/text/schema2ldif/default.nix
index 5df4e90ff1a..84196ae1119 100644
--- a/pkgs/tools/text/schema2ldif/default.nix
+++ b/pkgs/tools/text/schema2ldif/default.nix
@@ -1,4 +1,6 @@
-{ stdenv, fetchurl, makeWrapper, perlPackages }: stdenv.mkDerivation rec {
+{ lib, stdenv, fetchurl, makeWrapper, perlPackages }:
+
+stdenv.mkDerivation rec {
   pname = "schema2ldif";
   version = "1.3";
 
@@ -21,7 +23,7 @@
        --prefix PERL5PATH : "${perlPackages.makePerlPath [ perlPackages.GetoptLong ]}"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Utilities to manage schema in .schema and .ldif format";
     homepage = "https://www.fusiondirectory.org/schema2ldif-project-and-components/";
     license = licenses.bsd3;
diff --git a/pkgs/tools/text/sd/default.nix b/pkgs/tools/text/sd/default.nix
index 1fa508b1ef6..009150062db 100644
--- a/pkgs/tools/text/sd/default.nix
+++ b/pkgs/tools/text/sd/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, rustPlatform, Security
+{ lib, stdenv, fetchFromGitHub, rustPlatform, installShellFiles, Security
 }:
 
 rustPlatform.buildRustPackage rec {
@@ -12,14 +12,23 @@ rustPlatform.buildRustPackage rec {
     sha256 = "0c5bsqs6c55x4j640vhzlmbiylhp5agr7lx0jrwcjazfyvxihc01";
   };
 
-  cargoSha256 = "1mksmdp1wnsjd8gw1g3l16a24fk05xa9mxygc0qklr41bqf8kw8b";
+  cargoSha256 = "1iwgy9zzdxay6hb9pz47jchy03jrsy5csxijlq4i228qhqnvq1lr";
 
-  buildInputs = stdenv.lib.optionals stdenv.isDarwin [ Security ];
+  nativeBuildInputs = [ installShellFiles ];
 
-  meta = with stdenv.lib; {
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  preFixup = ''
+    installManPage $releaseDir/build/sd-*/out/sd.1
+
+    installShellCompletion $releaseDir/build/sd-*/out/sd.{bash,fish}
+    installShellCompletion --zsh $releaseDir/build/sd-*/out/_sd
+  '';
+
+  meta = with lib; {
     description = "Intuitive find & replace CLI (sed alternative)";
     homepage = "https://github.com/chmln/sd";
     license = licenses.mit;
-    maintainers = with maintainers; [ amar1729 filalex77 ];
+    maintainers = with maintainers; [ amar1729 Br1ght0ne ];
   };
 }
diff --git a/pkgs/tools/text/sgml/jade/default.nix b/pkgs/tools/text/sgml/jade/default.nix
index f4110ed2105..338520b4df2 100644
--- a/pkgs/tools/text/sgml/jade/default.nix
+++ b/pkgs/tools/text/sgml/jade/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, gnum4 }:
+{ lib, stdenv, fetchurl, gnum4 }:
 
 stdenv.mkDerivation rec {
   name = "jade-${version}-${debpatch}";
@@ -33,7 +33,7 @@ stdenv.mkDerivation rec {
     description = "James Clark's DSSSL Engine";
     license = "custom";
     homepage = "http://www.jclark.com/jade/";
-    platforms = with stdenv.lib.platforms; linux;
-    maintainers = with stdenv.lib.maintainers; [ e-user ];
+    platforms = with lib.platforms; linux;
+    maintainers = with lib.maintainers; [ e-user ];
   };
 }
diff --git a/pkgs/tools/text/sgml/openjade/default.nix b/pkgs/tools/text/sgml/openjade/default.nix
index eee5d005c05..785ef320596 100644
--- a/pkgs/tools/text/sgml/openjade/default.nix
+++ b/pkgs/tools/text/sgml/openjade/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, opensp, perl }:
+{ lib, stdenv, fetchurl, opensp, perl }:
 
 stdenv.mkDerivation rec {
   name = "openjade-1.3.2";
@@ -19,8 +19,8 @@ stdenv.mkDerivation rec {
 
   meta = {
     description = "An implementation of DSSSL, an ISO standard for formatting SGML (and XML) documents";
-    license = stdenv.lib.licenses.mit;
+    license = lib.licenses.mit;
     homepage = "http://openjade.sourceforge.net/";
-    platforms = stdenv.lib.platforms.linux;
+    platforms = lib.platforms.linux;
   };
 }
diff --git a/pkgs/tools/text/sgml/opensp/default.nix b/pkgs/tools/text/sgml/opensp/default.nix
index 9880564d969..1c9131d29dc 100644
--- a/pkgs/tools/text/sgml/opensp/default.nix
+++ b/pkgs/tools/text/sgml/opensp/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchpatch, xmlto, docbook_xml_dtd_412
+{ lib, stdenv, fetchurl, fetchpatch, xmlto, docbook_xml_dtd_412
 , libxslt, docbook_xsl, autoconf, automake, gettext, libiconv, libtool}:
 
 stdenv.mkDerivation {
@@ -20,7 +20,7 @@ stdenv.mkDerivation {
       sha256 = "04q14s8qsad0bkjmj067dn831i0r6v7742rafdlnbfm5y249m2q6";
     })
   ];
-  
+
   setupHook = ./setup-hook.sh;
 
   postFixup = ''
@@ -32,7 +32,7 @@ stdenv.mkDerivation {
   preConfigure = if stdenv.isCygwin then "autoreconf -fi" else null;
 
   # need autoconf, automake, gettext, and libtool for reconfigure
-  nativeBuildInputs = stdenv.lib.optionals stdenv.isCygwin [ autoconf automake libtool ];
+  nativeBuildInputs = lib.optionals stdenv.isCygwin [ autoconf automake libtool ];
 
   buildInputs = [ xmlto docbook_xml_dtd_412 libxslt docbook_xsl gettext libiconv ];
 
@@ -40,8 +40,8 @@ stdenv.mkDerivation {
 
   meta = {
     description = "A suite of SGML/XML processing tools";
-    license = stdenv.lib.licenses.mit;
+    license = lib.licenses.mit;
     homepage = "http://openjade.sourceforge.net/";
-    platforms = stdenv.lib.platforms.unix;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/shfmt/default.nix b/pkgs/tools/text/shfmt/default.nix
index ec58cbdd1a9..29a5a157a67 100644
--- a/pkgs/tools/text/shfmt/default.nix
+++ b/pkgs/tools/text/shfmt/default.nix
@@ -1,29 +1,28 @@
-{ lib, buildGoModule, fetchFromGitHub, fetchpatch }:
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles, scdoc }:
 
 buildGoModule rec {
   pname = "shfmt";
-  version = "3.1.2";
+  version = "3.3.0";
 
   src = fetchFromGitHub {
     owner = "mvdan";
     repo = "sh";
     rev = "v${version}";
-    sha256 = "03zgi0rlra3gz8cbqwmhpjxsg5048anfc6ccd2w50fjhx6farsnv";
+    sha256 = "sha256-pD1nkbBw5NBCyuhn2DYop2AR+1T8p6/zTa6FeWiya7Q=";
   };
 
-  vendorSha256 = "1jq2x4yxshsy4ahp7nrry8dc9cyjj46mljs447rq57sgix4ndpq8";
+  vendorSha256 = "sha256-euJYStN21xFYosouWYXpHN3MWCKR4NT8z6OSonM0HW8=";
 
   subPackages = [ "cmd/shfmt" ];
 
   buildFlagsArray = [ "-ldflags=-s -w -X main.version=${version}" ];
 
-  patches = [
-    # fix failing test on go 1.15, remove with > 3.1.2
-    (fetchpatch {
-      url = "https://github.com/mvdan/sh/commit/88956f97dae1f268af6c030bf2ba60762ebb488a.patch";
-      sha256 = "1zg8i7kklr12zjkaxh8djd2bzkdx8klgfj271r2wivkc2x61shgv";
-    })
-  ];
+  nativeBuildInputs = [ installShellFiles scdoc ];
+
+  postBuild = ''
+    scdoc < cmd/shfmt/shfmt.1.scd > shfmt.1
+    installManPage shfmt.1
+  '';
 
   meta = with lib; {
     homepage = "https://github.com/mvdan/sh";
@@ -33,6 +32,6 @@ buildGoModule rec {
       You can feed it standard input, any number of files or any number of directories to recurse into.
     '';
     license = licenses.bsd3;
-    maintainers = with maintainers; [ zowoq ];
+    maintainers = with maintainers; [ zowoq SuperSandro2000 ];
   };
 }
diff --git a/pkgs/tools/text/shocco/default.nix b/pkgs/tools/text/shocco/default.nix
index 65adfc29b95..11d8194bb70 100644
--- a/pkgs/tools/text/shocco/default.nix
+++ b/pkgs/tools/text/shocco/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, perlPackages, pythonPackages }:
+{ lib, stdenv, fetchFromGitHub, perlPackages, pythonPackages }:
 
 stdenv.mkDerivation rec {
   pname = "shocco";
@@ -18,7 +18,7 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ perlPackages.TextMarkdown pythonPackages.pygments ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A quick-and-dirty, literate-programming-style documentation generator for / in POSIX shell";
     homepage = "https://rtomayko.github.io/shocco/";
     license = licenses.mit;
diff --git a/pkgs/tools/text/sift/default.nix b/pkgs/tools/text/sift/default.nix
index 5a36de5f720..dc025f17a78 100644
--- a/pkgs/tools/text/sift/default.nix
+++ b/pkgs/tools/text/sift/default.nix
@@ -17,7 +17,7 @@ buildGoPackage rec {
   goDeps = ./deps.nix;
 
   meta = with lib; {
-    description = "sift is a fast and powerful alternative to grep";
+    description = "A fast and powerful alternative to grep";
     homepage = "https://sift-tool.org";
     maintainers = [ maintainers.carlsverre ];
     license = licenses.gpl3;
diff --git a/pkgs/tools/text/silver-searcher/default.nix b/pkgs/tools/text/silver-searcher/default.nix
index 51003694203..8cd67b99263 100644
--- a/pkgs/tools/text/silver-searcher/default.nix
+++ b/pkgs/tools/text/silver-searcher/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchFromGitHub, autoreconfHook, pkgconfig, pcre, zlib, lzma}:
+{lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, pcre, zlib, xz}:
 
 stdenv.mkDerivation rec {
   pname = "silver-searcher";
@@ -13,12 +13,12 @@ stdenv.mkDerivation rec {
 
   patches = [ ./bash-completion.patch ];
 
-  NIX_LDFLAGS = stdenv.lib.optionalString stdenv.isLinux "-lgcc_s";
+  NIX_LDFLAGS = lib.optionalString stdenv.isLinux "-lgcc_s";
 
-  nativeBuildInputs = [ autoreconfHook pkgconfig ];
-  buildInputs = [ pcre zlib lzma ];
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ pcre zlib xz ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://github.com/ggreer/the_silver_searcher/";
     description = "A code-searching tool similar to ack, but faster";
     maintainers = with maintainers; [ madjar ];
diff --git a/pkgs/tools/text/snippetpixie/default.nix b/pkgs/tools/text/snippetpixie/default.nix
index 00261507746..6cd6bdda0d9 100644
--- a/pkgs/tools/text/snippetpixie/default.nix
+++ b/pkgs/tools/text/snippetpixie/default.nix
@@ -1,10 +1,10 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 , nix-update-script
 , meson
 , ninja
 , vala
-, pkgconfig
+, pkg-config
 , wrapGAppsHook
 , appstream
 , desktop-file-utils
@@ -19,26 +19,25 @@
 , ibus
 , json-glib
 , pantheon
-, libwnck3
 , xorg
 }:
 
 stdenv.mkDerivation rec {
   pname = "snippetpixie";
-  version = "1.3.3";
+  version = "1.5.2";
 
   src = fetchFromGitHub {
     owner = "bytepixie";
     repo = pname;
     rev = version;
-    sha256 = "0ml57j6jagqvjlpgn1bcyx08h71kcxalh69y03y2lj84x5ib8qz3";
+    sha256 = "173fm9h7lnhhbg5qbjz40g0fy60dwd2l55mdcc1j8dh73vz96pfr";
   };
 
   nativeBuildInputs = [
     meson
     ninja
     vala
-    pkgconfig
+    pkg-config
     wrapGAppsHook
     appstream
     desktop-file-utils
@@ -55,7 +54,6 @@ stdenv.mkDerivation rec {
     dbus
     ibus
     json-glib
-    libwnck3
     xorg.libXtst
     pantheon.granite
     pantheon.elementary-gtk-theme
@@ -75,7 +73,7 @@ stdenv.mkDerivation rec {
     };
   };
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Your little expandable text snippet helper";
     longDescription = ''
       Your little expandable text snippet helper.
@@ -83,6 +81,8 @@ stdenv.mkDerivation rec {
       Save your often used text snippets and then expand them whenever you type their abbreviation.
 
       For example:- "spr`" expands to "Snippet Pixie rules!"
+
+      For non-accessible applications such as browsers and Electron apps, there's a shortcut (default is Ctrl+`) for opening a search window that pastes the selected snippet.
     '';
     homepage = "https://www.snippetpixie.com";
     license = licenses.gpl2Plus;
diff --git a/pkgs/tools/text/source-highlight/default.nix b/pkgs/tools/text/source-highlight/default.nix
index 7052d9e5a44..6e1a7b24b59 100644
--- a/pkgs/tools/text/source-highlight/default.nix
+++ b/pkgs/tools/text/source-highlight/default.nix
@@ -1,32 +1,39 @@
-{ stdenv, fetchurl, boost }:
+{ lib, stdenv, fetchurl, boost }:
 
-let
-  name = "source-highlight";
+stdenv.mkDerivation rec {
+  pname = "source-highlight";
   version = "3.1.9";
-in
-stdenv.mkDerivation {
-  name = "${name}-${version}";
 
   src = fetchurl {
-    url = "mirror://gnu/src-highlite/${name}-${version}.tar.gz";
+    url = "mirror://gnu/src-highlite/${pname}-${version}.tar.gz";
     sha256 = "148w47k3zswbxvhg83z38ifi85f9dqcpg7icvvw1cm6bg21x4zrs";
   };
 
+  # source-highlight uses it's own binary to generate documentation.
+  # During cross-compilation, that binary was built for the target
+  # platform architecture, so it can't run on the build host.
+  patchPhase = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
+    substituteInPlace Makefile.in --replace "src doc tests" "src tests"
+  '';
+
+  strictDeps = true;
   buildInputs = [ boost ];
 
   configureFlags = [ "--with-boost=${boost.out}" ];
 
   enableParallelBuilding = false;
 
-  meta = {
+  outputs = [ "out" "doc" "dev" ];
+
+  meta = with lib; {
     description = "Source code renderer with syntax highlighting";
+    longDescription = ''
+      GNU Source-highlight, given a source file, produces a document
+      with syntax highlighting.
+    '';
     homepage = "https://www.gnu.org/software/src-highlite/";
-    license = stdenv.lib.licenses.gpl3Plus;
-    platforms = with stdenv.lib.platforms; linux ++ darwin;
-    longDescription =
-      ''
-        GNU Source-highlight, given a source file, produces a document
-        with syntax highlighting.
-      '';
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ SuperSandro2000 ];
   };
 }
diff --git a/pkgs/tools/text/tab/default.nix b/pkgs/tools/text/tab/default.nix
index f7796c8a329..096e0b04c69 100644
--- a/pkgs/tools/text/tab/default.nix
+++ b/pkgs/tools/text/tab/default.nix
@@ -1,19 +1,23 @@
-{ stdenv, fetchFromBitbucket, python2 }:
+{ lib, stdenv, fetchFromBitbucket, python3 }:
 
 stdenv.mkDerivation rec {
-  version = "7.2";
+  version = "8.0";
   pname = "tab";
 
   src = fetchFromBitbucket {
     owner = "tkatchev";
     repo = pname;
     rev = version;
-    sha256 = "1bm15lw0vp901dj2vsqx6yixmn7ls3brrzh1w6zgd1ksjzlm5aax";
+    sha256 = "sha256-RcDvghTiqIdH79khwDIo8PhvmcObmix8WBrHToLwcw4=";
   };
 
-  nativeBuildInputs = [ python2 ];
+  checkInputs = [ python3 ];
 
-  doCheck = true;
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    substituteInPlace Makefile --replace "python2 go2.py" "python go.py"
+  '';
 
   checkTarget = "test";
 
@@ -26,11 +30,11 @@ stdenv.mkDerivation rec {
     runHook postInstall
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Programming language/shell calculator";
     homepage    = "https://tkatchev.bitbucket.io/tab/";
     license     = licenses.boost;
     maintainers = with maintainers; [ mstarzyk ];
-    platforms   = with platforms; linux;
+    platforms   = with platforms; unix;
   };
 }
diff --git a/pkgs/tools/text/transifex-client/default.nix b/pkgs/tools/text/transifex-client/default.nix
index ac10564c9f7..93c2e645309 100644
--- a/pkgs/tools/text/transifex-client/default.nix
+++ b/pkgs/tools/text/transifex-client/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, buildPythonApplication, fetchPypi
+{ lib, buildPythonApplication, fetchPypi
 , python-slugify, requests, urllib3, six, setuptools }:
 
 buildPythonApplication rec {
@@ -23,10 +23,10 @@ buildPythonApplication rec {
   # Requires external resources
   doCheck = false;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://www.transifex.com/";
     license = licenses.gpl2;
     description = "Transifex translation service client";
-    maintainers = [ maintainers.etu ];
+    maintainers = with maintainers; [ ];
   };
 }
diff --git a/pkgs/tools/text/txt2tags/default.nix b/pkgs/tools/text/txt2tags/default.nix
index f70ad1710e2..eb299caade9 100644
--- a/pkgs/tools/text/txt2tags/default.nix
+++ b/pkgs/tools/text/txt2tags/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, python }:
+{ lib, stdenv, fetchurl, python }:
 
 stdenv.mkDerivation rec {
   version = "2.6";
@@ -28,8 +28,8 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "https://txt2tags.org/";
     description = "A KISS markup language";
-    license  = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [ kovirobi ];
-    platforms = with stdenv.lib.platforms; unix;
+    license  = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ kovirobi ];
+    platforms = with lib.platforms; unix;
   };
 }
diff --git a/pkgs/tools/text/ucg/default.nix b/pkgs/tools/text/ucg/default.nix
new file mode 100644
index 00000000000..d81b5a14f09
--- /dev/null
+++ b/pkgs/tools/text/ucg/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, fetchFromGitHub
+, pkg-config
+, autoreconfHook
+, pcre
+, nixosTests
+}:
+
+let
+  pname = "ucg";
+  version = "20190225";
+in stdenv.mkDerivation {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "gvansickle";
+    repo = pname;
+    rev = "c3a67632f1e3f332bfb102f0db167f34a2e42da7";
+    sha256 = "sha256-/wU1PmI4ejlv7gZzZNasgROYXFiDiIxE9BFoCo6+G5Y=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ pcre ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gvansickle/ucg/";
+    description = "Grep-like tool for searching large bodies of source code";
+    longDescription = ''
+      UniversalCodeGrep (ucg) is an extremely fast grep-like tool specialized
+      for searching large bodies of source code. It is intended to be largely
+      command-line compatible with Ack, to some extent with ag, and where
+      appropriate with grep. Search patterns are specified as PCRE regexes.
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = with platforms; unix;
+  };
+
+  passthru.tests = { inherit (nixosTests) ucg; };
+}
diff --git a/pkgs/tools/text/ugrep/default.nix b/pkgs/tools/text/ugrep/default.nix
index 3e225ec3567..17503829e7a 100644
--- a/pkgs/tools/text/ugrep/default.nix
+++ b/pkgs/tools/text/ugrep/default.nix
@@ -1,19 +1,35 @@
-{ stdenv, fetchFromGitHub, boost, bzip2, lz4, pcre2, xz, zlib }:
+{ lib
+, stdenv
+, fetchFromGitHub
+, boost
+, bzip2
+, lz4
+, pcre2
+, xz
+, zlib
+}:
 
 stdenv.mkDerivation rec {
   pname = "ugrep";
-  version = "2.5.3";
+  version = "3.3";
 
   src = fetchFromGitHub {
     owner = "Genivia";
     repo = pname;
     rev = "v${version}";
-    sha256 = "16ly1dz8wxnjk6kc88dl2x0ijmzw5v87fhai9fnardwfmycn7ivc";
+    sha256 = "0qk8rzsll69pf220m6n41giyk3faqvwagml7i2xwgp7pcax607nl";
   };
 
-  buildInputs = [ boost bzip2 lz4 pcre2 xz zlib ];
+  buildInputs = [
+    boost
+    bzip2
+    lz4
+    pcre2
+    xz
+    zlib
+  ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Ultra fast grep with interactive query UI";
     homepage = "https://github.com/Genivia/ugrep";
     maintainers = with maintainers; [ numkem ];
diff --git a/pkgs/tools/text/uni2ascii/default.nix b/pkgs/tools/text/uni2ascii/default.nix
index d6b1215caf3..e2bda04d13f 100644
--- a/pkgs/tools/text/uni2ascii/default.nix
+++ b/pkgs/tools/text/uni2ascii/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   name = "uni2ascii-4.18";
@@ -8,11 +8,11 @@ stdenv.mkDerivation rec {
   };
 
   meta = {
-    license = stdenv.lib.licenses.gpl3;
+    license = lib.licenses.gpl3;
     homepage = "http://billposer.org/Software/uni2ascii.html";
     description = "Converts between UTF-8 and many 7-bit ASCII equivalents and back";
 
-    longDescription = '' 
+    longDescription = ''
     This package provides conversion in both directions between UTF-8
     Unicode and more than thirty 7-bit ASCII equivalents, including
     RFC 2396 URI format and RFC 2045 Quoted Printable format, the
@@ -33,7 +33,7 @@ stdenv.mkDerivation rec {
     It also provides ways of converting non-ASCII characters to
     similar ASCII characters, e.g. by stripping diacritics.
     '';
-    maintainers = with stdenv.lib.maintainers; [ goibhniu ];
-    platforms = stdenv.lib.platforms.linux;
+    maintainers = with lib.maintainers; [ goibhniu ];
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/unoconv/default.nix b/pkgs/tools/text/unoconv/default.nix
index dc9412d3c0e..9f3375c7e41 100644
--- a/pkgs/tools/text/unoconv/default.nix
+++ b/pkgs/tools/text/unoconv/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, python3, libreoffice-unwrapped, asciidoc, makeWrapper
+{ lib, stdenv, fetchFromGitHub, python3, libreoffice-unwrapped, asciidoc, makeWrapper
 # whether to install odt2pdf/odt2doc/... symlinks to unoconv
 , installSymlinks ? true
 }:
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
     sha256 = "1akx64686in8j8arl6vsgp2n3bv770q48pfv283c6fz6wf9p8fvr";
   };
 
-  buildInputs = [ asciidoc makeWrapper ];
+  nativeBuildInputs = [ asciidoc makeWrapper ];
 
   preBuild = ''
     makeFlags=prefix="$out"
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
     make install-links prefix="$out"
   '' else "");
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Convert between any document format supported by LibreOffice/OpenOffice";
     homepage = "http://dag.wieers.com/home-made/unoconv/";
     license = licenses.gpl2;
diff --git a/pkgs/tools/text/unrtf/default.nix b/pkgs/tools/text/unrtf/default.nix
index 752d576701e..3357404a7d3 100644
--- a/pkgs/tools/text/unrtf/default.nix
+++ b/pkgs/tools/text/unrtf/default.nix
@@ -1,22 +1,14 @@
-{ stdenv, fetchurl, fetchpatch, autoconf, automake, libiconv }:
+{ lib, stdenv, fetchurl, autoconf, automake, libiconv }:
 
 stdenv.mkDerivation rec {
   pname = "unrtf";
-  version = "0.21.9";
+  version = "0.21.10";
 
   src = fetchurl {
-    url = "https://www.gnu.org/software/unrtf/${pname}-${version}.tar.gz";
-    sha256 = "1pcdzf2h1prn393dkvg93v80vh38q0v817xnbwrlwxbdz4k7i8r2";
+    url = "https://ftp.gnu.org/gnu/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "1bil6z4niydz9gqm2j861dkxmqnpc8m7hvidsjbzz7x63whj17xl";
   };
 
-  patches = [
-    (fetchpatch {
-      name = "CVE-2016-10091-0001-convert.c-Use-safe-buffer-size-and-snprintf.patch";
-      url = "https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=849705;filename=0001-convert.c-Use-safe-buffer-size-and-snprintf.patch;msg=20";
-      sha256 = "0s0fjvm3zdm9967sijlipfrwjs0h23n2n8fa6f40xxp8y5qq5a0b";
-    })
-  ];
-
   nativeBuildInputs = [ autoconf automake ];
 
   buildInputs = [ libiconv ];
@@ -25,7 +17,7 @@ stdenv.mkDerivation rec {
 
   outputs = [ "out" "man" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A converter from Rich Text Format to other formats";
     longDescription = ''
       UnRTF converts documents in Rich Text Format to other
diff --git a/pkgs/tools/text/untex/default.nix b/pkgs/tools/text/untex/default.nix
index 829c4da3849..55cf01d698f 100644
--- a/pkgs/tools/text/untex/default.nix
+++ b/pkgs/tools/text/untex/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl }:
+{ lib, stdenv, fetchurl }:
 
 stdenv.mkDerivation rec {
   pname = "untex";
@@ -19,7 +19,7 @@ stdenv.mkDerivation rec {
     mkdir -p $out/bin $out/share/man/man1
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A utility which removes LaTeX commands from input";
     homepage = "https://www.ctan.org/pkg/untex";
     license = licenses.gpl1;
diff --git a/pkgs/tools/text/uwc/default.nix b/pkgs/tools/text/uwc/default.nix
new file mode 100644
index 00000000000..14fe74723a3
--- /dev/null
+++ b/pkgs/tools/text/uwc/default.nix
@@ -0,0 +1,24 @@
+{ rustPlatform, lib, fetchFromGitLab }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "uwc";
+  version = "1.0.4";
+
+  src = fetchFromGitLab {
+    owner = "dead10ck";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ywqq9hrrm3frvd2sswknxygjlxi195kcy7g7phwq63j7hkyrn50";
+  };
+
+  cargoSha256 = "04pslga3ff766cpb73n6ivzmqfa0hm19gcla8iyv6p59ddsajh3q";
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Like wc, but unicode-aware, and with per-line mode";
+    homepage = "https://gitlab.com/dead10ck/uwc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ShamrockLee ];
+  };
+}
diff --git a/pkgs/tools/text/vale/default.nix b/pkgs/tools/text/vale/default.nix
index 69390b4d3d3..257b11933b9 100644
--- a/pkgs/tools/text/vale/default.nix
+++ b/pkgs/tools/text/vale/default.nix
@@ -1,22 +1,20 @@
-{ stdenv, buildGoModule, fetchFromGitHub }:
+{ lib, buildGoModule, fetchFromGitHub }:
 
 buildGoModule rec {
   pname = "vale";
-  version = "2.3.3";
+  version = "2.10.4";
 
-  subPackages = [ "." ];
+  subPackages = [ "cmd/vale" ];
   outputs = [ "out" "data" ];
 
   src = fetchFromGitHub {
     owner  = "errata-ai";
     repo   = "vale";
     rev    = "v${version}";
-    sha256 = "13b565l87nm3gpxxhw1bpjx7yqcgf5124k3wh7r149z38xyqc3wk";
+    sha256 = "0gw7b6gvzp2f7la1mb74bg92nd8zk5fiajsihcqpni2a79js1s6y";
   };
 
-  vendorSha256 = null;
-
-  doCheck = false;
+  vendorSha256 = "15r97mpsailsa4ja6mh5wrjcjacppm0vwma9q6znsa2f1x2apc6y";
 
   postInstall = ''
     mkdir -p $data/share/vale
@@ -25,8 +23,8 @@ buildGoModule rec {
 
   buildFlagsArray = [ "-ldflags=-s -w -X main.version=${version}" ];
 
-  meta = with stdenv.lib; {
-    homepage = "https://errata-ai.gitbook.io/vale/";
+  meta = with lib; {
+    homepage = "https://docs.errata.ai/vale/about";
     description = "A syntax-aware linter for prose built with speed and extensibility in mind";
     license = licenses.mit;
     maintainers = [ maintainers.marsam ];
diff --git a/pkgs/tools/text/vgrep/default.nix b/pkgs/tools/text/vgrep/default.nix
new file mode 100644
index 00000000000..edd0416b0ef
--- /dev/null
+++ b/pkgs/tools/text/vgrep/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildGoModule, fetchFromGitHub, go-md2man, installShellFiles }:
+
+buildGoModule rec {
+  pname = "vgrep";
+  version = "2.5.1";
+
+  src = fetchFromGitHub {
+    owner = "vrothberg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "06rnmg6ljj4f1g602wdp2wy9v0m1m0sj6jl6wywyjl8grjqc3vac";
+  };
+
+  vendorSha256 = null;
+
+  buildFlagsArray = [ "-ldflags=-s -w -X main.version=${version}" ];
+
+  nativeBuildInputs = [ go-md2man installShellFiles ];
+
+  postBuild = ''
+    sed -i '/SHELL= /d' Makefile
+    make docs
+    installManPage docs/*.[1-9]
+  '';
+
+  meta = with lib; {
+    description = "User-friendly pager for grep/git-grep/ripgrep";
+    homepage = "https://github.com/vrothberg/vgrep";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/pkgs/tools/text/wdiff/default.nix b/pkgs/tools/text/wdiff/default.nix
index bec7ba8825d..510cf18369e 100644
--- a/pkgs/tools/text/wdiff/default.nix
+++ b/pkgs/tools/text/wdiff/default.nix
@@ -1,22 +1,28 @@
-{ stdenv, fetchurl, texinfo, which }:
+{ lib, stdenv, fetchurl, texinfo, which }:
 
 stdenv.mkDerivation rec {
-  name = "wdiff-1.2.2";
+  pname = "wdiff";
+  version = "1.2.2";
 
   src = fetchurl {
-    url = "mirror://gnu/wdiff/${name}.tar.gz";
+    url = "mirror://gnu/wdiff/${pname}-${version}.tar.gz";
     sha256 = "0sxgg0ms5lhi4aqqvz1rj4s77yi9wymfm3l3gbjfd1qchy66kzrl";
   };
 
+  # for makeinfo
+  nativeBuildInputs = [ texinfo ];
+
   buildInputs = [ texinfo ];
 
   checkInputs = [ which ];
 
-  meta = {
+  strictDeps = true;
+
+  meta = with lib; {
     homepage = "https://www.gnu.org/software/wdiff/";
     description = "Comparing files on a word by word basis";
-    license = stdenv.lib.licenses.gpl3Plus;
-    maintainers = [ stdenv.lib.maintainers.eelco ];
-    platforms = stdenv.lib.platforms.unix;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ eelco SuperSandro2000 ];
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/wgetpaste/default.nix b/pkgs/tools/text/wgetpaste/default.nix
index 9180573541d..a3a7a8bd54a 100644
--- a/pkgs/tools/text/wgetpaste/default.nix
+++ b/pkgs/tools/text/wgetpaste/default.nix
@@ -1,12 +1,12 @@
-{ stdenv, fetchurl, wget, bash }:
+{ lib, stdenv, fetchurl, wget, bash }:
 
 stdenv.mkDerivation rec {
-  version = "2.29";
+  version = "2.30";
   pname = "wgetpaste";
 
   src = fetchurl {
     url = "http://wgetpaste.zlin.dk/${pname}-${version}.tar.bz2";
-    sha256 = "1rp0wxr3zy7y2xp3azaadfghrx7g0m138f9qg6icjxkkz4vj9r22";
+    sha256 = "14k5i6j6f34hcf9gdb9cnvfwscn0ys2dgd73ci421wj9zzqkbv73";
   };
   # currently zsh-autocompletion support is not installed
 
@@ -23,8 +23,8 @@ stdenv.mkDerivation rec {
   meta = {
     description = "Command-line interface to various pastebins";
     homepage = "http://wgetpaste.zlin.dk/";
-    license = stdenv.lib.licenses.publicDomain;
-    maintainers = with stdenv.lib.maintainers; [ qknight domenkozar ];
-    platforms = stdenv.lib.platforms.all;
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.maintainers; [ qknight domenkozar ];
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/wrap/default.nix b/pkgs/tools/text/wrap/default.nix
new file mode 100644
index 00000000000..e228f946a8c
--- /dev/null
+++ b/pkgs/tools/text/wrap/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildGoModule, fetchFromGitHub, fetchpatch, makeWrapper, courier-prime }:
+
+buildGoModule rec {
+  pname = "wrap";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "Wraparound";
+    repo = "wrap";
+    rev = "v${version}";
+    sha256 = "0scf7v83p40r9k7k5v41rwiy9yyanfv3jm6jxs9bspxpywgjrk77";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  vendorSha256 = "03q5a5lm8zj1523gxkbc0y6a3mjj1z2h7nrr2qcz8nlghvp4cfaz";
+
+  patches = [
+    (fetchpatch {
+      name = "courier-prime-variants.patch";
+      url = "https://github.com/Wraparound/wrap/commit/b72c280b6eddba9ec7b3507c1f143eb28a85c9c1.patch";
+      sha256 = "1d9v0agfd7mgd17k4a8l6vr2kyswyfsyq3933dz56pgs5d3jric5";
+    })
+  ];
+
+  postInstall = ''
+    wrapProgram $out/bin/wrap --prefix XDG_DATA_DIRS : ${courier-prime}/share/
+  '';
+
+  meta = with lib; {
+    description = "A Fountain export tool with some extras";
+    homepage = "https://github.com/Wraparound/wrap";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.austinbutler ];
+  };
+}
diff --git a/pkgs/tools/text/xidel/default.nix b/pkgs/tools/text/xidel/default.nix
index fabfdd85710..0996cf944eb 100644
--- a/pkgs/tools/text/xidel/default.nix
+++ b/pkgs/tools/text/xidel/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, dpkg }:
+{ lib, stdenv, fetchurl, dpkg }:
 
 stdenv.mkDerivation rec {
   pname = "xidel";
@@ -37,7 +37,7 @@ stdenv.mkDerivation rec {
     patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/xidel"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Command line tool to download and extract data from html/xml pages";
     homepage = "http://videlibri.sourceforge.net/xidel.html";
     # source contains no license info (AFAICS), but sourceforge says GPLv2
diff --git a/pkgs/tools/text/xml/basex/default.nix b/pkgs/tools/text/xml/basex/default.nix
index 4dcaed16bb8..30482196322 100644
--- a/pkgs/tools/text/xml/basex/default.nix
+++ b/pkgs/tools/text/xml/basex/default.nix
@@ -1,15 +1,16 @@
-{ stdenv, fetchurl, unzip, jre, coreutils, makeDesktopItem }:
+{ lib, stdenv, fetchurl, unzip, jre, coreutils, makeDesktopItem }:
 
 stdenv.mkDerivation rec {
   pname = "basex";
-  version = "8.6.6";
+  version = "9.4.3";
 
   src = fetchurl {
-    url = "http://files.basex.org/releases/${version}/BaseX866.zip";
-    sha256 = "1kws6swisdaa17yhijjvkh2ikwz9rd5cw8mdjvkqw6vlcp1nq6m4";
+    url = "http://files.basex.org/releases/${version}/BaseX${builtins.replaceStrings ["."] [""] version}.zip";
+    hash = "sha256-IZhRg2JcYQXQKU/lYZpLLcsSdjZZO+toY5yvk+RKUCY=";
   };
 
-  buildInputs = [ unzip jre ];
+  nativeBuildInputs = [ unzip ];
+  buildInputs = [ jre ];
 
   desktopItem = makeDesktopItem {
     name = "basex";
@@ -25,23 +26,15 @@ stdenv.mkDerivation rec {
   dontBuild = true;
 
   installPhase = ''
-    mkdir -p "$out"
-    cp -r * "$out"
-
     # Remove Windows batch files (unclutter $out/bin)
-    rm -f "$out"/bin/*.bat
+    rm ./bin/*.bat
 
-    # Move some top-level stuff to $out/share/basex (unclutter $out)
-    mkdir -p "$out/share/basex"
-    mv "$out"/*.txt "$out/share/basex/"
-    mv "$out"/webapp "$out/share/basex/"
+    mkdir -p "$out/share/basex" "$out/share/applications"
 
-    # Remove empty directories
-    rmdir "$out/repo"
-    rmdir "$out/data"
+    cp -R bin etc lib webapp src BaseX.jar "$out"
+    cp -R readme.txt webapp "$out/share/basex"
 
     # Install desktop file
-    mkdir -p "$out/share/applications"
     cp "$desktopItem"/share/applications/* "$out/share/applications/"
 
     # Use substitutions instead of wrapper scripts
@@ -56,7 +49,7 @@ stdenv.mkDerivation rec {
     done
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "XML database and XPath/XQuery processor";
     longDescription = ''
       BaseX is a very fast and light-weight, yet powerful XML database and
@@ -65,7 +58,7 @@ stdenv.mkDerivation rec {
       highly interactive front-end (basexgui). Apart from two local standalone
       modes, BaseX offers a client/server architecture.
     '';
-    homepage = "http://basex.org/";
+    homepage = "https://basex.org/";
     license = licenses.bsd3;
     platforms = platforms.linux;
     maintainers = [ maintainers.bjornfor ];
diff --git a/pkgs/tools/text/xml/html-xml-utils/default.nix b/pkgs/tools/text/xml/html-xml-utils/default.nix
index d4bd40a1199..96aa01abe6d 100644
--- a/pkgs/tools/text/xml/html-xml-utils/default.nix
+++ b/pkgs/tools/text/xml/html-xml-utils/default.nix
@@ -1,17 +1,17 @@
-{ stdenv, fetchurl, curl, libiconv }:
+{ lib, stdenv, fetchurl, curl, libiconv }:
 
 stdenv.mkDerivation rec {
   pname = "html-xml-utils";
-  version = "7.9";
+  version = "8.0";
 
   src = fetchurl {
     url = "https://www.w3.org/Tools/HTML-XML-utils/${pname}-${version}.tar.gz";
-    sha256 = "0gs3xvdbzhk5k12i95p5d4fgkkaldnlv45sch7pnncb0lrpcjsnq";
+    sha256 = "sha256-dJBZkGwzHCx/us7uAkZiRaI3uRvUCN/485bQc0oGCuI=";
   };
 
   buildInputs = [curl libiconv];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Utilities for manipulating HTML and XML files";
     homepage = "http://www.w3.org/Tools/HTML-XML-utils/";
     license = licenses.w3c;
diff --git a/pkgs/tools/text/xml/jing-trang/default.nix b/pkgs/tools/text/xml/jing-trang/default.nix
index dcf83c736cc..542a4709efe 100644
--- a/pkgs/tools/text/xml/jing-trang/default.nix
+++ b/pkgs/tools/text/xml/jing-trang/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, jre_headless, jdk, ant, saxon }:
+{ lib, stdenv, fetchFromGitHub, jre_headless, jdk, ant, saxon }:
 
 stdenv.mkDerivation {
   pname = "jing-trang";
@@ -32,7 +32,7 @@ stdenv.mkDerivation {
     chmod +x "$out"/bin/*
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A RELAX NG validator in Java";
     # The homepage is www.thaiopensource.com, but it links to googlecode.com
     # for downloads and call it the "project site".
diff --git a/pkgs/tools/text/xml/rnv/default.nix b/pkgs/tools/text/xml/rnv/default.nix
index 2bc1b6dddda..1ee3355d105 100644
--- a/pkgs/tools/text/xml/rnv/default.nix
+++ b/pkgs/tools/text/xml/rnv/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, expat }:
+{ lib, stdenv, fetchurl, expat }:
 
 stdenv.mkDerivation rec {
   pname = "rnv";
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ expat ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Relax NG Compact Syntax validator";
     homepage = "http://www.davidashen.net/rnv.html";
     license = licenses.bsd3;
diff --git a/pkgs/tools/text/xml/rxp/default.nix b/pkgs/tools/text/xml/rxp/default.nix
index c0e2ea1c4e2..5940bc6d60f 100644
--- a/pkgs/tools/text/xml/rxp/default.nix
+++ b/pkgs/tools/text/xml/rxp/default.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl} :
+{lib, stdenv, fetchurl} :
 
 stdenv.mkDerivation rec {
   pname = "rxp";
@@ -10,9 +10,9 @@ stdenv.mkDerivation rec {
   };
 
   meta = {
-    license = stdenv.lib.licenses.gpl2Plus;
+    license = lib.licenses.gpl2Plus;
     description = "A validating XML parser written in C";
     homepage = "http://www.cogsci.ed.ac.uk/~richard/rxp.html";
-    platforms = stdenv.lib.platforms.unix;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/xml/xml2/default.nix b/pkgs/tools/text/xml/xml2/default.nix
index 8c341855e68..4c312250bf6 100644
--- a/pkgs/tools/text/xml/xml2/default.nix
+++ b/pkgs/tools/text/xml/xml2/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, pkgconfig, libxml2 }:
+{ lib, stdenv, fetchurl, pkg-config, libxml2 }:
 
 stdenv.mkDerivation {
   name = "xml2-0.5";
@@ -8,10 +8,10 @@ stdenv.mkDerivation {
     sha256 = "01cps980m99y99cnmvydihga9zh3pvdsqag2fi1n6k2x7rfkl873";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ libxml2 ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     homepage = "https://web.archive.org/web/20160515005047/http://dan.egnor.name:80/xml2";
     description = "Tools for command line processing of XML, HTML, and CSV";
     license = licenses.gpl2Plus;
diff --git a/pkgs/tools/text/xml/xmldiff/default.nix b/pkgs/tools/text/xml/xmldiff/default.nix
new file mode 100644
index 00000000000..5814435e111
--- /dev/null
+++ b/pkgs/tools/text/xml/xmldiff/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, lxml
+, six
+}:
+
+buildPythonApplication rec {
+  pname = "xmldiff";
+  version = "2.4";
+
+  src = fetchFromGitHub {
+    owner = "Shoobx";
+    repo = pname;
+    rev = version;
+    hash = "sha256-xqudHYfwOce2C0pcFzId0JDIIC6R5bllmVKsH+CvTdE=";
+  };
+
+  buildInputs = [
+    lxml
+    six
+  ];
+
+  meta = with lib; {
+    homepage = "https://xmldiff.readthedocs.io/en/stable/";
+    description = "A library and command line utility for diffing xml";
+    longDescription = ''
+      xmldiff is a library and a command-line utility for making diffs out of
+      XML. This may seem like something that doesn't need a dedicated utility,
+      but change detection in hierarchical data is very different from change
+      detection in flat data. XML type formats are also not only used for
+      computer readable data, it is also often used as a format for hierarchical
+      data that can be rendered into human readable formats. A traditional diff
+      on such a format would tell you line by line the differences, but this
+      would not be be readable by a human. xmldiff provides tools to make human
+      readable diffs in those situations.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/pkgs/tools/text/xml/xmlformat/default.nix b/pkgs/tools/text/xml/xmlformat/default.nix
index 8dfec26e811..380baa906c2 100644
--- a/pkgs/tools/text/xml/xmlformat/default.nix
+++ b/pkgs/tools/text/xml/xmlformat/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, perl }:
+{ lib, stdenv, fetchurl, perl }:
 stdenv.mkDerivation rec {
   pname = "xmlformat";
   version = "1.04";
@@ -22,7 +22,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "a configurable formatter (or 'pretty-printer') for XML documents";
     homepage = "http://www.kitebird.com/software/xmlformat/";
-    license = stdenv.lib.licenses.bsd3;
-    platforms = stdenv.lib.platforms.all;
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
   };
 }
diff --git a/pkgs/tools/text/xml/xmloscopy/default.nix b/pkgs/tools/text/xml/xmloscopy/default.nix
index 2cd7a580ee3..c915e2c7fc5 100644
--- a/pkgs/tools/text/xml/xmloscopy/default.nix
+++ b/pkgs/tools/text/xml/xmloscopy/default.nix
@@ -43,7 +43,7 @@ stdenv.mkDerivation rec {
       --set PATH "${spath}"
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "wtf is my docbook broken?";
     homepage = "https://github.com/grahamc/xmloscopy";
     license = licenses.mit;
diff --git a/pkgs/tools/text/xml/xmlstarlet/default.nix b/pkgs/tools/text/xml/xmlstarlet/default.nix
index 7d3471f9561..e179c3153e1 100644
--- a/pkgs/tools/text/xml/xmlstarlet/default.nix
+++ b/pkgs/tools/text/xml/xmlstarlet/default.nix
@@ -1,14 +1,14 @@
-{ stdenv, fetchurl, pkgconfig, libxml2, libxslt }:
+{ lib, stdenv, fetchurl, pkg-config, libxml2, libxslt }:
 
 stdenv.mkDerivation rec {
   name = "xmlstarlet-1.6.1";
-  
+
   src = fetchurl {
     url = "mirror://sourceforge/xmlstar/${name}.tar.gz";
     sha256 = "1jp737nvfcf6wyb54fla868yrr39kcbijijmjpyk4lrpyg23in0m";
   };
 
-  nativeBuildInputs = [ pkgconfig ];
+  nativeBuildInputs = [ pkg-config ];
   buildInputs = [ libxml2 libxslt ];
 
   preConfigure =
@@ -27,7 +27,7 @@ stdenv.mkDerivation rec {
   meta = {
     description = "A command line tool for manipulating and querying XML data";
     homepage = "http://xmlstar.sourceforge.net/";
-    license = stdenv.lib.licenses.mit;
-    platforms = stdenv.lib.platforms.unix;
+    license = lib.licenses.mit;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/xml/xpf/default.nix b/pkgs/tools/text/xml/xpf/default.nix
index 6999a4a64d0..29170394d1e 100644
--- a/pkgs/tools/text/xml/xpf/default.nix
+++ b/pkgs/tools/text/xml/xpf/default.nix
@@ -1,20 +1,20 @@
-{stdenv, fetchurl, python2, libxml2}:
+{lib, stdenv, fetchurl, python2, libxml2}:
 
 assert libxml2.pythonSupport == true;
 
 stdenv.mkDerivation {
   name = "xpf-0.2";
-  
+
   src = fetchurl {
     url = "http://tarballs.nixos.org/xpf-0.2.tar.gz";
     sha256 = "0ljx91w68rnh4871c0xlq2whlmhqz8dr39wcdczfjjpniqz1fmpz";
   };
-  
+
   buildInputs = [ python2 libxml2 ];
 
   meta = {
     description = "XML Pipes and Filters - command line tools for manipulating and querying XML data";
     homepage = "http://www.cs.uu.nl/wiki/bin/view/Martin/XmlPipesAndFilters";
-    platforms = stdenv.lib.platforms.unix;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/tools/text/xsv/default.nix b/pkgs/tools/text/xsv/default.nix
index b17dba7a127..303b38d65c2 100644
--- a/pkgs/tools/text/xsv/default.nix
+++ b/pkgs/tools/text/xsv/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, rustPlatform, Security }:
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
 
 rustPlatform.buildRustPackage rec {
   pname = "xsv";
@@ -11,11 +11,11 @@ rustPlatform.buildRustPackage rec {
     sha256 = "17v1nw36mrarrd5yv4xd3mpc1d7lvhd5786mqkzyyraf78pjg045";
   };
 
-  cargoSha256 = "1q59nvklh5r2mrsz656z6js3j2l6rqyhfz6l0yq28df5kyahk91b";
+  cargoSha256 = "1bh60zgflaa5n914irkr4bpq3m4h2ngcj6bp5xx1qj112dwgvmyb";
 
-  buildInputs = stdenv.lib.optional stdenv.isDarwin Security;
+  buildInputs = lib.optional stdenv.isDarwin Security;
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "A fast CSV toolkit written in Rust";
     homepage = "https://github.com/BurntSushi/xsv";
     license = with licenses; [ unlicense /* or */ mit ];
diff --git a/pkgs/tools/text/xurls/default.nix b/pkgs/tools/text/xurls/default.nix
index 6c8e5520d74..fa5418b4581 100644
--- a/pkgs/tools/text/xurls/default.nix
+++ b/pkgs/tools/text/xurls/default.nix
@@ -1,4 +1,4 @@
-{ buildGoPackage, stdenv, fetchFromGitHub }:
+{ buildGoPackage, lib, fetchFromGitHub }:
 
 buildGoPackage rec {
   version = "2.2.0";
@@ -14,7 +14,7 @@ buildGoPackage rec {
   goPackagePath = "mvdan.cc/xurls/v2";
   subPackages = [ "cmd/xurls" ];
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Extract urls from text";
     homepage = "https://github.com/mvdan/xurls";
     maintainers = with maintainers; [ koral ];
diff --git a/pkgs/tools/text/yaml-merge/default.nix b/pkgs/tools/text/yaml-merge/default.nix
index b91d24e1137..7c4ecc49df5 100644
--- a/pkgs/tools/text/yaml-merge/default.nix
+++ b/pkgs/tools/text/yaml-merge/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, pythonPackages }:
+{ lib, stdenv, fetchFromGitHub, pythonPackages }:
 
 stdenv.mkDerivation {
   name= "yaml-merge-2016-02-16";
@@ -18,11 +18,11 @@ stdenv.mkDerivation {
     wrapPythonPrograms
   '';
 
-  meta = with stdenv.lib; {
+  meta = with lib; {
     description = "Merge YAML data files";
     homepage = "https://github.com/abbradar/yaml-merge";
     license = licenses.bsd2;
-    platforms = platforms.linux;
+    platforms = platforms.unix;
     maintainers = with maintainers; [ abbradar ];
   };
 }
diff --git a/pkgs/tools/text/zimreader/default.nix b/pkgs/tools/text/zimreader/default.nix
deleted file mode 100644
index 0b947ee5db3..00000000000
--- a/pkgs/tools/text/zimreader/default.nix
+++ /dev/null
@@ -1,38 +0,0 @@
-{ stdenv, fetchFromGitHub, fetchpatch, automake, autoconf, libtool
-, zimlib, cxxtools, tntnet
-}:
-
-stdenv.mkDerivation {
-  name = "zimreader-0.92";
-
-  src = fetchFromGitHub {
-    owner = "wikimedia";
-    repo = "openzim";
-    rev = "r1.3"; # there multiple tools with different version in the repo
-    sha256 = "0x529137rxy6ld64xqa6xmn93121ripxvkf3sc7hv3wg6km182sw";
-  };
-
-  patchFlags = [ "-p2" ];
-  patches = [
-    (fetchpatch {
-      name = "zimreader_tntnet221.patch";
-      url = "https://github.com/wikimedia/openzim/compare/r1.3...juliendehos:3ee5f11eaa811284d340451e6f466529c00f6ef2.patch";
-      sha256 = "0rc5n20svyyndqh7hsynjyblfraphgi0f6khw6f5jq89w9i1j1hd";
-    })
-  ];
-
-  enableParallelBuilding = true;
-  buildInputs = [ automake autoconf libtool zimlib cxxtools tntnet ];
-  setSourceRoot = ''
-    sourceRoot=$(echo */zimreader)
-  '';
-  preConfigure = "./autogen.sh";
-
-  meta = {
-    description = "A tool to serve ZIM files using HTTP";
-    homepage = "http://git.wikimedia.org/log/openzim";
-    license = stdenv.lib.licenses.gpl2;
-    maintainers = with stdenv.lib.maintainers; [ robbinch juliendehos ];
-    platforms = [ "x86_64-linux" ];
-  };
-}
diff --git a/pkgs/tools/text/zimwriterfs/default.nix b/pkgs/tools/text/zimwriterfs/default.nix
index 8362280c2fa..9a7e495df2b 100644
--- a/pkgs/tools/text/zimwriterfs/default.nix
+++ b/pkgs/tools/text/zimwriterfs/default.nix
@@ -1,15 +1,15 @@
-{ stdenv
+{ lib, stdenv
 , fetchFromGitHub
 
 , autoconf
 , automake
 , libtool
-, pkgconfig
+, pkg-config
 
 , file
 , icu
 , gumbo
-, lzma
+, xz
 , xapian
 , zimlib
 , zlib
@@ -26,8 +26,8 @@ stdenv.mkDerivation rec {
     sha256 = "1vkrrq929a8s3m5rri1lg0l2vd0mc9n2fsb2z1g88k4n4j2l6f19";
   };
 
-  nativeBuildInputs = [ automake autoconf libtool pkgconfig ];
-  buildInputs = [ file icu gumbo lzma zimlib zlib xapian ];
+  nativeBuildInputs = [ automake autoconf libtool pkg-config ];
+  buildInputs = [ file icu gumbo xz zimlib zlib xapian ];
   setSourceRoot = ''
     sourceRoot=$(echo */zimwriterfs)
   '';
@@ -36,8 +36,8 @@ stdenv.mkDerivation rec {
   meta = {
     description = "A console tool to create ZIM files";
     homepage = "http://git.wikimedia.org/log/openzim";
-    maintainers = with stdenv.lib.maintainers; [ robbinch ];
-    license = stdenv.lib.licenses.gpl3;
-    platforms = with stdenv.lib.platforms; [ linux ];
+    maintainers = with lib.maintainers; [ robbinch ];
+    license = lib.licenses.gpl3;
+    platforms = with lib.platforms; [ linux ];
   };
 }
diff --git a/pkgs/tools/text/zoekt/default.nix b/pkgs/tools/text/zoekt/default.nix
new file mode 100644
index 00000000000..cb270f69ad1
--- /dev/null
+++ b/pkgs/tools/text/zoekt/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, git
+}:
+buildGoModule {
+  pname = "zoekt";
+  version = "unstable-2021-03-17";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "zoekt";
+    rev = "d92b3b80e582e735b2459413ee7d9dbbf294d629";
+    sha256 = "JdORh6bRdHsAYwsmdKY0OUavXfu3HsPQFkQjRBkcMBo=";
+  };
+
+  vendorSha256 = "d+Xvl6fleMO0frP9qr5tZgkzsnH5lPELwmEQEspD22M=";
+
+  checkInputs = [
+    git
+  ];
+
+  meta = with lib; {
+    description = "Fast trigram based code search";
+    homepage = "https://github.com/google/zoekt";
+    license = licenses.asl20;
+    maintainers = teams.determinatesystems.members;
+  };
+}
diff --git a/pkgs/tools/text/zstxtns-utils/default.nix b/pkgs/tools/text/zstxtns-utils/default.nix
new file mode 100644
index 00000000000..362f2fca84d
--- /dev/null
+++ b/pkgs/tools/text/zstxtns-utils/default.nix
@@ -0,0 +1,39 @@
+{ coreutils
+, fetchurl
+, gnugrep
+, lib
+, makeWrapper
+, moreutils
+, stdenvNoCC
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "zstxtns-utils";
+  version = "0.0.3";
+
+  src = fetchurl {
+    url = "https://ytrizja.de/distfiles/zstxtns-utils-${version}.tar.gz";
+    sha256 = "I/Gm7vHUr29NClYWQ1kwu8HrNZpdLXfE/nutTNoqcdU=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+    install -D -t $out/bin zstxtns-merge zstxtns-unmerge
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    wrapProgram $out/bin/zstxtns-merge --set PATH "${lib.makeBinPath [coreutils gnugrep moreutils]}"
+    wrapProgram $out/bin/zstxtns-unmerge --set PATH "${lib.makeBinPath [coreutils gnugrep]}"
+  '';
+
+  meta = with lib; {
+    description = "utilities to deal with text based name service databases";
+    homepage = "https://ytrizja.de/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ zseri ];
+    platforms = platforms.all;
+  };
+}