A Nix developer tool leveraging the rnix
Nix parser for intelligent
documentation search and tags generation.
ctags
that can generate a vim compatible tags
file for Nix source```
$ nix-env -i nix-doc
$ nix-env -i -f https://github.com/lf-/nix-doc/archive/main.tar.gz
$ cargo install --locked nix-doc ```
To install the Nix plugin on a single-user installation of Nix, add this to
your Nix config at ~/.config/nix/nix.conf
after installing nix-doc
with
nix-env
:
plugin-files = /home/YOURUSERNAMEHERE/.nix-profile/lib/libnix_doc_plugin.so
For a multi-user installation, you will need to do something like this:
$ sudo ln -s $(nix-build '<nixpkgs>' -A nix-doc) /opt/nix-doc
and then put this into your /etc/nix/nix.conf
:
plugin-files = /opt/nix-doc/lib/libnix_doc_plugin.so
Link the plugin file using
nix.extraOptions
:
```nix { pkgs, ... }:
{ nix.extraOptions = '' plugin-files = ${pkgs.nix-doc}/lib/libnixdocplugin.so '';
environment.systemPackages = with pkgs; [ nix-doc ]; } ```
nix-doc <command>
nix-doc tags [dir]
Generates a vim-compatible tags
file in the current directory, for all nix
script files below the directory dir
.
Example:
``` nixpkgs$ nix-doc tags
nixpkgs$ file tags tags: Exuberant Ctags tag file, ASCII text, with very long lines (502)
nixpkgs$ vim -t callCabal2nix ```
nix-doc search <regex> [dir]
Example output:
``
nixpkgs$ nix-doc search callPackage
Call the package function in the file
fn' with the required
arguments automatically. The function is called with the
arguments args', but any missing arguments are obtained from
autoArgs'. This function is intended to be partially
parameterised, e.g.,
callPackage = callPackageWith pkgs; pkgs = { libfoo = callPackage ./foo.nix { }; libbar = callPackage ./bar.nix { }; };
If the libbar' function expects an argument named
libfoo', it is
automatically passed as an argument. Overrides or missing
arguments can be supplied in `args', e.g.
libbar = callPackage ./bar.nix { libfoo = null; enableX11 = true; }; callPackageWith = autoArgs: fn: args: ...
───────────────────────────────────────────── Like callPackage, but for a function that returns an attribute set of derivations. The override function is added to the individual attributes. callPackagesWith = autoArgs: fn: args: ...
───────────────────────────────────────────── Similar to callPackageWith/callPackage, but without makeOverridable callPackageWith = autoArgs: fn: args: ...
```
The Nix plugin provides three builtins:
builtins.doc f
Prints the documentation of the function f
to the screen. Returns null
.
builtins.getDoc f
Returns the documentation message for the function f
as a string (exactly the
same output as builtins.doc
, just as a string).
builtins.unsafeGetLambdaPos
A backport of NixOS/Nix#3912. Returns
the position of a lambda, in a similar fashion to unsafeGetAttrPos
for
attributes.
``` » nix repl Welcome to Nix version 2.3.7. Type :? for help.
nix-repl> n=import
nix-repl> builtins.doc n.lib.callPackageWith
Call the package function in the file fn' with the required
arguments automatically. The function is called with the
arguments
args', but any missing arguments are obtained from
`autoArgs'. This function is intended to be partially
parameterised, e.g.,
callPackage = callPackageWith pkgs;
pkgs = {
libfoo = callPackage ./foo.nix { };
libbar = callPackage ./bar.nix { };
};
If the libbar' function expects an argument named
libfoo', it is
automatically passed as an argument. Overrides or missing
arguments can be supplied in `args', e.g.
libbar = callPackage ./bar.nix {
libfoo = null;
enableX11 = true;
};
func = autoArgs: fn: args: ...
null ```
This repository is set up as a Cargo workspace with the plugin and the command line tool/library as parts.
It is not really possible to build the plugin outside a Nix shell since Nix does not provide libraries outside the shell environment. As such, it is suggested to use a nix shell while developing the plugin as follows:
``` $ nix-shell [nix-shell]$ cargo build [nix-shell]$ cargo check [nix-shell]$ cargo test
```
Everyone is expected to follow the code of conduct while participating in this project.