]> git.sev.monster Git - dotfiles.git/commitdiff
vim: manually write undo with suda
authorsev <git@sev.monster>
Fri, 6 Dec 2024 06:58:31 +0000 (00:58 -0600)
committersev <git@sev.monster>
Fri, 6 Dec 2024 07:23:56 +0000 (01:23 -0600)
etc/vim/.vimrc

index b59d19e4f9bb37e2818d75376c40e958c722d98c..5e027bda1fbf56ee4ae4ec1407e74a1806030a4d 100644 (file)
@@ -203,5 +203,62 @@ function s:SudaSettingsRestore()
         endif
     endif
 endfunction
+function s:SudaWriteUndo()
+    let p = expand('<afile>')[7:]
+    if has('win32') || !&undofile || !filereadable(p)
+        return
+    endif
+    let p = resolve(p)
+    " XXX: comments are from :help backupdir to mark implementation details
+    let x = &undodir
+    " For backwards compatibility with Vim version 3.0 a '>' at the start
+    " of the option is removed.
+    if stridx(x, '>') == 0
+        let x = x[1:]
+    endif
+    " To include a comma in a directory name precede it with a backslash.
+    for u in split(x, '\v\\@1<!,')
+        " Spaces after the comma are ignored, other spaces are considered part
+        " of the directory name.
+        let u = trim(u, ' ', 1)
+        " To have a space at the start of a directory name, precede it with a
+        " backslash.
+        if stridx(u, '\ ') == 0
+            let u = u[1:]
+        endif
+        " Empty means that no backup file will be created.
+        if empty(u)
+            continue
+        elseif u == '.'
+            " A directory "." means to put the backup file in the same
+            " directory as the edited file.
+            let d = fnamemodify(p, ':p:h')
+        elseif stridx(u, './') == 0
+            " A directory starting with "./" (or ".\" for MS-Windows) means to
+            " put the backup file relative to where the edited file is.
+            let d = printf('%s%s', fnamemodify(p, ':p:h'), expand(u))
+        else
+            let d = u
+        endif
+        " NOTE: env vars are not expanded, and backslashes are not handled...
+        if u[-2:-1] == '//'
+            let f = fnamemodify(p, ':p:gs?/?%?')
+        else
+            let f = printf('.%s.un~', fnamemodify(p, ':t'))
+        endif
+        " A directory name may end in an '/'.
+        let d = trim(d, '/', 2)
+        if !isdirectory(d)
+            continue
+        endif
+        try
+            execute printf('wundo! %s/%s', fnameescape(d), fnameescape(f))
+            break
+        catch
+            continue
+        endtry
+    endfor
+endfunction
 autocmd BufReadPre suda://* call s:SudaSettingsSave()
 autocmd BufReadPost suda://* call s:SudaSettingsRestore()
+autocmd BufWritePost suda://* call s:SudaWriteUndo()
This page took 0.044527 seconds and 4 git commands to generate.