diff options
36 files changed, 354 insertions, 160 deletions
diff --git a/vim/config/backup.vim b/vim/config/backup.vim index 718647fc..8735a094 100644 --- a/vim/config/backup.vim +++ b/vim/config/backup.vim @@ -1,26 +1,11 @@ -" Use backup features if on a UNIX-like system and not using sudo(8) -if !strlen($SUDO_USER) && has('unix') +" Default to no backup files at all, in a way that even ancient/tiny Vims will +" understand; the auto_backupdir.vim plugin will take care of re-enabling this +set nobackup +set nowritebackup - " Keep backups with a .bak extension in ~/.vim/backup; the double-slash at - " the end of the directory is supposed to prod Vim into keeping the full - " path to the file in its backup filename to avoid collisions, but I don't - " think it actually works for backups, just undo and swap files - set backup - set backupext=.bak - set backupdir^=~/.vim/backup// +" If backps are enabled, use a more explicit and familiar backup suffix +set backupext=.bak - " This option already includes various temporary directories, but we - " append to it so that we don't back up anything in a shared memory - " filesystem either - set backupskip+=*/shm/* - - " Create the backup directory if necessary and possible - if !isdirectory($HOME . '/.vim/backup') && exists('*mkdir') - call mkdir($HOME . '/.vim/backup', 'p', 0700) - endif - -" Don't use backups at all otherwise -else - set nobackup - set nowritebackup -endif +" Don't back up files in anything named */shm/; they might be password +" files +set backupskip+=*/shm/* diff --git a/vim/config/case.vim b/vim/config/case.vim deleted file mode 100644 index bb21aefd..00000000 --- a/vim/config/case.vim +++ /dev/null @@ -1,3 +0,0 @@ -" Use the tilde as an operator with motions, rather than just swapping the -" case of the character under the cursor -set tildeop diff --git a/vim/config/command.vim b/vim/config/command.vim index 09ee0f40..031772e9 100644 --- a/vim/config/command.vim +++ b/vim/config/command.vim @@ -4,6 +4,9 @@ set history=2000 " Always tell me the number of lines changed by a command set report=0 +" Don't write the output of :make to the terminal +set shellpipe=> + " Command-line based features if has('cmdline_info') @@ -15,15 +18,7 @@ if has('cmdline_info') " Show the mode we're using if not normal mode (e.g. --INSERT--) set showmode -endif - -" Don't write the output of :make to the terminal -set shellpipe=> -" Always use forward slashes, I very seldom need to use Vim on Windows for -" more than scratch space anyway -if exists('+shellslash') - set shellslash endif " \d inserts the current local date from date(1) diff --git a/vim/config/complete.vim b/vim/config/complete.vim deleted file mode 100644 index 5fcc0e62..00000000 --- a/vim/config/complete.vim +++ /dev/null @@ -1,3 +0,0 @@ -" Don't try to complete strings from included files, just use the strings in -" the open buffers; I'll open the file if I want to complete from it -set complete-=i diff --git a/vim/config/wildmenu.vim b/vim/config/completion.vim index 6036c90a..a8a5c201 100644 --- a/vim/config/wildmenu.vim +++ b/vim/config/completion.vim @@ -1,3 +1,7 @@ +" Don't try to complete strings from included files, just use the strings in +" the open buffers; I'll open the file if I want to complete from it +set complete-=i + " Configuration for the command completion feature; rather than merely cycling " through possible completions with Tab, show them above the command line if has('wildmenu') @@ -17,7 +21,8 @@ if has('wildmenu') endif " Complete files without case sensitivity, if the option is available - if exists('&wildignorecase') + if exists('+wildignorecase') set wildignorecase endif + endif diff --git a/vim/config/display.vim b/vim/config/display.vim new file mode 100644 index 00000000..43889c1a --- /dev/null +++ b/vim/config/display.vim @@ -0,0 +1,41 @@ +" Set up short message settings +set shortmess= +" (file 3 of 5) -> (3 of 5) +set shortmess+=f +" [Incomplete last line] -> [eol] +set shortmess+=i +" I donated to Uganda, thanks Bram +set shortmess+=I +" 999 lines, 888 characters -> 999L, 888C +set shortmess+=l +" [Modified] -> [+] +set shortmess+=m +" [New File] -> [New] +set shortmess+=n +" Don't stack file writing messages +set shortmess+=o +" Don't stack file reading messages +set shortmess+=O +" [readonly] -> [RO] +set shortmess+=r +" Truncate file message at start if too long +set shortmess+=t +" Truncate other message in midle if too long +set shortmess+=T +" written -> [w], appended -> [a] +set shortmess+=w +" [dos format] -> [dos] +set shortmess+=x + +" Don't show whitespace characters or end-of-line characters visually by +" default, but make \l toggle between them +set nolist +nnoremap <silent> + \ <Leader>l + \ :<C-U>setlocal list! list?<CR> + +" Don't show line numbers by default, but \n toggles them +set nonumber +nnoremap <silent> + \ <Leader>n + \ :<C-U>setlocal number! number?<CR> diff --git a/vim/config/encoding.vim b/vim/config/encoding.vim deleted file mode 100644 index 72f2d40e..00000000 --- a/vim/config/encoding.vim +++ /dev/null @@ -1,4 +0,0 @@ -" Use UTF-8 by default wherever possible -if has('multi_byte') - set encoding=utf-8 -endif diff --git a/vim/config/file.vim b/vim/config/files.vim index a0c99f6c..7a23b4c5 100644 --- a/vim/config/file.vim +++ b/vim/config/files.vim @@ -8,6 +8,11 @@ nnoremap <silent> \ <Leader>p \ :<C-U>set filetype?<CR> +" Use UTF-8 by default wherever possible +if has('multi_byte') + set encoding=utf-8 +endif + " Use all ancestors of current directory for :find if has('file_in_path') set path=** diff --git a/vim/config/format.vim b/vim/config/format.vim index e1da2d0b..97ebcb11 100644 --- a/vim/config/format.vim +++ b/vim/config/format.vim @@ -1,3 +1,7 @@ +" Don't assume a number with a leading zero is octal; it's far more likely a +" zero-padded decimal, so increment and decrement with ^A and ^X on that basis +set nrformats-=octal + " Try to set the 'j' flag for 'formatoptions', to automatically delete comment " leaders when joining lines silent! set formatoptions+=j @@ -30,4 +34,5 @@ if has('user_commands') nnoremap <silent> \ <Leader>t \ :<C-U>ToggleOptionFlagLocal formatoptions t<CR> + endif diff --git a/vim/config/indent.vim b/vim/config/indent.vim deleted file mode 100644 index f6dfd416..00000000 --- a/vim/config/indent.vim +++ /dev/null @@ -1,24 +0,0 @@ -" Adopt the indent of the last line on new lines; interestingly, plugins that -" do clever things with indenting will often assume this is set -set autoindent - -" Use spaces instead of tabs -set expandtab - -" Indent with four spaces when an indent operation is used -set shiftwidth=4 - -" Insert four spaces when Tab is pressed -set softtabstop=4 - -" How many spaces to show for a literal tab when 'list' is unset -set tabstop=4 - -" Indent intelligently to 'shiftwidth' at the starts of lines with Tab, but -" use 'tabstop' everywhere else -set smarttab - -" When indenting lines with < or >, round the indent to a multiple of -" 'shiftwidth', so even if the line is indented by one space it will indent -" up to 4 and down to 0, for example -set shiftround diff --git a/vim/config/join.vim b/vim/config/join.vim deleted file mode 100644 index ebf42a8b..00000000 --- a/vim/config/join.vim +++ /dev/null @@ -1,10 +0,0 @@ -" Don't join lines with two spaces at the end of sentences; I don't two-space, -" despite the noble Steve Losh's exhortations -set nojoinspaces - -" Rebind normal J to run plugin-defined join that doesn't jump around, but -" only if we have the eval feature, because otherwise this mapping won't exist -" and we should keep the default behaviour -if has('eval') - nmap J <Plug>FixedJoin -endif diff --git a/vim/config/list.vim b/vim/config/list.vim deleted file mode 100644 index 1cb4345b..00000000 --- a/vim/config/list.vim +++ /dev/null @@ -1,10 +0,0 @@ -" Don't show whitespace characters or end-of-line characters visually by -" default, but make \l toggle between them -set nolist -nnoremap <silent> - \ <Leader>l - \ :<C-U>setlocal list! list?<CR> - -" Clearly show when the start or end of the row does not correspond to the -" start and end of the line -set listchars+=precedes:<,extends:> diff --git a/vim/config/match.vim b/vim/config/match.vim index 5c53d63e..58bcce78 100644 --- a/vim/config/match.vim +++ b/vim/config/match.vim @@ -1,6 +1,2 @@ -" Try to run the version of matchit.vim included in the distribution, if there -" is one; extends % to match more than it does by default -silent! runtime macros/matchit.vim - " Match all forms of brackets in pairs (including angle brackets) -set matchpairs=(:),{:},[:],<:> +set matchpairs+=<:> diff --git a/vim/config/nrformats.vim b/vim/config/nrformats.vim deleted file mode 100644 index 09fe8c73..00000000 --- a/vim/config/nrformats.vim +++ /dev/null @@ -1,3 +0,0 @@ -" Don't assume a number with a leading zero is octal; it's far more likely a -" zero-padded decimal, so increment and decrement with ^A and ^X on that basis -set nrformats-=octal diff --git a/vim/config/number.vim b/vim/config/number.vim deleted file mode 100644 index becc20f1..00000000 --- a/vim/config/number.vim +++ /dev/null @@ -1,5 +0,0 @@ -" Don't show line numbers by default, but \n toggles them -set nonumber -nnoremap <silent> - \ <Leader>n - \ :<C-U>setlocal number! number?<CR> diff --git a/vim/config/fedora.vim b/vim/config/os.vim index ff6cadfc..ff6cadfc 100644 --- a/vim/config/fedora.vim +++ b/vim/config/os.vim diff --git a/vim/config/paste.vim b/vim/config/paste.vim deleted file mode 100644 index fa26d6f4..00000000 --- a/vim/config/paste.vim +++ /dev/null @@ -1,6 +0,0 @@ -" Start paste mode with F10 to prevent console Vim from confusing a swathe of -" pre-formatted pasted text with actual keyboard input, and thereby attempting -" to indent it inappropriately. If unimpaired.vim is available, it's generally -" nicer to use yo or yO. -set nopaste -set pastetoggle=<F10> diff --git a/vim/config/netrw.vim b/vim/config/plugin.vim index b38649b9..407f0880 100644 --- a/vim/config/netrw.vim +++ b/vim/config/plugin.vim @@ -1,3 +1,7 @@ +" Try to run the version of matchit.vim included in the distribution, if there +" is one; extends % to match more than it does by default +silent! runtime macros/matchit.vim + " netrw plugin configuration if has('eval') diff --git a/vim/config/yank.vim b/vim/config/registers.vim index 01879aa8..01879aa8 100644 --- a/vim/config/yank.vim +++ b/vim/config/registers.vim diff --git a/vim/config/search.vim b/vim/config/search.vim index ff243116..69f3f472 100644 --- a/vim/config/search.vim +++ b/vim/config/search.vim @@ -33,4 +33,5 @@ if has('extra_search') \ setlocal hlsearch augroup END endif + endif diff --git a/vim/config/spell.vim b/vim/config/spell.vim index 7775ade9..cbbe17f1 100644 --- a/vim/config/spell.vim +++ b/vim/config/spell.vim @@ -17,4 +17,5 @@ if has('spell') nnoremap <silent> \ <Leader>z \ :<C-U>setlocal spelllang=en_nz spelllang?<CR> + endif diff --git a/vim/config/startup.vim b/vim/config/startup.vim deleted file mode 100644 index b99bebe1..00000000 --- a/vim/config/startup.vim +++ /dev/null @@ -1,3 +0,0 @@ -" Don't show the Vim startup message, I have registered Vim and donated to -" Uganda -set shortmess+=I diff --git a/vim/config/swapfile.vim b/vim/config/swapfile.vim index 778ae2f0..bf91aa6b 100644 --- a/vim/config/swapfile.vim +++ b/vim/config/swapfile.vim @@ -1,32 +1,14 @@ -" Swap files are used if using Unix and not using sudo(8); I very seldom need -" them, but they are occasionally useful after a crash, and they don't really -" get in the way if kept in their own directory -if !strlen($SUDO_USER) && has('unix') - - " Use swap files but keep them in ~/.vim/swap; the double-slash at the end - " of the directory prods Vim into keeping the full path to the file in its - " undo filename to avoid collisions; the same thing works for undo files - set swapfile - set directory^=~/.vim/swap// - - " Create the ~/.vim/swap directory if necessary and possible - if !isdirectory($HOME . '/.vim/swap') && exists('*mkdir') - call mkdir($HOME . '/.vim/swap', 'p', 0700) - endif - - " Don't keep swap files for files in temporary directories or shared memory - " filesystems; this is because they're used as scratch spaces for tools - " like sudoedit(8) and pass(1) and hence could present a security problem - if has('autocmd') - augroup dotfiles_swap_skip - autocmd! - autocmd BufNewFile,BufReadPre - \ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/* - \ setlocal noswapfile - augroup END - endif - -" Otherwise, don't use swap files at all -else - set noswapfile +" Default to no swapfile files at all, in a way that even ancient/tiny Vims +" will understand; the auto_swapdir.vim plugin will take care of this +set noswapfile + +" Don't keep swap files from temporary directories or shared memory in case +" they're secrets +if has('autocmd') + augroup dotfiles_swap_skip + autocmd! + autocmd BufNewFile,BufReadPre + \ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/* + \ setlocal noswapfile + augroup END endif diff --git a/vim/config/term.vim b/vim/config/terminal.vim index 8dbda431..202705a7 100644 --- a/vim/config/term.vim +++ b/vim/config/terminal.vim @@ -1,3 +1,10 @@ +" Start paste mode with F10 to prevent console Vim from confusing a swathe of +" pre-formatted pasted text with actual keyboard input, and thereby attempting +" to indent it inappropriately. If unimpaired.vim is available, it's generally +" nicer to use yo or yO. +set nopaste +set pastetoggle=<F10> + " Don't bother about checking whether Escape is being used as a means to enter " a Meta-key combination, just register Escape immediately set noesckeys diff --git a/vim/config/undo.vim b/vim/config/undo.vim index c9539665..f85d9d8c 100644 --- a/vim/config/undo.vim +++ b/vim/config/undo.vim @@ -4,23 +4,15 @@ inoremap <C-c> <C-c>u " Keep screeds of undo history set undolevels=2000 -" Keep undo history in a separate file if the feature is available, we're on -" Unix, and not using sudo(8); this goes really well with undo visualization -" plugins like Gundo or Undotree. -if !strlen($SUDO_USER) && has('unix') && has('persistent_undo') +" 'undodir' and 'undofile' settings will be taken care of by the +" auto_undodir.vim plugin if applicable/possible +if has('persistent_undo') - " Keep per-file undo history in ~/.vim/undo; the double-slash at the end - " of the directory prods Vim into keeping the full path to the file in its - " undo filename to avoid collisions; the same thing works for swap files - set undofile - set undodir^=~/.vim/undo// + " Turn off the option by default + set noundofile - " Create the ~/.vim/undo directory if necessary and possible - if !isdirectory($HOME . '/.vim/undo') && exists('*mkdir') - call mkdir($HOME . '/.vim/undo', 'p', 0700) - endif - - " Don't track changes to sensitive files + " Don't keep undo files from temporary directories or shared memory in case + " they're secrets if has('autocmd') augroup dotfiles_undo_skip autocmd! @@ -29,4 +21,5 @@ if !strlen($SUDO_USER) && has('unix') && has('persistent_undo') \ setlocal noundofile augroup END endif + endif diff --git a/vim/config/whitespace.vim b/vim/config/whitespace.vim index 24cda107..12d41a4e 100644 --- a/vim/config/whitespace.vim +++ b/vim/config/whitespace.vim @@ -1,2 +1,35 @@ +" Adopt the indent of the last line on new lines; interestingly, plugins that +" do clever things with indenting will often assume this is set +set autoindent + +" Use spaces instead of tabs +set expandtab + +" Indent with four spaces when an indent operation is used +set shiftwidth=4 + +" Insert four spaces when Tab is pressed +set softtabstop=4 + +" Indent intelligently to 'shiftwidth' at the starts of lines with Tab, but +" use 'tabstop' everywhere else +set smarttab + +" When indenting lines with < or >, round the indent to a multiple of +" 'shiftwidth', so even if the line is indented by one space it will indent +" up to 4 and down to 0, for example +set shiftround + +" Don't join lines with two spaces at the end of sentences; I don't two-space, +" despite the noble Steve Losh's exhortations +set nojoinspaces + +" Rebind normal J to run plugin-defined join that doesn't jump around, but +" only if we have the eval feature, because otherwise this mapping won't exist +" and we should keep the default behaviour +if has('eval') + nmap J <Plug>FixedJoin +endif + " \x strips trailing whitespace via a custom plugin nmap <Leader>x <Plug>StripTrailingWhitespace diff --git a/vim/config/windows.vim b/vim/config/windows.vim index a54b8997..88b38f8c 100644 --- a/vim/config/windows.vim +++ b/vim/config/windows.vim @@ -16,7 +16,7 @@ if has('windows') endif " Only show the tab bar if there's more than one tab - if exists('&showtabline') + if exists('+showtabline') set showtabline=1 endif @@ -24,4 +24,5 @@ if has('windows') if has('folding') let &fillchars = 'diff: ,fold: ,vert: ' endif + endif diff --git a/vim/config/wrap.vim b/vim/config/wrap.vim index 51e9ea89..a90c2765 100644 --- a/vim/config/wrap.vim +++ b/vim/config/wrap.vim @@ -9,6 +9,10 @@ nnoremap <silent> " column with @ symbols instead, which I don't find very helpful set display=lastline +" Clearly show when the start or end of the row does not correspond to the +" start and end of the line +set listchars+=precedes:<,extends:> + " When wrapping, j and k should move by screen row, and not to the same " column number in the previous logical line, which feels very clumsy and is " seldom particularly helpful; you can use n| to jump to the nth column in a @@ -26,7 +30,7 @@ if has('linebreak') set showbreak=... " If we have the option, indent wrapped lines as much as the first line - if has('&breakindent') + if exists('+breakindent') set breakindent endif diff --git a/vim/doc/auto_backupdir.txt b/vim/doc/auto_backupdir.txt new file mode 100644 index 00000000..c5b6ebad --- /dev/null +++ b/vim/doc/auto_backupdir.txt @@ -0,0 +1,12 @@ +*auto_backupdir.txt* Automatically create 'backupdir' in 'realtimepath' + +Author: Tom Ryder <tom@sanctum.geek.nz> +License: Same terms as Vim itself (see |license|) + +This plugin attempts to create a directory "backup" in the directory named by +the first element of 'realtimepath', and enables 'backup' with that as the +'backupdir' if it succeeds or if the directory already exists. + +This plugin lives in Tom Ryder's "dotfiles" suite, and will eventually be spun +off into a separate distribution as it solidifies and this documentation +improves. diff --git a/vim/doc/auto_swapdir.txt b/vim/doc/auto_swapdir.txt new file mode 100644 index 00000000..f88cfcf3 --- /dev/null +++ b/vim/doc/auto_swapdir.txt @@ -0,0 +1,12 @@ +*auto_swapdir.txt* Automatically create 'swapdir' in 'realtimepath' + +Author: Tom Ryder <tom@sanctum.geek.nz> +License: Same terms as Vim itself (see |license|) + +This plugin attempts to create a directory "swap" in the directory named by the +first element of 'realtimepath', and enables 'swapfile' with that as the +'directory' if it succeeds or if the directory already exists. + +This plugin lives in Tom Ryder's "dotfiles" suite, and will eventually be spun +off into a separate distribution as it solidifies and this documentation +improves. diff --git a/vim/doc/auto_undodir.txt b/vim/doc/auto_undodir.txt new file mode 100644 index 00000000..c782a70e --- /dev/null +++ b/vim/doc/auto_undodir.txt @@ -0,0 +1,14 @@ +*auto_undodir.txt* Automatically create 'undodir' in 'realtimepath' + +Author: Tom Ryder <tom@sanctum.geek.nz> +License: Same terms as Vim itself (see |license|) + +This plugin attempts to create a directory "undo" in the directory named by the +first element of 'realtimepath', and enables 'undofile' with that as the +'undodir' if it succeeds or if the directory already exists. + +It requires the +persistent_undo feature. + +This plugin lives in Tom Ryder's "dotfiles" suite, and will eventually be spun +off into a separate distribution as it solidifies and this documentation +improves. diff --git a/vim/plugin/auto_backupdir.vim b/vim/plugin/auto_backupdir.vim new file mode 100644 index 00000000..f15e7ce6 --- /dev/null +++ b/vim/plugin/auto_backupdir.vim @@ -0,0 +1,56 @@ +" +" auto_backupdir.vim: Configure 'backupdir' automatically, including trying +" hard to create it. +" +" Author: Tom Ryder <tom@sanctum.geek.nz> +" License: Same as Vim itself +" +if exists('g:loaded_auto_backupdir') + \ || &compatible + finish +endif +let g:loaded_auto_backupdir = 1 + +" Define the backup path we want +if exists('$VIM_BACKUPDIR') + let s:backupdir = $VIM_BACKUPDIR +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:backupdir + \ = strpart(&runtimepath, 0, stridx(&runtimepath, ',')) + \ . '/backup' +endif + +" If the prospective backup directory does not exist, try hard to create it +if !isdirectory(expand(s:backupdir)) + + " Try Vim's native mkdir() first + if exists('*mkdir') + silent! call mkdir(expand(s:backupdir), '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:backupdir)) + elseif has('win32') || has('win64') + silent! execute '!mkdir ' + \ . shellescape(expand(s:backupdir)) + endif + +endif + +" If the directory exists after that... +if isdirectory(expand(s:backupdir)) + + " Set the backup directory and turn backups on + execute 'set backupdir^=' . s:backupdir . '//' + set backup + +" If not, give up and raise an error +else + echoerr 'Could not create backupdir ' . s:backupdir +endif diff --git a/vim/plugin/auto_swapdir.vim b/vim/plugin/auto_swapdir.vim new file mode 100644 index 00000000..ea41a0f0 --- /dev/null +++ b/vim/plugin/auto_swapdir.vim @@ -0,0 +1,56 @@ +" +" auto_swapdir.vim: Configure 'directory' automatically, including trying hard +" to create it. +" +" Author: Tom Ryder <tom@sanctum.geek.nz> +" License: Same as Vim itself +" +if exists('g:loaded_auto_swapdir') + \ || &compatible + finish +endif +let g:loaded_auto_swapdir = 1 + +" Define the swap path we want +if exists('$VIM_SWAPDIR') + let s:swapdir = $VIM_SWAPDIR +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:swapdir + \ = strpart(&runtimepath, 0, stridx(&runtimepath, ',')) + \ . '/swap' +endif + +" If the prospective swapfile directory does not exist, try hard to create it +if !isdirectory(expand(s:swapdir)) + + " Try Vim's native mkdir() first + if exists('*mkdir') + silent! call mkdir(expand(s:swapdir), '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:swapdir)) + elseif has('win32') || has('win64') + silent! execute '!mkdir ' + \ . shellescape(expand(s:swapdir)) + endif + +endif + +" If the directory exists after that... +if isdirectory(expand(s:swapdir)) + + " Set the swapfile directory and turn swapfiles on + execute 'set directory^=' . s:swapdir . '//' + set swapfile + +" If not, give up and raise an error +else + echoerr 'Could not create swapdir ' . s:swapdir +endif 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 diff --git a/vim/plugin/big_file_options.vim b/vim/plugin/big_file_options.vim index bbbedc96..cdced67d 100644 --- a/vim/plugin/big_file_options.vim +++ b/vim/plugin/big_file_options.vim @@ -44,7 +44,7 @@ function! s:BigFileOptions() endif " Limit the number of columns of syntax highlighting - if exists('&synmaxcol') + if exists('+synmaxcol') \ && &synmaxcol > g:big_file_synmaxcol execute 'setlocal synmaxcol=' . g:big_file_synmaxcol endif diff --git a/vim/plugin/copy_linebreak.vim b/vim/plugin/copy_linebreak.vim index 2b5f7243..732acfea 100644 --- a/vim/plugin/copy_linebreak.vim +++ b/vim/plugin/copy_linebreak.vim @@ -17,7 +17,7 @@ let g:loaded_copy_linebreak = 1 function! s:CopyLinebreakEnable() setlocal nolinebreak linebreak? setlocal showbreak= - if exists('&breakindent') + if exists('+breakindent') setlocal nobreakindent endif endfunction @@ -26,7 +26,7 @@ endfunction function! s:CopyLinebreakDisable() setlocal linebreak linebreak? setlocal showbreak< - if exists('&breakindent') + if exists('+breakindent') setlocal breakindent< endif endfunction |