Skip to content

Commit 1e325b6

Browse files
authored
feat: add option to restore paste buffers (#3)
It is disabled by default and enabled using @resurrect-paste-buffers. Paste buffers are listed and dumped in a tar.gz at save time, similar to what is done for pane contents. At restore time, the archive is extracted and paste buffers are restored in order. authored-by: Lionel Van Bemten <[email protected]>
1 parent c80dfe5 commit 1e325b6

File tree

6 files changed

+89
-0
lines changed

6 files changed

+89
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ Optional:
4949

5050
- [restoring vim and neovim sessions](docs/restoring_vim_and_neovim_sessions.md)
5151
- [restoring pane contents](docs/restoring_pane_contents.md)
52+
- [restoring paste buffers](docs/restoring_paste_buffers.md)
5253
- [restoring a previously saved environment](docs/restoring_previously_saved_environment.md)
5354

5455
Requirements / dependencies: `tmux 1.9` or higher, `bash`.

docs/restoring_paste_buffers.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Restoring paste buffers
2+
3+
This feature saves and restores tmux paste buffers.
4+
5+
It can be enabled by adding this line to `.tmux.conf`:
6+
7+
set -g @resurrect-paste-buffers 'on'

scripts/helpers.sh

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,34 @@ pane_content_files_restore_from_archive() {
9494
fi
9595
}
9696

97+
# paste buffers file helpers
98+
99+
paste_buffers_option_on() {
100+
local option="$(get_tmux_option "$paste_buffers_option" "off")"
101+
[ "$option" == "on" ]
102+
}
103+
104+
paste_buffers_create_archive() {
105+
tar cf - -C "$(resurrect_dir)/save/" ./paste_buffers/ |
106+
gzip > "$(paste_buffers_archive_file)"
107+
}
108+
109+
paste_buffers_restore_from_archive() {
110+
local archive_file="$(paste_buffers_archive_file)"
111+
if [ -f "$archive_file" ]; then
112+
restore_dir=$(paste_buffers_dir "restore")
113+
mkdir -p "${restore_dir}"
114+
gzip -d < "$archive_file" |
115+
tar xf - -C "$(resurrect_dir)/restore/"
116+
gzip -d < "$archive_file" | tar t | cut -d / -f 3 |
117+
sort -r | # restore buffers in order (first saved restored last)
118+
while read file_in_arch; do
119+
[ ! -f "${restore_dir}/${file_in_arch}" ] && continue # skip top level dir
120+
echo "${restore_dir}/${file_in_arch}"
121+
done
122+
fi
123+
}
124+
97125
# path helpers
98126

99127
resurrect_dir() {
@@ -140,6 +168,20 @@ pane_contents_archive_file() {
140168
echo "$(resurrect_dir)/pane_contents.tar.gz"
141169
}
142170

171+
paste_buffers_dir() {
172+
echo "$(resurrect_dir)/$1/paste_buffers/"
173+
}
174+
175+
paste_buffer_file() {
176+
local save_or_restore="$1"
177+
local file_name="$2"
178+
echo "$(paste_buffers_dir "${save_or_restore}")/${file_name}"
179+
}
180+
181+
paste_buffers_archive_file() {
182+
echo "$(resurrect_dir)/paste_buffers.tar.gz"
183+
}
184+
143185
execute_hook() {
144186
local kind="$1"
145187
shift

scripts/restore.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,24 @@ restore_all_pane_processes() {
315315
fi
316316
}
317317

318+
clear_paste_buffers() {
319+
tmux list-buffers -F '#{buffer_name}' |
320+
while read bufname; do
321+
tmux delete-buffer -b "${bufname}"
322+
done
323+
}
324+
325+
restore_paste_buffers() {
326+
if paste_buffers_option_on; then
327+
clear_paste_buffers
328+
paste_buffers_restore_from_archive | while read buffer_file; do
329+
buffer_name=$(basename ${buffer_file##*/} | cut -d _ -f 2)
330+
tmux load-buffer -b "${buffer_name}" "${buffer_file}"
331+
done
332+
rm $(paste_buffers_dir "restore")/*
333+
fi
334+
}
335+
318336
restore_active_pane_for_each_window() {
319337
awk 'BEGIN { FS="\t;\t"; OFS="\t;\t" } /^pane/ && $9 == 1 { print $2, $3, $6; }' $(last_resurrect_file) |
320338
while IFS=$d read session_name window_number active_pane; do
@@ -372,6 +390,7 @@ main() {
372390
restore_window_properties >/dev/null 2>&1
373391
execute_hook "pre-restore-pane-processes"
374392
restore_all_pane_processes
393+
restore_paste_buffers
375394
# below functions restore exact cursor positions
376395
restore_active_pane_for_each_window
377396
restore_zoomed_windows

scripts/save.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,17 @@ dump_pane_contents() {
226226
done
227227
}
228228

229+
dump_paste_buffers() {
230+
tmux list-buffers -F '#{buffer_name}' |
231+
while read bufname; do
232+
# add index prefix to save buffer order
233+
filename=$(printf "buf%04d_%s" "${i}" "${bufname}")
234+
i=$((i+1))
235+
dst=$(paste_buffer_file "save" "${filename}")
236+
tmux save-buffer -b "${bufname}" "${dst}"
237+
done
238+
}
239+
229240
remove_old_backups() {
230241
# remove resurrect files older than 30 days (default), but keep at least 5 copies of backup.
231242
local delete_after="$(get_tmux_option "$delete_backup_after_option" "$default_delete_backup_after")"
@@ -255,6 +266,12 @@ save_all() {
255266
pane_contents_create_archive
256267
rm "$(pane_contents_dir "save")"/*
257268
fi
269+
if paste_buffers_option_on; then
270+
mkdir -p "$(paste_buffers_dir "save")"
271+
dump_paste_buffers
272+
paste_buffers_create_archive
273+
rm "$(paste_buffers_dir "save")"/*
274+
fi
258275
remove_old_backups
259276
execute_hook "post-save-all"
260277
}

scripts/variables.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ pane_contents_option="@resurrect-capture-pane-contents"
3838
pane_contents_area_option="@resurrect-pane-contents-area"
3939
default_pane_contents_area="full"
4040

41+
# Paste buffer restore options
42+
paste_buffers_option="@resurrect-paste-buffers"
43+
4144
# set to 'on' to ensure panes are never ever overwritten
4245
overwrite_option="@resurrect-never-overwrite"
4346

0 commit comments

Comments
 (0)