vimrc – Hacer una copia de seguridad solo una vez por sesión, cuando cierro un archivo

Pregunta:

Usando la opción de backup , me gustaría que vim mantuviera la copia de seguridad de un archivo hasta que ese archivo se cierre, en lugar de sobrescribir la copia de seguridad cada vez que se guarda el archivo.

Quiero que Vim haga eso porque a menudo me encuentro deseando poder ver un archivo como estaba al comienzo de la sesión de edición (para archivos que no quiero mantener bajo control de versiones).

NB: la copia de seguridad debería convertirse en una copia del archivo tal como estaba cuando lo guardé por última vez antes de cerrarlo. Es decir, si edito un archivo y salgo sin guardar, no se debería escribir la copia de seguridad.

Respuesta:

Estoy bastante seguro de que no es posible usar la función de backup de Vim para hacer esto, así que en su lugar escribí una prueba de concepto que logra su objetivo (de poder ver los cambios realizados desde el comienzo de la sesión) de manera más directa, con autocomandos.

Escribe un archivo que contiene el contenido actual del búfer cuando se lee el búfer y luego lo elimina cuando lo descargas (por ejemplo, con :bdelete o :bdelete de Vim).

augroup MyInitialState
  au!
  au BufReadPost * call CreateInitialState()
  au BufUnload * call DeleteInitialState()
augroup END

function! CreateInitialState() abort
  let file_name = BackupFileName('<afile>')
  if filewritable(file_name) == 1 ||
      \ (!glob(file_name) &&
      \ filewritable(fnamemodify(file_name, ':p:h')) == 2)
    execute "write!" file_name
  endif
endfunction

function! DeleteInitialState() abort
  let file_name = BackupFileName('<afile>')
  if filewritable(file_name) == 1
    call delete(file_name)
  endif
endfunction

function! BackupFileName(file_name) abort
  return expand(a:file_name) . '.initstate'
endfunction

Necesitará un poco de limpieza si desea una solución realmente sólida; por ejemplo, realmente no funciona con el valor predeterminado de Vim :set nohidden (una solución sería mantener una lista de archivos de respaldo y eliminarlos todos cuando salga de Vim en su lugar de individualmente en la descarga de búfer), y me imagino que habrá casos extremos que deban manejarse, pero debería ser suficiente para comenzar.

Crédito adicional

Aquí hay un comando :CompareInitialState que puede usar para :CompareInitialState contenido actual de su archivo con sus "copias de seguridad".

function! CompareInitialState() abort
  let file_name = BackupFileName('%')
  diffthis
  vnew
  setlocal buftype=nofile
  setlocal bufhidden=delete
  setlocal noswapfile
  execute "read" file_name
  1delete
  diffthis
  wincmd p
endfunction

command! CompareInitialState :call CompareInitialState()

Versión antigua

Aquí está mi versión inicial que escribí antes de que se me ocurriera que en realidad no necesita que exista el archivo de "respaldo" cuando no está en Vim.

augroup MyInitialState
  au!
  au BufReadPost * write! <afile>.initstate
  au BufUnload * call DeleteInitial()
augroup END

function! DeleteInitial() abort
  let file_name = expand('<afile>') . '.initstate'
  echom file_name
  if filewritable(file_name)
    call delete(file_name)
  endif
endfunction

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım