#!/bin/bash # # A lightweight session manager. # Open a work session, which might consist of VIM, tmux, etc sessions. # # Parameters NAME="$0" BASENAME="`basename $0`" CONFIG="$HOME/.config/session" CUSTOM="$CONFIG/custom" IGNORE="$CONFIG/ignore" # Check if a given program is not being ignored by configuration function __session_not_ignored { if [ -z "$1" ]; then return 1 fi if [ ! -z "$UNIGNORE" ]; then if echo "$UNIGNORE" | grep -q " $1 "; then return 0 else return 1 fi fi if [ ! -e "$IGNORE" ]; then return 0 fi if grep -q "^$1$" $IGNORE; then return 1 fi return 0 } # Query for program sessions function __session_query { # Custom if __session_not_ignored custom && [ -d "$CUSTOM" ]; then ls -1 $CUSTOM fi # VIM if __session_not_ignored vim && [ -e "$HOME/.local/share/vim/sessions" ]; then ls -1 $HOME/.local/share/vim/sessions | sed -e 's/\.vim//g' fi # Tmux if __session_not_ignored tmux && [ -d "$HOME/.tmux" ]; then ls -1 $HOME/.tmux fi # Screen #if __session_not_ignored screen && [ -d "$HOME/.screen" ]; then # ls -1 $HOME/.screen #fi # Luakit if __session_not_ignored luakit && [ -d "$HOME/.local/share/luakit/sessions" ]; then ls -1 $HOME/.local/share/luakit/sessions fi # Qutebrowser if __session_not_ignored qutebrowser && [ -d "$HOME/.local/share/qutebrowser/sessions" ]; then ls -1 $HOME/.local/share/qutebrowser/sessions | sed -e 's/.yml$//' fi # Chromium if __session_not_ignored chromium && [ -d "$HOME/.config/chromium-profiles" ]; then ls -1 $HOME/.config/chromium-profiles fi # Firefox if __session_not_ignored firefox && [ -d "$HOME/.mozilla/firefox/profiles" ]; then ls -1 $HOME/.mozilla/firefox/profiles fi } # List available sessions function __session_list { n="0" __session_query | sort | uniq | while read session; do echo -en "$n. $session:" # Custom if __session_not_ignored custom && [ -e "$CUSTOM/$session" ]; then echo -n " custom" #else # echo " -" fi # Check VIM session if __session_not_ignored vim && [ -e "$HOME/.local/share/vim/sessions/$session.vim" ]; then echo -n " vim" #else # echo " -" fi # Check tmux session if __session_not_ignored tmux && [ -e "$HOME/.tmux/$session" ]; then echo -n " tmux" #else # echo " -" fi # Screen if __session_not_ignored screen && [ -e "$HOME/.screen/$session" ]; then echo -n " screen" #else # echo " -" fi # Luakit if __session_not_ignored luakit && [ -e "$HOME/.local/share/luakit/sessions/$session" ]; then echo -n " luakit" #else # echo " -" fi # Qutebrowser if __session_not_ignored qutebrowser && [ -e "$HOME/.local/share/qutebrowser/sessions/$session.yml" ]; then echo -n " qutebrowser" #else # echo " -" fi # Chromium if __session_not_ignored chromium && [ -d "$HOME/.config/chromium-profiles/$session" ]; then echo -n " chromium" #else # echo " -" fi # Firefox if __session_not_ignored firefox && [ -d "$HOME/.mozilla/firefox/profiles/$session" ]; then echo -n " firefox" #else # echo " -" fi echo "" let ++n done | column -t -c 6 #| sed -e 's/^/\t/' } # Session chooser mennu function __session_chooser { __session_list read -rep "Choose session: " n local name="`echo $n | awk '{ print $1 }'`" #local programs="`echo $n | awk '{ print $2 }'`" local programs="`echo $n | sed -e \"s/^$name//\"`" if [ ! -z "$name" ]; then session="$(__session_list | grep -E "(^$name.| $name:)" | sed -e "s/^[0-9]*. //" | cut -d : -f 1)" if [ ! -z "$session" ]; then __session_open $session $programs fi fi } # Run a program function __session_exec { if [ -z "$1" ]; then return fi # Ensure it won't be killed if parent exit nohup setsid $* >> $HOME/.xsession-errors 2>&1 & # Indicate that we should wait for the main script to wait # while the program starts SHOULD_SLEEP="5" } # Open a session function __session_open { local session="$1" shift local programs="$*" if [ ! -z "$programs" ]; then UNIGNORE=" $programs " fi # Custom if __session_not_ignored custom && [ -e "$CUSTOM/$session" ]; then __session_exec $CUSTOM/$session fi # Check VIM session if __session_not_ignored vim && [ -e "$HOME/.local/share/vim/sessions/$session.vim" ]; then if which vim &> /dev/null; then __session_exec terminal vim -S $HOME/.local/share/vim/sessions/$session.vim fi fi # Check tmux session if __session_not_ignored tmux && [ -e "$HOME/.tmux/$session" ]; then if which tmux &> /dev/null; then __session_exec terminal shell $session fi fi # Screen if __session_not_ignored screen && [ -e "$HOME/.screen/$session" ]; then if which screen &> /dev/null; then __session_exec terminal wscreen $session fi fi # Luakit if __session_not_ignored luakit && [ -e "$HOME/.local/share/luakit/sessions/$session" ]; then if which luakit &> /dev/null; then export LUAKIT_SESSION="$session" __session_exec luakit fi fi # Qutebrowser if __session_not_ignored qutebrowser && [ -e "$HOME/.local/share/qutebrowser/sessions/$session.yml" ]; then if which qutebrowser &> /dev/null; then __session_exec qutebrowser -r $session fi fi # Chromium if __session_not_ignored chromium && [ -d "$HOME/.config/chromium-profiles/$session" ]; then if which chromium-profile &> /dev/null; then __session_exec chromium-profile $session fi fi # Firefox if __session_not_ignored firefox && [ -d "$HOME/.mozilla/firefox/profiles/$session" ]; then __session_exec firefox-profile $session fi } # Ensure config folders exist mkdir -p $CONFIG $CUSTOM # Dispatch if [ "$BASENAME" == "session-list" ]; then __session_list elif [ "$BASENAME" == "session-chooser" ]; then __session_chooser elif [ "$BASENAME" == "terminal-session-chooser" ]; then terminal session-chooser elif [ ! -z "$1" ] && echo "$1" | grep -q -- '--list'; then __session_list elif [ ! -z "$1" ] && echo "$1" | grep -q -- '--chooser'; then __session_chooser elif [ -z "$1" ]; then echo "usage: $BASENAME [--list|--chooser] " echo "available sessions:" echo "" __session_list exit 1 else __session_open $* fi # Check if we should wait programs to exec if [ ! -z "$SHOULD_SLEEP" ]; then sleep $SHOULD_SLEEP fi