kakoune/rc/autorestore.kak
Frank LENORMAND 73e788fc59 Fix and improve the whole backup restoration procedure
The restore-buffer command was made publicly visible to allow arbitrary
reloads of the backup files, only backup files that were created after
the file has last been modified will be loaded, and several bugs have
been fixed (sed/find patterns).
2015-08-04 16:56:35 +03:00

59 lines
2.5 KiB
Plaintext

## If set to true, backups will be removed as soon as they have been restored
decl bool autorestore_purge_restored true
## Insert the content of the backup file into the current buffer, if a suitable one is found
def autorestore-restore-buffer -docstring "Restore the backup for the current file if it exists" %{
%sh{
buffer_basename="${kak_bufname##*/}"
buffer_dirname=$(dirname "${kak_bufname}")
## Find the name of the latest backup created for the buffer that was open
## The backup file has to have been last modified more recently than the file we are editing
latest_backup_path=$(find "${buffer_dirname}" -maxdepth 1 -type f -readable -newer "${kak_bufname}" -name "\.${buffer_basename}\.kak\.*" -printf '%A@/%p\n' 2>/dev/null \
| sort -n -t. -k1 | sed -nr 's/^[^\/]+\///;$p')
test ! -z "${latest_backup_path}" || {
echo "eval -draft %{ autorestore-purge-backups }";
exit;
}
## Replace the content of the buffer with the content of the backup file
echo "
exec -draft %{ %d!cat<space>${latest_backup_path}<ret>d }
echo -color Information Backup restored
"
## If the backup file has to be removed, issue the command once
## the current buffer has been saved
## If the autorestore_purge_restored option has been unset right after the
## buffer was restored, do not remove the backup
echo "
hook -group autorestore global BufWritePost (.+/)?${kak_bufname} %{
nop %sh{
if [ \"\${kak_opt_autorestore_purge_restored,,}\" = yes \
-o \"\${kak_opt_autorestore_purge_restored,,}\" = true ]; then
rm -f '${latest_backup_path}'
fi
}
}
"
}
}
## Remove all the backups that have been created for the current buffer
def autorestore-purge-backups -docstring "Remove all the backups of the current buffer" %{
nop %sh{
buffer_basename="${kak_bufname##*/}"
buffer_dirname=$(dirname "${kak_bufname}")
find "${buffer_dirname}" -type f -readable -name "\.${buffer_basename}\.kak\.*" -delete 2>/dev/null
}
echo -color 'Information Backup files removed'
}
## If for some reason, backup files need to be ignored
def autorestore-disable -docstring "Disable automatic backup recovering" %{
rmhooks global autorestore
}
hook -group autorestore global BufCreate .* %{ autorestore-restore-buffer }