Add the possibility of a free-form config file supporting *any* tmux command
authorJoerg Jaspert <joerg@ganneff.de>
Wed, 31 Jul 2013 12:32:44 +0000 (14:32 +0200)
committerJoerg Jaspert <joerg@ganneff.de>
Wed, 31 Jul 2013 12:32:44 +0000 (14:32 +0200)
.dotfiles/net:cms.fra.dlh.de/host:linws03/.tmux.d/ace.cfg [new file with mode: 0644]
bin/tm

diff --git a/.dotfiles/net:cms.fra.dlh.de/host:linws03/.tmux.d/ace.cfg b/.dotfiles/net:cms.fra.dlh.de/host:linws03/.tmux.d/ace.cfg
new file mode 100644 (file)
index 0000000..bcb9e81
--- /dev/null
@@ -0,0 +1,8 @@
+ace
+NONE
+new-session -d -s SESSION -n ace "ssh acemaster"
+split-window -d -t SESSION:TMWIN "ssh aceslave"
+set-window-option -t SESSION:TMWIN automatic-rename off
+set-window-option -t SESSION:TMWIN allow-rename off
+set-window-option -t SESSION:TMWIN synchronize-pane
+select-layout -t SESSION:TMWIN tiled
diff --git a/bin/tm b/bin/tm
index 1db3332..998fdb5 100755 (executable)
--- a/bin/tm
+++ b/bin/tm
@@ -107,6 +107,9 @@ declare -r OLDIFS=${IFS}
 # To save session file data
 TMDATA=""
 
+# Freeform .cfg file or other session file?
+TMSESCFG=""
+
 ########################################################################
 function usage() {
     echo "tmux helper by Joerg Jaspert <joerg@ganneff.de>"
@@ -135,13 +138,28 @@ function usage() {
     echo ""
     echo ""
     echo "TMDIR file:"
-    echo "Each file in \$TMDIR defines a tmux session."
-    echo "Filename is the commandline option \$anything"
-    echo "Content is defined as:"
+    echo "Each file in \$TMDIR defines a tmux session. There are two types of files,"
+    echo "those without an extension and those with the extension \".cfg\" (no \"\")."
+    echo "The filename corresponds to the commandline \$anything (or -c)."
+    echo ""
+    echo "Content of extensionless files is defined as:"
     echo "  First line: Session name"
-    echo "  Second line: extra tmux options"
+    echo "  Second line: extra tmux commandline options"
     echo "  Any following line: A hostname to open a shell with in the normal"
-    echo "  ssh syntax. (ie [user@]hostname)"
+    echo "                      ssh syntax. (ie [user@]hostname)"
+    echo ""
+    echo "Content of .cfg files is defined as:"
+    echo "  First line: Session name"
+    echo "  Second line: extra tmux commandline options"
+    echo "  Third line: The new-session command to use. Place NONE here if you want plain"
+    echo "              defaults, though that may mean just a shell. Otherwise put the full"
+    echo "              new-session command with all options you want here."
+    echo "  Any following line: Any tmux command you can find in the tmux manpage."
+    echo "              You should ensure that commands arrive at the right tmux session / window."
+    echo "              To help you with this, there are some variables available which you"
+    echo "              can use, they are replaced with values right before commands are executed:"
+    echo "              SESSION - replaced with the session name"
+    echo "              TMWIN   - see below for explanation of TMWIN Environment variable"
     echo ""
     echo "Environment variables recognized by this script:"
     echo "TMPDIR     - Where tmux stores its session information"
@@ -191,8 +209,30 @@ function ssh_sessname() {
     clean_session ${sess}
 }
 
+# Setup functions for all tmux commands
+function setup_command_aliases() {
+    local command
+    for command in $(tmux list-commands|awk '{print $1}'); do
+        eval "$(echo "tm_$command() { tmux $command \"\$@\" >/dev/null; }")"
+    done
+}
+
+# Run a command (function) after replacing variables
+function do_cmd() {
+    local cmd=$@
+    cmd=${cmd//SESSION/$SESSION}
+    cmd=${cmd//TMWIN/$TMWIN}
+    cmd1=${cmd%% *}
+    cmd=${cmd/$cmd1 /}
+    eval tm_$cmd1 $cmd
+}
+
 # Use a configuration file to setup the tmux parameters/session
 function own_config() {
+    if [[ ${1} =~ .cfg$ ]]; then
+        TMSESCFG="free"
+        setup_command_aliases
+    fi
     # Set IFS to be NEWLINE only, not also space/tab, as our input files
     # are \n seperated (one entry per line) and lines may well have spaces
     IFS="
@@ -371,25 +411,41 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
                 tmux new-session -d -s ${SESSION}
             else
                 # data in our data array, the user wants his own config
+                if [[ ${TMSESCFG} = free ]]; then
+                    if [[ ${TMDATA[2]} = NONE ]]; then
+                        # We have a free form config where we get the actual tmux commands
+                        # supplied by the user, so just issue them after creating the session.
+                        tmux new-session -d -s ${SESSION} -n "${TMDATA[0]}"
+                    else
+                        do_cmd ${TMDATA[2]}
+                    fi
+                    tmcount=${#TMDATA[@]}
+                    index=3
+                    while [ ${index} -lt ${tmcount} ]; do
+                        do_cmd ${TMDATA[$index]}
+                        (( index++ ))
+                    done
+                else
+                    # So lets start with the "first" line, before dropping into a loop
+                    tmux new-session -d -s ${SESSION} -n "${TMDATA[0]}" "ssh ${TMDATA[2]}"
 
-                # So lets start with the "first" line, before dropping into a loop
-                tmux new-session -d -s ${SESSION} -n "${TMDATA[0]}" "ssh ${TMDATA[2]}"
-
-                tmcount=${#TMDATA[@]}
-                index=3
-                while [ ${index} -lt ${tmcount} ]; do
-                    tmux split-window -d -t ${SESSION}:${TMWIN} "ssh ${TMDATA[$index]}"
-                    # Always have tmux redo the layout, so all windows are evenly sized.
-                    # Otherwise you quickly end up with tmux telling you there is no
-                    # more space available for tiling - and also very different amount
-                    # of visible space per host.
-                    tmux select-layout -t ${SESSION}:${TMWIN} main-horizontal >/dev/null
-                    (( index++ ))
-                done
-                # Now synchronize them
-                tmux set-window-option -t ${SESSION}:${TMWIN} synchronize-pane >/dev/null
-                # And set a final layout which ensures they all have about the same size
-                tmux select-layout -t ${SESSION}:${TMWIN} tiled >/dev/null
+                    tmcount=${#TMDATA[@]}
+                    index=3
+                    while [ ${index} -lt ${tmcount} ]; do
+                        # List of hostnames, open a new connection per line
+                        tmux split-window -d -t ${SESSION}:${TMWIN} "ssh ${TMDATA[$index]}"
+                        # Always have tmux redo the layout, so all windows are evenly sized.
+                        # Otherwise you quickly end up with tmux telling you there is no
+                        # more space available for tiling - and also very different amount
+                        # of visible space per host.
+                        tmux select-layout -t ${SESSION}:${TMWIN} main-horizontal >/dev/null
+                        (( index++ ))
+                    done
+                    # Now synchronize them
+                    tmux set-window-option -t ${SESSION}:${TMWIN} synchronize-pane >/dev/null
+                    # And set a final layout which ensures they all have about the same size
+                    tmux select-layout -t ${SESSION}:${TMWIN} tiled >/dev/null
+                fi
             fi
             ;;
     esac