]> git.sev.monster Git - dotfiles.git/blobdiff - etc/vim/.vimrc
zshrc: add more git stash aliases
[dotfiles.git] / etc / vim / .vimrc
index aca1f42617131c7acdcb58f0b7b22ca0590584f5..0b9bcd9dc0739d766fbe7558209fa847134d13ea 100644 (file)
@@ -68,41 +68,6 @@ if !has('nvim')
 endif
 
 
-""" package config
-"" suda
-" https://github.com/lambdalisue/vim-suda/issues/32#issuecomment-829608925
-if ! &diff
-    let g:suda_smart_edit = 1
-endif
-" re-enable backup, swap, undo for suda buffers that we can read
-" https://github.com/lambdalisue/vim-suda/issues/25
-function s:SudaSettingsSave()
-    let l:f = expand('<afile>')
-    if stridx(l:f, 'suda://') == 0
-        let g:sev_suda_file = expand('<afile>')
-        let g:sev_suda_backup = &backup
-        let g:sev_suda_swapfile = &swapfile
-        let g:sev_suda_undofile = &undofile
-    endif
-endfunction
-function s:SudaSettingsRestore()
-    if exists('g:sev_suda_file') && filereadable(g:sev_suda_file)
-        if exists('g:sev_suda_backup') && g:sev_suda_backup
-            " XXX: suda.vim uses setlocal for this, even though it's global...
-            setlocal backup
-        endif
-        if exists('g:sev_suda_swapfile') && g:sev_suda_swapfile
-            setlocal swapfile
-        endif
-        if exists('g:sev_suda_undofile') && g:sev_suda_undofile
-            setlocal undofile
-        endif
-    endif
-endfunction
-autocmd BufReadPre * call s:SudaSettingsSave()
-autocmd BufReadPost suda://* call s:SudaSettingsRestore()
-
-
 """ styling
 " nice default theme
 colorscheme murphy
@@ -155,7 +120,6 @@ set listchars=tab:├─,extends:»,precedes:«,space:·,trail:∙,nbsp:■
 " always save undo file for all file buffers
 autocmd BufReadPre * setlocal undofile
 
-
 " explicitly use modeline, even on systems where it's disabled by system vimrc
 autocmd BufRead * set modeline
 " should be default disabled but just in case
@@ -209,3 +173,98 @@ nnoremap <A-l> <C-w>l
 if !has('nvim') && maparg('<C-L>', 'n') ==# ''
   nnoremap <silent> <C-L> :nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
 endif
+
+
+""" package config
+"" suda
+" https://github.com/lambdalisue/vim-suda/issues/32#issuecomment-829608925
+if ! &diff
+    let g:suda_smart_edit = 1
+endif
+" re-enable backup, swap, undo for suda buffers that we can read
+" https://github.com/lambdalisue/vim-suda/issues/25
+function s:SudaSettingsSave()
+    let b:sev_suda_swapfile = &swapfile
+    let b:sev_suda_undofile = &undofile
+    " fix https://github.com/lambdalisue/vim-suda/issues/87
+    setlocal noswapfile
+endfunction
+function s:SudaSettingsRestore()
+    if filereadable(expand('<afile>')[7:])
+        if exists('b:sev_suda_swapfile') && b:sev_suda_swapfile
+            try
+                setlocal swapfile
+            catch
+                " ignore swapfile errors, they should have been shown already
+                echohl ErrorMsg
+                for line in split(v:exception, '\n')
+                    echomsg printf('[suda] %s', line)
+                endfor
+                echohl None
+            endtry
+        endif
+        if exists('b:sev_suda_undofile') && b:sev_suda_undofile
+            setlocal undofile
+        endif
+    endif
+endfunction
+function s:SudaProcessUndo(cmd)
+    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('%s %s/%s', a:cmd, fnameescape(d), fnameescape(f))
+            break
+        catch
+            continue
+        endtry
+    endfor
+endfunction
+autocmd BufReadPre suda://* call s:SudaSettingsSave()
+autocmd BufReadPost suda://* call s:SudaSettingsRestore()
+autocmd BufReadPost suda://* call s:SudaProcessUndo('silent! rundo')
+autocmd BufWritePost suda://* call s:SudaProcessUndo('wundo!')
This page took 0.047121 seconds and 4 git commands to generate.