Nix-shell + tmux workflow---preserve environment variables from shellHook?

Hello,

I’m trying to figure out the best way to use tmux with nix-shell --pure so I don’t have to use multiple terminals and download dependencies multiple times.

The reason for the multiple dependency downloads is a very specific node setup that I can’t seem to get right with node2nix because of some webpack + electron issues. This means each invocation of nix-shell runs npm install and then the shellHook sets some environment variables that I need tmux to recognize.

Does anyone have any recommendations for how to get tmux to pick up the whole environment setup by nix-shell whenever I open a new pane? I don’t have a lot of tmux experience and after a good deal of searching I’m still a bit lost when it comes to making it play nicely with this nix-shell workflow.

Thanks.

5 Likes

Hello i know it’s been a while, but in case of other people or stumbling on this problem.
I did a script bash that is invoke in the shellHook of a nix-shell to launch my tmux configuration and the option that let me inherit the shell variable was the -L

> tmux -L # make it able to inherit the shell variable

It’s the first line that help, i can’t really explain why, i am new to tmux and was just trying to finaly make it works.

Example tmux-script.sh:

#!/bin/sh

session="SessionName"
sessioExist=$(tmux list-sessions | grep $session)

if [ "$sessioExist" != "" ]; then
    tmux kill-session -t $session
fi
window=0

tmux -L # make it able to inherit the shell variable

tmux new-session -d -s $session
tmux set -g mouse on
tmux set -g mouse-select-window on

tmux split-window -h -t $session:$window.0
tmux split-window -v -t $session:$window.0
tmux split-window -v -t $session:$window.1

tmux attach-session -t $session

And it is called for example like this in a nix file:

stdenv.mkDerivation {
  name = "nodejs-env";
  [do all the things you need in your shell]
shellHook = ''
    	./tmux-script.sh
  '';
}