Updates
authorJoerg Jaspert <joerg@debian.org>
Mon, 4 Mar 2019 10:56:37 +0000 (11:56 +0100)
committerJoerg Jaspert <joerg@debian.org>
Mon, 4 Mar 2019 10:56:37 +0000 (11:56 +0100)
.dotfiles/net:ganneff.de/user:joerg/.dput.cf
.dotfiles/net:ganneff.de/user:joerg/.gitconfig
.gtkrc-2.0 [deleted file]
.tmux.conf
bin/gtkfix
bin/iceweasel [deleted symlink]
bin/tm

index 61b8f5c..35dc66b 100644 (file)
@@ -3,7 +3,7 @@
 
 [DEFAULT]
 login = joerg
-method = scp
+method = sftp
 hash = md5
 allow_unsigned_uploads = 0
 run_lintian = 0
@@ -14,15 +14,22 @@ post_upload_command =
 pre_upload_command =
 #passive_ftp = 0
 # default_host_main = ftp-master-secure
-default_host_main = ftp-master
+default_host_main = ssh-upload
 default_host_non-us = non-us-secure
 
 [ftp-master]
-fqdn = ftp-master.debian.org
-incoming = /pub/UploadQueue/
+fqdn = ssh.upload.debian.org
+incoming = /srv/upload.debian.org/UploadQueue/
+login = *
+run_dinstall = 0
+meta = debian
+
+[dcutdm]
+fqdn = ftp.upload.debian.org
+incoming = /srv/upload.debian.org/UploadQueue/
 login = anonymous
 run_dinstall = 0
-method = ftp
+meta = debian
 
 [debconf]
 fqdn = cmburns.debconf.org
index 7ca0f38..0b6cd7b 100644 (file)
         insteadOf = git+ssh://git.debian.org/git/d-i/
 [url "git+ssh://git.debian.org/git/d-i/"]
         pushInsteadOf = git+ssh://git.debian.org/git/d-i/
+[github]
+       user = joerg@debian.org
+[filter "lfs"]
+       process = git-lfs filter-process
+       required = true
+       clean = git-lfs clean -- %f
+       smudge = git-lfs smudge -- %f
+[gitlab "salsa.debian.org/api/v4"]
+       user = joerg
diff --git a/.gtkrc-2.0 b/.gtkrc-2.0
deleted file mode 100644 (file)
index 611da9e..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-# SolarizedDark, based on SolarizedLight, based on Solarizetheme, based on Murrina333\r
-# Solarized by Ethan Schoonver http://ethanschoonover.com/solarized\r
-# ~/usr/share/themes/SolarizedDark/gtk-2.0/gtkrc\r
-\r
-gtk-icon-theme-name = "GNOME"\r
-gtk-theme-name = "SolarizedDark"\r
-gtk-font-name = "Inconsolata 12"\r
-\r
-gtk_color_scheme = "fg_color:#fdf6e3\nbg_color:#002b36\nbase_color:#073642\ntext_color:#fdf6e3\nselected_bg_color:#586e75\nselected_fg_color:#fdf6e3"\r
-\r
-gtk-button-images = 1\r
-gtk-icon-sizes = "panel-menu=16,16:panel=16,16:gtk-button=16,16:gtk-large-toolbar=16,16"\r
-gtk-menu-images = 1\r
-style "theme-default"\r
-{\r
-  GtkButton      ::default_border    = { 0, 0, 0, 0 }\r
-  GtkRange       ::trough_border     = 0\r
-  GtkPaned       ::handle_size       = 6\r
-  GtkRange       ::slider_width      = 16\r
-  GtkRange       ::stepper_size      = 0\r
-\r
-  GtkScrollbar   ::min_slider_length = 30\r
-  GtkCheckButton ::indicator_size    = 10\r
-  GtkRadioButton ::indicator_size    = 10\r
-  GtkMenuBar     ::internal-padding  = 0\r
-  GtkTreeView    ::expander_size     = 14\r
-  GtkExpander    ::expander_size     = 16\r
-  GtkScale       ::slider-length     = 16\r
-\r
-\r
-\r
-  xthickness = 1\r
-  ythickness = 1\r
-\r
-  fg[NORMAL]        = @fg_color\r
-  fg[PRELIGHT]      = @selected_fg_color\r
-  fg[SELECTED]      = @selected_fg_color\r
-  fg[ACTIVE]        = darker (@fg_color)\r
-  fg[INSENSITIVE]   = @fg_color\r
-\r
-  bg[NORMAL]        = @bg_color\r
-  bg[PRELIGHT]      = @selected_bg_color\r
-  bg[SELECTED]      = @selected_bg_color\r
-  bg[INSENSITIVE]   = @bg_color\r
-  bg[ACTIVE]        = @bg_color\r
-\r
-  base[NORMAL]      =  @base_color\r
-  base[ACTIVE]      =  shade (0.7,@base_color)\r
-  base[PRELIGHT]    =  @base_color\r
-  base[SELECTED]    =  @selected_bg_color\r
-  base[INSENSITIVE] =  shade (1.025,@bg_color)\r
-\r
-  text[NORMAL]      =  @text_color\r
-  text[ACTIVE]      =  @text_color\r
-  text[PRELIGHT]    =  @text_color\r
-  text[SELECTED]    =  darker (@selected_fg_color)\r
-  text[INSENSITIVE] =  @fg_color\r
-\r
-  engine "murrine"\r
-  {\r
-    menuitemstyle       = 2\r
-    # apparently this is deprecated\r
-    #scrollbar_color     = "#cb4b16"\r
-    scrollbarstyle      = 0\r
-    contrast            = 1.0\r
-    menustyle           = 0\r
-    glazestyle          = 0\r
-    menubarstyle        = 0\r
-    menubaritemstyle    = 0\r
-    menuitemstyle       = 0\r
-    listviewheaderstyle = 0\r
-    listviewstyle       = 1\r
-    roundness           = 0\r
-    animation           = TRUE\r
-  }\r
-}\r
-\r
-\r
-style "theme-wide" = "theme-default"\r
-{\r
-  xthickness = 2\r
-  ythickness = 2\r
-}\r
-\r
-style "theme-wider" = "theme-default"\r
-{\r
-  xthickness = 2\r
-  ythickness = 2\r
-}\r
-\r
-style "theme-entry" = "theme-wider"\r
-{\r
-    bg[SELECTED] = @selected_bg_color\r
-}\r
-\r
-style "theme-button" = "theme-wider"\r
-{\r
-  xthickness      = 0\r
-  ythickness      = 0\r
-  #bg[NORMAL]      = @bg_color\r
-  #bg[INSENSITIVE] = @bg_color\r
-  #bg[PRELIGHT]    = @bg_color\r
-  #bg[ACTIVE]      = @bg_color\r
-  text[PRELIGHT]  = @selected_fg_color\r
-}\r
-\r
-\r
-style "theme-notebook" = "theme-wide"\r
-{\r
-  #bg[NORMAL]      = @bg_color\r
-  #bg[INSENSITIVE] = @bg_color\r
-  bg[SELECTED]    = @selected_bg_color\r
-}\r
-\r
-style "theme-tasklist" = "theme-default"\r
-{\r
-  xthickness = 4\r
-  ythickness = 2\r
-}\r
-\r
-style "theme-menu" = "theme-default"\r
-{\r
-  xthickness = 2\r
-  ythickness = 2\r
-  bg[NORMAL] = @bg_color\r
-}\r
-\r
-style "theme-menu-item" = "theme-default"\r
-{\r
-  ythickness      = 3\r
-  fg[NORMAL]      = @fg_color\r
-  fg[PRELIGHT]    = @selected_fg_color\r
-  fg[INSENSITIVE] = @selected_fg_color\r
-  bg[SELECTED]    = @selected_bg_color\r
-}\r
-\r
-\r
-style "theme-menubar" = "theme-default"\r
-{\r
-  bg[NORMAL] = @bg_color\r
-}\r
-\r
-style "theme-menubar-item"\r
-{\r
-  ythickness   = 2\r
-  fg[PRELIGHT] = @selected_fg_color\r
-}\r
-\r
-style "theme-tree" = "theme-default"\r
-{\r
-  xthickness = 2\r
-  ythickness = 2\r
-  #bg[NORMAL] = @selected_fg_color\r
-}\r
-\r
-style "theme-frame-title" = "theme-default"\r
-{\r
-  fg[NORMAL] = @fg_color\r
-}\r
-\r
-style "theme-tooltips" = "theme-default"\r
-{\r
-  xthickness = 2\r
-  ythickness = 2\r
-  bg[NORMAL] = @bg_color\r
-}\r
-\r
-style "theme-progressbar" = "theme-wide"\r
-{\r
-  xthickness   = 2\r
-  ythickness   = 2\r
-  #fg[PRELIGHT] = "#ff0000" # @bg_color\r
-  bg[NORMAL]   = @bg_color # outline of progressbar\r
-  bg[SELECTED] = @selected_bg_color # progressbar color\r
-}\r
-\r
-style "theme-scrollbar" = "theme-default"\r
-{\r
-}\r
-\r
-style "theme-combo" = "theme-button"\r
-{\r
-}\r
-\r
-style "metacity-frame"\r
-{\r
-  bg[SELECTED] = @selected_bg_color\r
-  fg[SELECTED] = @selected_fg_color\r
-}\r
-\r
-class "MetaFrames" style "metacity-frame"\r
-class "GtkWindow"  style "metacity-frame"\r
-\r
-\r
-style "inactivetext2"\r
-{\r
-  engine "mist"\r
-  {\r
-  }\r
-}\r
-\r
-widget_class "*.<GtkMenuItem>.*" style "inactivetext2"\r
-\r
-style "panel"\r
-{\r
-  xthickness   = 2\r
-  ythickness   = 2\r
-  bg[NORMAL]   = @bg_color\r
-  fg[NORMAL]   = @fg_color\r
-  text[NORMAL] = @fg_color\r
-}\r
-\r
-style "panelbuttons"\r
-{\r
-  xthickness   = 0\r
-  ythickness   = 0\r
-  bg[NORMAL]   = @bg_color\r
-  bg[ACTIVE]   = @bg_color\r
-  bg[SELECTED] = @selected_bg_color\r
-  bg[PRELIGHT] = @bg_color\r
-  fg[NORMAL]   = @fg_color\r
-  fg[ACTIVE]   = @selected_fg_color\r
-  fg[PRELIGHT] = @selected_fg_color\r
-}\r
-\r
-style "chrome-gtk-frame"\r
-{\r
-  ChromeGtkFrame::frame-color = @bg_color\r
-  ChromeGtkFrame::inactive-frame-color = darker(@bg_color)\r
-}\r
-\r
-style "default"\r
-{\r
-}\r
-\r
-class "ChromeGtkFrame" style "chrome-gtk-frame"\r
-class "*firefox*" style "default"\r
-\r
-class "*Panel*"                       style "panel"\r
-widget_class "*Panel*GtkToggleButton" style "panelbuttons"\r
-widget_class "*Panel*Button"          style "panelbuttons"\r
-widget_class "*Panel*b*"              style "panelbuttons"\r
-\r
-class "GtkWidget"      style "theme-default"\r
-class "GtkButton"      style "theme-button"\r
-class "GtkScale"       style "theme-button"\r
-class "GtkCombo"       style "theme-button"\r
-class "GtkRange"       style "theme-wide"\r
-class "GtkFrame"       style "theme-wide"\r
-class "GtkMenu"        style "theme-menu"\r
-class "GtkEntry"       style "theme-entry"\r
-class "GtkMenuItem"    style "theme-menu-item"\r
-class "GtkNotebook"    style "theme-notebook"\r
-class "GtkProgressBar" style "theme-progressbar"\r
-class "GtkScale"       style "theme-scrollbar"\r
-class "*MenuBar*"      style "theme-menubar"\r
-\r
-widget_class "*MenuItem.*" style "theme-menu-item"\r
-widget_class "*MenuBar.*"  style "theme-menubar-item"\r
-\r
-widget_class "*.GtkComboBox.GtkButton" style "theme-combo"\r
-widget_class "*.GtkCombo.GtkButton"    style "theme-combo"\r
-\r
-widget_class "*.tooltips.*.GtkToggleButton" style "theme-tasklist"\r
-widget "gtk-tooltips"                       style "theme-tooltips"\r
-\r
-widget_class "*.GtkTreeView.GtkButton" style "theme-tree"\r
-widget_class "*.GtkCTree.GtkButton"    style "theme-tree"\r
-widget_class "*.GtkList.GtkButton"     style "theme-tree"\r
-widget_class "*.GtkCList.GtkButton"    style "theme-tree"\r
-widget_class "*.GtkFrame.GtkLabel"     style "theme-frame-title"\r
-\r
-widget_class "*.GtkNotebook.*.GtkEventBox" style "theme-notebook"\r
-widget_class "*.GtkNotebook.*.GtkViewport" style "theme-notebook"\r
-\r
-gtk-key-theme-name = "Emacs"\r
index 686710c..f8a6512 100644 (file)
@@ -236,12 +236,12 @@ bind-key C set status-left "#{pane_start_command}"
 bind-key C-C set status-left '#[fg=colour14,bold]%d-%m-%y %H:%M:%S'
 
 # Enable utf8
