-
-
Save beeftornado/d98a9b9feed83b7ab2de to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby | |
# Modified version of https://github.com/geebee/tmux-persistence to work with byobu | |
# and work on OSX. | |
require 'fileutils.rb' | |
# Start - Configuration Variables | |
sessionDir = ENV['HOME']+"/.byobu-sessions" | |
maxStoredSessions = 5 | |
filesToRoll = 3 | |
# End - Configuration Variables | |
FileUtils::makedirs(sessionDir) unless File.exists?(sessionDir) | |
files = [] | |
Dir.entries(sessionDir).each do |e| | |
if e !~ /^\./ | |
files << e | |
end | |
end | |
files.sort! unless files.length == 0 | |
if files.length > maxStoredSessions | |
0.upto(filesToRoll - 1) do |index| | |
File.delete( sessionDir+ "/" + files[index] ) | |
end | |
puts "Rotated stored sessions" | |
end | |
#%x[rm #{sessionDir}/*-restore] | |
sessions = %x[tmux list-sessions -F "\#{session_name}"].split("\n") | |
sessions.each do |sessionName| | |
rawPaneList = %x[tmux list-panes -t #{sessionName} -s -F "\#{window_index} \#{pane_index} \#{window_width} \#{window_height} \#{pane_width} \#{pane_height} \#{window_name} \#{pane_current_path} \#{pane_pid}"].split("\n") | |
panes = [] | |
rawPaneList.each do |pane_line| | |
temp_pane = pane_line.split(" ") | |
panes.push({ | |
windowIndex: Integer(temp_pane[0]), | |
paneIndex: Integer(temp_pane[1]), | |
windowWidth: Integer(temp_pane[2]), | |
windowHeight: Integer(temp_pane[3]), | |
paneWidth: Integer(temp_pane[4]), | |
paneHeight: Integer(temp_pane[5]), | |
window_name: temp_pane[6], | |
cwd: temp_pane[7], | |
pid: temp_pane[8] | |
}) | |
end | |
sessionScript = "" | |
panes.each_index do |idx| | |
pane = panes[idx] | |
pane[:cmd] = %x[ps -o command -p #{pane[:pid]} | awk 'NR>1'].delete("\n") | |
pane[:cmd] = %x[ps -o command #{pane[:pid]} | awk 'NR>1'].delete("\n").gsub(/^-/,"") unless pane[:cmd] != "" | |
sessionScript += " # Restore (forcibly) window '#{pane[:window_name]}' to position #{pane[:windowIndex]}\n" | |
sessionScript += " $BYOBU new-window -t $SESSION:#{pane[:windowIndex]} -k -n #{pane[:window_name]}\n" | |
sessionScript += " $BYOBU send-keys -t $SESSION:#{pane[:windowIndex]} 'cd \"#{pane[:cwd]}\" && clear' C-m\n\n" | |
if pane[:paneIndex] > 0 | |
if pane[:paneWidth] < pane[:windowWidth] | |
sessionScript += " $BYOBU join-pane -h -l #{pane[:paneWidth]} -s $SESSION:#{pane[:windowIndex] +1}.0 -t $SESSION:#{pane[:windowIndex]}\n\n" | |
else | |
sessionScript += " $BYOBU join-pane -v -l #{pane[:paneHeight]} -s $SESSION:#{pane[:windowIndex] +1}.0 -t $SESSION:#{pane[:windowIndex]}\n\n" | |
end | |
end | |
end | |
restore_file = sessionDir + "/" + sessionName + "-restore" | |
File.open(restore_file, "w") { | |
|f| f.write(%Q[#!/usr/bin/env bash | |
SESSION=#{sessionName} | |
BYOBU=\\byobu # bypass any aliasing | |
if [ -z $TMUX ]; then | |
# if session already exists, attach | |
$BYOBU has-session -t $SESSION 2>/dev/null | |
if [ $? -eq 0 ]; then | |
echo \"Session $SESSION already exists. Attaching...\" | |
$BYOBU attach -t $SESSION | |
exit 0; | |
fi | |
# assumption by this point is user hasn't already started tmux/byobu, since we lazily quit if there was one | |
# (could be done, but this isn't my job...and I need to get to my job). | |
# Refactored to work even if user has some default session creation already configured in their ~/.byobu/.tmux.conf | |
$BYOBU start-server | |
#{sessionScript} | |
# attach to new session | |
$BYOBU select-window -t $SESSION:#{panes[0][:windowIndex]} | |
$BYOBU attach-session -t $SESSION | |
fi | |
]) | |
# make script executable | |
f.chmod( 0744 ) | |
} | |
end |
how to restore?
Simply run the restore script located in ~/.byobu-sessions/.
I know that it is possible to save the scrollback of the session with tmux capture-pane
. Unfortunately, I dont really understand the ruby code. Is it feasible to include the scrollback in the saved session?
This doesn't work.
So I looked at the bash code. I'm not good at bash, I know nothing about ruby but I made it work (hackfix I guess).
I only added this line:
$BYOBU new -s $SESSION
After:
$BYOBU start-server
Although it annoyed me to install ruby-full only for that small script but well, it seems like it works!
EDIT: if you close one window, and you rerun the script, it won't restore that closed window.
EDIT 2: if you kill the byobu server, if you delete all sessions, and if you restore using the script, it won't reload any history, just the names and number of windows :'(
EDIT 3: ok it's too buggy lol, I can't make it work
EDIT 4: maybe guys should try tmux-resurrect instead
Hi, i got that error:
is there something wrong or iam misusing the script ? thank you
│./byobusave.rb:42: odd number list for Hash
│windowIndex: Integer(temp_pane[0]),
│ ^
│./byobusave.rb:42: syntax error, unexpected ':', expecting '}'
│windowIndex: Integer(temp_pane[0]),
│ ^
│./byobusave.rb:42: syntax error, unexpected ',', expecting kEND
│./byobusave.rb:43: syntax error, unexpected ',', expecting kEND
│./byobusave.rb:44: syntax error, unexpected ',', expecting kEND
│./byobusave.rb:45: syntax error, unexpected ',', expecting kEND
│./byobusave.rb:46: syntax error, unexpected ',', expecting kEND
│./byobusave.rb:47: syntax error, unexpected ',', expecting kEND
│./byobusave.rb:49: syntax error, unexpected ':', expecting '='
│cwd: temp_pane[7],
│ ^
│./byobusave.rb:50: syntax error, unexpected ':', expecting '='
│pid: temp_pane[8]
│ ^
│./byobusave.rb:51: syntax error, unexpected '}', expecting kEND
│./byobusave.rb:97: syntax error, unexpected $end, expecting kEND