diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2025-01-28 09:14:32 +0000 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2025-01-28 09:14:32 +0000 |
commit | 904cec3c4a329cf89fc3219d359239910d61f3f6 (patch) | |
tree | 8d113899921dfbaca0e77c49ab5fc827362d1091 /autoload/tools/autorestore.kak |
Diffstat (limited to 'autoload/tools/autorestore.kak')
-rw-r--r-- | autoload/tools/autorestore.kak | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/autoload/tools/autorestore.kak b/autoload/tools/autorestore.kak new file mode 100644 index 0000000..52febe3 --- /dev/null +++ b/autoload/tools/autorestore.kak @@ -0,0 +1,93 @@ +declare-option -docstring %{ + Remove backups once they've been restored + + See `:doc autorestore` for details. + } \ + bool autorestore_purge_restored true + +## Insert the content of the backup file into the current buffer, if a suitable one is found +define-command autorestore-restore-buffer \ + -docstring %{ + Restore the backup for the current file if it exists + + See `:doc autorestore` for details. + } \ +%{ + evaluate-commands %sh{ + buffer_basename="${kak_buffile##*/}" + buffer_dirname=$(dirname "${kak_buffile}") + + if [ -f "${kak_buffile}" ]; then + newer=$(find "${buffer_dirname}"/".${buffer_basename}.kak."* -newer "${kak_buffile}" -exec ls -1t {} + 2>/dev/null | head -n 1) + older=$(find "${buffer_dirname}"/".${buffer_basename}.kak."* \! -newer "${kak_buffile}" -exec ls -1t {} + 2>/dev/null | head -n 1) + else + # New buffers that were never written to disk. + newer=$(ls -1t "${buffer_dirname}"/".${buffer_basename}.kak."* 2>/dev/null | head -n 1) + older="" + fi + + if [ -z "${newer}" ]; then + if [ -n "${older}" ]; then + printf %s\\n " + echo -debug Old backup file(s) found: will not restore ${older} . + " + fi + exit + fi + + printf %s\\n " + ## Replace the content of the buffer with the content of the backup file + echo -debug Restoring file: ${newer} + + execute-keys -draft %{%d!cat<space>\"${newer}\"<ret>jd} + + ## 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 + hook -group autorestore buffer BufWritePost '${kak_buffile}' %{ + nop %sh{ + if [ \"\${kak_opt_autorestore_purge_restored}\" = true ]; + then + rm -f \"${buffer_dirname}/.${buffer_basename}.kak.\"* + fi + } + } + " + } +} + +## Remove all the backups that have been created for the current buffer +define-command autorestore-purge-backups \ + -docstring %{ + Remove all the backups of the current buffer + + See `:doc autorestore` for details. + } \ +%{ + evaluate-commands %sh{ + [ ! -f "${kak_buffile}" ] && exit + + buffer_basename="${kak_bufname##*/}" + buffer_dirname=$(dirname "${kak_bufname}") + + rm -f "${buffer_dirname}/.${buffer_basename}.kak."* + + printf %s\\n " + echo -markup {Information}Backup files removed. + " + } +} + +## If for some reason, backup files need to be ignored +define-command autorestore-disable \ + -docstring %{ + Disable automatic backup recovering + + See `:doc autorestore` for details. + } \ +%{ + remove-hooks global autorestore +} + +hook -group autorestore global BufCreate .* %{ autorestore-restore-buffer } |