-set -g utf8 on
+#set -g utf8 on
 
 # Instruct tmux to treat top-bit-set characters in the status-left and
 # status-right strings as UTF-8; notably, this is important for wide
 # characters.  This option defaults to off.
-set -g status-utf8 on
+#set -g status-utf8 on
 
 set-window-option -g window-status-format ' #{?pane_synchronized, SYNC:,}#P###I:#W#F'
 set-window-option -g window-status-current-format ' #{?pane_synchronized, SYNC:,}#P###I:#W#F'
index 576b55d..911db9e 100755 (executable)
@@ -9,13 +9,18 @@ else
 fi
 
 # Minified path
-PATH=/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin:/usr/bin/X11:/usr/games
-# Special case one thing: iceweasel
-if [[ "$0" =~ iceweasel ]]; then
+PATH=/opt/firefox:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin:/usr/bin/X11:/usr/games
+# Special case one thing: browsers
+if [[ "$0" =~ firefox ]]; then
     _JAVA_AWT_WM_NONREPARENTING=1; export _JAVA_AWT_WM_NONREPARENTING
     AWT_TOOLKIT=MToolkit; export AWT_TOOLKIT
     wmname LG3D
     eatmydata  "$@"
 else
-    $cmd "${@:2}"
+    if [[ "$0" =~ chromium ]]; then
+        ARG="--force-device-scale-factor=1.1"
+    else
+        ARG=""
+    fi
+    $cmd ${ARG} "${@:2}"
 fi
