aboutsummaryrefslogtreecommitdiff
path: root/vim/plugin/auto_undodir.vim
diff options
context:
space:
mode:
Diffstat (limited to 'vim/plugin/auto_undodir.vim')
-rw-r--r--vim/plugin/auto_undodir.vim57
1 files changed, 57 insertions, 0 deletions
diff --git a/vim/plugin/auto_undodir.vim b/vim/plugin/auto_undodir.vim
new file mode 100644
index 00000000..1d20ba95
--- /dev/null
+++ b/vim/plugin/auto_undodir.vim
@@ -0,0 +1,57 @@
+"
+" auto_undodir.vim: Configure 'undodir' automatically, including trying hard
+" to create it.
+"
+" Author: Tom Ryder <tom@sanctum.geek.nz>
+" License: Same as Vim itself
+"
+if exists('g:loaded_auto_undodir')
+ \ || !has('persistent_undo')
+ \ || &compatible
+ finish
+endif
+let g:loaded_auto_undodir = 1
+
+" Define the undo path we want
+if exists('$VIM_UNDODIR')
+ let s:undodir = $VIM_UNDODIR
+else
+
+ " This is imperfect in that it will break if you have a backslashed comma in
+ " the first component of your &runtimepath, but if you're doing that, you
+ " probably already have way bigger problems
+ let s:undodir
+ \ = strpart(&runtimepath, 0, stridx(&runtimepath, ','))
+ \ . '/undo'
+endif
+
+" If the prospective undo directory does not exist, try hard to create it
+if !isdirectory(expand(s:undodir))
+
+ " Try Vim's native mkdir() first
+ if exists('*mkdir')
+ silent! call mkdir(expand(s:undodir), 'p', 0700)
+
+ " Failing that, use an OS-dependent command
+ " (Fortunately, Unix and Windows are the only OS types in the world)
+ elseif has('unix')
+ silent! execute '!mkdir -m 0700 -p '
+ \ . shellescape(expand(s:undodir))
+ elseif has('win32') || has('win64')
+ silent! execute '!mkdir '
+ \ . shellescape(expand(s:undodir))
+ endif
+
+endif
+
+" If the directory exists after that...
+if isdirectory(expand(s:undodir))
+
+ " Set the undo directory and turn persistent undo files on
+ execute 'set undodir^=' . s:undodir . '//'
+ set undofile
+
+" If not, give up and raise an error
+else
+ echoerr 'Could not create undodir ' . s:undodir
+endif