This oh-my-zsh plugin lets you use zsh as the default shell in a nix-shell
environment. It's recommended to use this in conjunction with nix-zsh-completions.
In theory all you need to do to use zsh
in nix-shell
is to set NIX_BUILD_SHELL
to zsh
. Unfortunatly nix assumes that the NIX_BUILD_SHELL
is a bash variant and passes bash specific arguments to the shell. To fix this, we need a shim that translates these arguments.
The information that nix-shell
exposes to the environment is also pretty sparse. It would be nice to know what derivations are included in the current environment for example to display them in the shells prompt.
Clone this repository into your plugins directory
git clone https://github.com/chisui/zsh-nix-shell.git $ZSH_CUSTOM/plugins/nix-shell
Then add nix-shell
to the plugins list in ~/.zshrc
.
If you have installed zsh
using nix
the plugins directory is readonly since it's inside of the nix store.
To get around this you can override the ZSH_CUSTOM
directory.
Simply create a writable directory inside of your home directory (e.g. $HOME/.config/oh-my-zsh
) and set ZSH_CUSTOM
to that path inside of your .zshrc
file.
ZSH_CUSTOM=$HOME/.config/oh-my-zsh
After that simply install for oh-my-zsh
as normal.
Clone this repository and add the following to your ~/.zshrc
.
source /path/to/zsh-nix-shell/nix-shell.plugin.zsh
Add this repository to the plugins
list of your configurations:
{
programs.zsh = {
enable = true;
enableCompletion = true;
plugins = [
{
name = "zsh-nix-shell";
file = "nix-shell.plugin.zsh";
src = pkgs.fetchFromGitHub {
owner = "chisui";
repo = "zsh-nix-shell";
rev = "v0.8.0";
sha256 = "1lzrn0n4fxfcgg65v0qhnj7wnybybqzs4adz7xsrkgmcsr0ii8b7";
};
}
];
};
}
It should be possible to install this plugin through most zsh
plugin managers. If the one of your choice is not supported, feel free to open an issue or even better create a pull request.
On MacOS you have to have a bash
with version 4
or greater. See Issue 14
Use nix-shell
as you did before.
Commands run with --run
or --command
argument are executed in nix-shell
s default shell. In the case of --command
you are put into a zsh
shell afterwards.
If you use the --pure
flag the interactive shell will be the default shell.
If you are inside a nix-shell
environment IN_NIX_SHELL
will be set. The value will be impure
or pure
if you specified --pure
.
The packages
argument is passed through as NIX_SHELL_PACKAGES
to the shell.
If this Variable is empty nix-shell
was called for a specific nix expression which is stored in the name
environment variable.
These variables can now be used inside a theme to customize the prompt. Take a look at this variant of the agnoster theme for an example of how this might look.
Shell hooks are supported in general. Since they are executed inside of bash
before the zsh
shell is spawned they aren't executed in the same environment. This means that things like aliases won't work.
The normal zsh dotfiles are sourced after the nix-shell is opened. This means that you have to take into account that these files may override variables set by nix-shell.
Please do. Pull requests welcome.