diff --git a/bin/iceweasel b/bin/iceweasel
deleted file mode 120000 (symlink)
index 6ff8f49..0000000
+++ /dev/null
@@ -1 +0,0 @@
-gtkfix
\ No newline at end of file
diff --git a/bin/tm b/bin/tm
index 2cfc333..b532c31 100755 (executable)
--- a/bin/tm
+++ b/bin/tm
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (C) 2011, 2012, 2013, 2014 Joerg Jaspert <joerg@debian.org>
+# Copyright (C) 2011, 2012, 2013, 2014, 2016 Joerg Jaspert <joerg@debian.org>
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -64,6 +64,9 @@ declare -r TMSESSHOST=${TMSESSHOST:-"true"}
 # Allow to globally define a custom ssh command line.
 TMSSHCMD=${TMSSHCMD:-"ssh"}
 
+# Debug output
+declare -r DEBUG=${DEBUG:-"false"}
+
 # Save the last argument, it may be used (traditional style) for
 # replacing
 args=$#
@@ -79,12 +82,16 @@ if [[ -f ${HOME}/.tmux.conf ]]; then
 else
     bindex=0
 fi
-declare -r TMWIN=${TMWIN:-$bindex}
+declare TMWIN=${TMWIN:-$bindex}
 unset bindex
 
 ########################################################################
 # Nothing below here to configure
 
+# Should we group the session to another? Set to true if -g on
+# commandline
+GROUPSESSION=false
+
 # Should we open another session, even if we already have one with
 # this name? (Ie. second multisession to the same set of hosts)
 # This is either set by the getopts option -n or by having -n
@@ -123,7 +130,8 @@ function usage() {
     echo "tmux helper by Joerg Jaspert <joerg@ganneff.de>"
     echo "There are two ways to call it. Traditional and \"getopts\" style."
     echo "Traditional call as: $0 CMD [host]...[host]"
-    echo "Getopts call as: $0 [-s host] [-m hostlist] [-l] [-n] [-h] [-c config] [-e]"
+    echo "Getopts call as: $0 [-s host] [-m hostlist] [-k name] [-l] [-n] [-h] [-c config] [-e]"
+    echo "Note that traditional and getopts can be mixed, sometimes."
     echo ""
     echo "Traditional:"
     echo "CMD is one of"
@@ -132,7 +140,9 @@ function usage() {
     echo " ms          Open multi ssh sessions to hosts, synchronizing input"
     echo "             To open a second session to the same set of hosts put a"
     echo "             -n in front of ms"
-    echo " \$anything  Either plain tmux session with name of \$anything or"
+    echo " k           Kill a session. Note that this needs the exact session name"
+    echo "             as shown by tm ls"
+    echo " \$anything   Either plain tmux session with name of \$anything or"
     echo "             session according to TMDIR file"
     echo ""
     echo "Getopts style:"
@@ -141,6 +151,10 @@ function usage() {
     echo "-m hostlist  Open multi ssh sessions to hosts, synchronizing input"
     echo "             Due to the way getopts works, hostlist must be enclosed in \"\""
     echo "-n           Open a second session to the same set of hosts"
+    echo "-g           Group session - attach to an existing session, but keep seperate"
+    echo "             window control"
+    echo "-k name      Kill a session. Note that this needs the exact session name"
+    echo "             as shown by tm ls"
     echo "-c config    Setup session according to TMDIR file"
     echo "-e SESSION   Use existion session named SESSION"
     echo "-r REPLACE   Value to use for replacing in session files"
@@ -180,6 +194,11 @@ function usage() {
     echo "      so it may not make much sense there, unless using a session file that contains"
     echo "      solely of LIST commands."
     echo ""
+    echo "NOTE: Session files can include any existing environment variable at any point (but"
+    echo "      only one per line). Those get replaced during tm execution time with the actual"
+    echo "      value of the environment variable. Common usage is $HOME, but any existing var"
+    echo "      works fine."
+    echo ""
     echo "Environment variables recognized by this script:"
     echo "TMPDIR     - Where tmux stores its session information"
     echo "             DEFAULT: If unset: /tmp"
@@ -203,6 +222,7 @@ function usage() {
     echo "             This can be just the command or any option one wishes to have"
     echo "             everywhere."
     echo "             DEFAULT: ssh"
+    echo "DEBUG      - Show debug output (remember to redirect it to a file)"
     echo ""
     exit 42
 }
@@ -226,7 +246,7 @@ function ssh_sessname() {
         local one=$1
         # get rid of first argument (s|ms), we don't want to sort this
         shift
-        local sess=$(for i in $*; do echo $i; done | sort | tr '\n' ' ')
+        local sess=$(for i in $@; do echo $i; done | sort | tr '\n' ' ')
         sess="${one} ${sess% *}"
     else
         # no sorting wanted
@@ -240,21 +260,33 @@ function setup_command_aliases() {
     local command
     local SESNAME
     SESNAME="tmlscm$$"
-    # Debian Bug #718777 - tmux needs a session to have lscm work
-    tmux new-session -d -s ${SESNAME} -n "check" "sleep 3"
+    if [[ ${TMUXMAJOR} -lt 2 ]] || [[ ${TMUXMINOR} -lt 2 ]]; then
+        # Starting tmux 2.2, this is no longer needed
+        # Debian Bug #718777 - tmux needs a session to have lscm work
+        tmux new-session -d -s ${SESNAME} -n "check" "sleep 3"
+    fi
     for command in $(tmux list-commands|awk '{print $1}'); do
-        eval "$(echo "tm_$command() { tmux $command \"\$@\" >/dev/null; }")"
+        eval "tm_$command() { tmux $command \"\$@\" >/dev/null; }"
     done
-    tmux kill-session -t ${SESNAME} || true
+    if [[ ${TMUXMAJOR} -lt 2 ]] || [[ ${TMUXMINOR} -lt 2 ]]; then
+        tmux kill-session -t ${SESNAME} || true
+    fi
 }
 
 # Run a command (function) after replacing variables
 function do_cmd() {
-    local cmd=$@
+    local cmd=$*
+    cmd1=${cmd%% *}
+    if [[ ${cmd1} =~ ^# ]]; then
+        return
+    elif  [[ ${cmd1} =~ new-window ]]; then
+        TMWIN=$(( TMWIN + 1 ))
+    fi
+
     cmd=${cmd//SESSION/$SESSION}
     cmd=${cmd//TMWIN/$TMWIN}
-    cmd1=${cmd%% *}
     cmd=${cmd/$cmd1 /}
+    debug $cmd1 $cmd
     eval tm_$cmd1 $cmd
 }
 
@@ -262,19 +294,21 @@ function do_cmd() {
 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.
     local IFS="
 "
     # Fill an array with our config
-    TMDATA=( $(cat "${TMDIR}/$1" | sed -e "s/++TMREPLACETM++/${TMREPARG}/g") )
+    if [[ -n ${TMDATA[@]:-""} ]] && [[ ${#TMDATA[@]} -gt 0 ]]; then
+        olddata=("${TMDATA[@]}")
+    fi
+
+    TMDATA=( $(sed -e "s/++TMREPLACETM++/${TMREPARG}/g" "${TMDIR}/$1") )
     # Restore IFS
     IFS=${OLDIFS}
 
-    SESSION=$(clean_session ${TMDATA[0]})
+    SESSION=${SESSION:-$(clean_session ${TMDATA[0]})}
 
     if [ "${TMDATA[1]}" != "NONE" ]; then
         TMOPTS=${TMDATA[1]}
@@ -289,28 +323,31 @@ function own_config() {
     # the list of hosts from elsewhere. So if one does, we exec the
     # command given, then append the output to TMDATA - while deleting
     # the actual line with LIST in.
-
     local TMPDATA=$(mktemp -u -p ${TMPDIR} .tmux_tm_XXXXXXXXXX)
     trap "rm -f ${TMPDATA}" EXIT ERR HUP INT QUIT TERM
-
     local index=0
     while [[ ${index} -lt ${#workdata[@]} ]]; do
         if [[ "${workdata[${index}]}" =~ ^LIST\ (.*)$ ]]; then
             # printf -- 'workdata: %s\n' "${workdata[@]}"
             local cmd=${BASH_REMATCH[1]}
+            if [[ ${cmd} =~ \$\{([0-9a-zA-Z_]+)\} ]]; then
+                repvar=${BASH_REMATCH[1]}
+                reptext=${!repvar}
+                cmd=${cmd//\$\{$repvar\}/$reptext}
+            fi
             echo "Line ${index}: Fetching hostnames using provided shell command '${cmd}', please stand by..."
 
             $( ${cmd} >| "${TMPDATA}" )
-
             # Set IFS to be NEWLINE only, not also space/tab, the list may have ssh options
             # and what not, so \n is our seperator, not more.
             IFS="
 "
-            out=( $(cat "${TMPDATA}") )
+            out=( $(tr -d '\r' < "${TMPDATA}" ) )
+
             # Restore IFS
             IFS=${OLDIFS}
 
-            workdata=( "${workdata[@]}" "${out[@]}" )
+            workdata+=( "${out[@]}" )
             unset workdata[${index}]
             unset out
             # printf -- 'workdata: %s\n' "${workdata[@]}"
@@ -321,7 +358,15 @@ function own_config() {
     done
     rm -f "${TMPDATA}"
     trap - EXIT ERR HUP INT QUIT TERM
-    TMDATA=( "${TMDATA[@]:0:2}" "${workdata[@]}"  )
+    debug "TMDATA: ${TMDATA[@]}"
+    debug "olddata: ${olddata[@]:-''}"
+    if [[ -n ${olddata[@]:-""} ]]; then
+        TMDATA=( "${olddata[@]}" "${workdata[@]}" )
+    else
+        TMDATA=( "${TMDATA[@]:0:2}" "${workdata[@]}"  )
+    fi
+    declare -r TMDATA=( "${TMDATA[@]}" )
+    debug "TMDATA now ${TMDATA[@]}"
 }
 
 # Simple overview of running sessions
@@ -334,6 +379,16 @@ function list_sessions() {
     fi
 }
 
+# We either have a debug function that shows output, or one that
+# plainly returns
+if [[ ${DEBUG} == true ]]; then
+        eval "debug() { >&2 echo \$* ; }"
+else
+        eval "debug() { return ; }"
+fi
+
+setup_command_aliases
+
 ########################################################################
 # MAIN work follows here
 # Check the first cmdline parameter, we might want to prepare something
@@ -342,8 +397,8 @@ case ${cmdline} in
         list_sessions
         exit 0
         ;;
-    s|ms)
-        # Yay, we want ssh to a remote host - or even a multi session setup
+    s|ms|k)
+        # Yay, we want ssh to a remote host - or even a multi session setup - or kill one
         # So we have to prepare our session name to fit in what tmux (and shell)
         # allow us to have. And so that we can reopen an existing session, if called
         # with the same hosts again.
@@ -352,7 +407,7 @@ case ${cmdline} in
         shift
         ;;
     -*)
-        while getopts "lnhs:m:c:e:r:" OPTION; do
+        while getopts "lnhs:m:c:e:r:k:g:" OPTION; do
             case ${OPTION} in
                 l) # ls
                     list_sessions
@@ -363,6 +418,11 @@ case ${cmdline} in
                     declare -r cmdline=s
                     shift
                     ;;
+                k) # kill session
+                    SESSION=$(ssh_sessname s ${OPTARG})
+                    declare -r cmdline=k
+                    shift
+                    ;;
                 m) # ms (needs hostnames in "")
                     SESSION=$(ssh_sessname ms ${OPTARG})
                     declare -r cmdline=ms
@@ -373,6 +433,7 @@ case ${cmdline} in
                     ;;
                 e) # existing session name
                     SESSION=$(clean_session ${OPTARG})
+                    shift
                     ;;
                 n) # new session even if same name one already exists
                     DOUBLENAME=true
@@ -380,6 +441,11 @@ case ${cmdline} in
                 r) # replacement arg
                     TMREPARG=${OPTARG}
                     ;;
+                g) # Group session, not simple attach
+                    declare -r GROUPSESSION=true
+                    SESSION=$(clean_session ${OPTARG})
+                    shift
+                    ;;
                 h)
                     usage
                     ;;
@@ -401,7 +467,9 @@ case ${cmdline} in
                 usage
             fi
         elif [ -r "${TMDIR}/${cmdline}" ]; then
-            own_config $1
+            for arg in "$@"; do
+                own_config ${arg}
+            done
         else
             # Not a config file, so just session name.
             SESSION=${cmdline}
@@ -409,9 +477,15 @@ case ${cmdline} in
         ;;
 esac
 
+havesession="false"
+if tmux has-session -t ${SESSION} 2>/dev/null; then
+    havesession="true"
+fi
+declare -r havesession
+
 # And now check if we would end up with a doubled session name.
 # If so add something "random" to the new name, like our pid.
-if [[ ${DOUBLENAME} == true ]] && tmux has-session -t ${SESSION} 2>/dev/null; then
+if [[ ${DOUBLENAME} == true ]] && [[ ${havesession} == true ]]; then
     # Session exist but we are asked to open another one,
     # so adjust our session name
     if [[ ${#TMDATA} -eq 0 ]] && [[ ${SESSION} =~ ([ms]+)_(.*) ]]; then
@@ -428,35 +502,36 @@ else
 fi
 
 # We only do special work if the SESSION does not already exist.
-if ! tmux has-session -t ${SESSION} 2>/dev/null; then
+if [[ ${cmdline} != k ]] && [[ ${havesession} == false ]]; then
     # In case we want some extra things...
     # Check stupid users
     if [ $# -lt 1 ]; then
         usage
     fi
+    tm_pane_error="create pane failed: pane too small"
     case ${cmdline} in
         s)
             # The user wants to open ssh to one or more hosts
-            tmux new-session -d -s ${SESSION} -n "${1}" "${TMSSHCMD} ${1}"
+            do_cmd new-session -d -s ${SESSION} -n "${1}" "'${TMSSHCMD} ${1}'"
             # We disable any automated renaming, as that lets tmux set
             # the pane title to the process running in the pane. Which
             # means you can end up with tons of "bash". With this
             # disabled you will have panes named after the host.
-            tmux set-window-option -t ${SESSION} automatic-rename off >/dev/null
+            do_cmd set-window-option -t ${SESSION} automatic-rename off >/dev/null
             # If we have at least tmux 1.7, allow-rename works, such also disabling
             # any rename based on shell escape codes.
             if [ ${TMUXMINOR//[!0-9]/} -ge 7 ] || [ ${TMUXMAJOR//[!0-9]/} -gt 1 ]; then
-                tmux set-window-option -t ${SESSION} allow-rename off >/dev/null
+                do_cmd set-window-option -t ${SESSION} allow-rename off >/dev/null
             fi
             shift
             count=2
             while [ $# -gt 0 ]; do
-                tmux new-window -d -t ${SESSION}:${count} -n "${1}" "${TMSSHCMD} ${1}"
-                tmux set-window-option -t ${SESSION}:${count} automatic-rename off >/dev/null
+                do_cmd new-window -d -t ${SESSION}:${count} -n "${1}" "${TMSSHCMD} ${1}"
+                do_cmd set-window-option -t ${SESSION}:${count} automatic-rename off >/dev/null
                 # If we have at least tmux 1.7, allow-rename works, such also disabling
                 # any rename based on shell escape codes.
                 if [ ${TMUXMINOR//[!0-9]/} -ge 7 ] || [ ${TMUXMAJOR//[!0-9]/} -gt 1 ]; then
-                    tmux set-window-option -t ${SESSION}:${count} allow-rename off >/dev/null
+                    do_cmd set-window-option -t ${SESSION}:${count} allow-rename off >/dev/null
                 fi
                 count=$(( count + 1 ))
                 shift
@@ -466,34 +541,39 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
             # We open a multisession window. That is, we tile the window as many times
             # as we have hosts, display them all and have the user input send to all
             # of them at once.
-            tmux new-session -d -s ${SESSION} -n "Multisession" "${TMSSHCMD} ${1}"
+            do_cmd new-session -d -s ${SESSION} -n "Multisession" "'${TMSSHCMD} ${1}'"
             shift
             while [ $# -gt 0 ]; do
-                tmux split-window -d -t ${SESSION}:${TMWIN} "${TMSSHCMD} ${1}"
-                # 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
+                set +e
+                output=$(do_cmd split-window -d -t ${SESSION}:${TMWIN} "'${TMSSHCMD} ${1}'" 2>&1)
+                ret=$?
+                set -e
+                if [[ ${ret} -ne 0 ]] && [[ ${output} == ${tm_pane_error} ]]; then
+                    # No more space -> have tmux redo the
+                    # layout, so all windows are evenly sized.
+                    do_cmd select-layout -t ${SESSION}:${TMWIN} main-horizontal >/dev/null
+                    # And dont shift parameter away
+                    continue
+                fi
                 shift
             done
             # Now synchronize them
-            tmux set-window-option -t ${SESSION}:${TMWIN} synchronize-pane >/dev/null
+            do_cmd 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
+            do_cmd select-layout -t ${SESSION}:${TMWIN} tiled >/dev/null
             ;;
         *)
             # Whatever string, so either a plain session or something from our tmux.d
             if [ -z "${TMDATA}" ]; then
                 # the easy case, just a plain session name
-                tmux new-session -d -s ${SESSION}
+                do_cmd 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]}"
+                        do_cmd new-session -d -s ${SESSION} -n "'${TMDATA[0]}'"
                     else
                         do_cmd ${TMDATA[2]}
                     fi
@@ -505,31 +585,49 @@ if ! tmux has-session -t ${SESSION} 2>/dev/null; then
                     done
                 else
                     # So lets start with the "first" line, before dropping into a loop
-                    tmux new-session -d -s ${SESSION} -n "${TMDATA[0]}" "${TMSSHCMD} ${TMDATA[2]}"
+                    do_cmd new-session -d -s ${SESSION} -n "${TMDATA[0]}" "'${TMSSHCMD} ${TMDATA[2]}'"
 
                     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} "${TMSSHCMD} ${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
+                        set +e
+                        output=$(do_cmd split-window -d -t ${SESSION}:${TMWIN} "'${TMSSHCMD} ${TMDATA[$index]}'" 2>&1)
+                        set -e
+                        if [[ ${output} =~ ${tm_pane_error} ]]; then
+                            # No more space -> have tmux redo the
+                            # layout, so all windows are evenly sized.
+                            do_cmd select-layout -t ${SESSION}:${TMWIN} main-horizontal >/dev/null
+                            # And again, don't increase index
+                            continue
+                        fi
                         (( index++ ))
                     done
                     # Now synchronize them
-                    tmux set-window-option -t ${SESSION}:${TMWIN} synchronize-pane >/dev/null
+                    do_cmd 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
+                    do_cmd select-layout -t ${SESSION}:${TMWIN} tiled >/dev/null
                 fi
             fi
             ;;
     esac
     # Build up new session, ensure we start in the first window
-    tmux select-window -t ${SESSION}:${TMWIN}
+    do_cmd select-window -t ${SESSION}:${TMWIN}
+elif [[ ${cmdline} == k ]]; then
+    # So we are asked to kill a session
+    tokill=${SESSION//k_/}
+    do_cmd kill-session -t ${tokill}
+    exit 0
 fi
 
-# And last, but not least, attach to it
-tmux ${TMOPTS} attach -t ${SESSION}
+# If we should group our session or not
+if [[ ${GROUPSESSION} == true ]]; then
+    # Grouping means opening a new session, but sharing the sessions with
+    # another session (existing and new windows). But window control is separate.
+    sesname="$$_${SESSION}"
+    tmux ${TMOPTS} new-session -s ${sesname} -t ${SESSION}
+    tmux ${TMOPTS} kill-session -t ${sesname}
+else
+    # Do not group, just attach
+    tmux ${TMOPTS} attach -t ${SESSION}
+fi