From c3f17945103e7913435e8ccfb89b53d891ff83e8 Mon Sep 17 00:00:00 2001
From: Caleb Maclennan <caleb@alerque.com>
Date: Wed, 19 Aug 2015 15:26:20 +0300
Subject: [PATCH] Allow tmux session name to be passed as env var

For normal usage this change should be a NOOP. However it enables the
use case where the user might want to predefine what session gets
connected to when the shell is launched. Running `zsh` will still net
you a connection to the last used tmux session or a new one named
"zprezto" if none exists. However `env tmux_session=myname zsh` will
connect you specifically to a session called 'myname' including creating
it if it doesn't exist.

This is particularly useful in window managers where a key binding might
open a terminal with a predefined session or even show a list of current
sessions and open a new terminal connected to that session.

The default session name may still be set using zstyle as documented.
---
 modules/tmux/README.md | 11 +++++++++++
 modules/tmux/init.zsh  | 11 ++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/modules/tmux/README.md b/modules/tmux/README.md
index 0738d7cf..9ce1416f 100644
--- a/modules/tmux/README.md
+++ b/modules/tmux/README.md
@@ -33,6 +33,17 @@ You can change the default session name with:
 zstyle ':prezto:module:tmux:session' name '<YOUR DEFAULT SESSION NAME>'
 ```
 
+A session name may also be specified in an environment variable before ZSH runs.
+
+```sh
+env tmux_session='<SESSION NAME>' zsh
+```
+
+This can be useful for example to connect to a specific remote session
+connecting via SSH (note that OpenSSH needs to be configured to pass on that
+environment variable). It can also be used with window managers to set keybindings
+that launch terminals with specific sessions.
+
 With `auto-start` enabled, you may want to control how multiple sessions are
 managed. The `destroy-unattached` option of tmux controls if the unattached
 sessions must be kept alive, making sessions available for later use, configured
diff --git a/modules/tmux/init.zsh b/modules/tmux/init.zsh
index fb56d076..8b086d5b 100644
--- a/modules/tmux/init.zsh
+++ b/modules/tmux/init.zsh
@@ -29,16 +29,17 @@ if [[ -z "$TMUX" && -z "$EMACS" && -z "$VIM" && -z "$INSIDE_EMACS" && -z "$VSCOD
 ); then
   tmux start-server
 
-  # Create a 'prezto' session if no session has been defined in tmux.conf.
-  if ! tmux has-session 2> /dev/null; then
-    zstyle -s ':prezto:module:tmux:session' name tmux_session || tmux_session='prezto'
+  # Make sure we have a session to connect to, either named via an environment
+  # variable, the default style as documented, or 'prezto' for last resort
+  [[ -z "${tmux_session:// }" ]] && zstyle -s ':prezto:module:tmux:session' name tmux_session || : ${tmux_session:=prezto}
+  if ! tmux has-session -t "$tmux_session" 2> /dev/null; then
     tmux \
       new-session -d -s "$tmux_session" \; \
       set-option -t "$tmux_session" destroy-unattached off &> /dev/null
   fi
 
-  # Attach to the 'prezto' session or to the last session used. (detach first)
-  exec tmux $_tmux_iterm_integration attach-session -d
+  # Attach to the session name requested in an environment variable or the default (detaching others)
+  exec tmux $_tmux_iterm_integration attach-session -t "$tmux_session" -d
 fi
 
 #