X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=vimrc;h=bde35b6f739fe5d2aeafc7dff9427c47a6b1bc11;hb=64309b7f39772977ed42b003b308b2210222e3c6;hp=6c3e292145226b121326a392c6103c7d3be84944;hpb=402ba62d06cdeda0a4c77bba6e0cad1dfa6b2eb5;p=config%2Fdotfiles.git diff --git a/vimrc b/vimrc index 6c3e292..bde35b6 100644 --- a/vimrc +++ b/vimrc @@ -49,8 +49,11 @@ set encoding=utf-8 set runtimepath-=~/.vim set runtimepath^=~/.vim,~/.vim/runtime -" Don't store swap files in the same directory as the edited file. -set directory-=. +" Don't store swap files in the same directory as the edited file. But only if +" we have a "safe" writable directory available. +if filewritable('~/.tmp') == 2 || filewritable('~/tmp') == 2 + set directory-=. +endif " But store them in ~/.tmp or ~/tmp (already set by default) if available. set directory^=~/.tmp @@ -69,8 +72,8 @@ set history=1000 " Increase number of possible undos. set undolevels=1000 +" Remember marks (including the last cursor position) for more files. if has('viminfo') - " Remember marks (including the last cursor position) for more files. set viminfo^='1000 endif @@ -90,9 +93,9 @@ endif " HELPER FUNCTIONS +if has('eval') " Check if the given syntax group is available. Thanks to bairui in #vim on " Freenode (2012-02-19 01:15 CET) for the try/catch silent highlight idea. -if has('eval') function! s:HasSyntaxGroup(group) try execute 'silent highlight ' . a:group @@ -102,6 +105,12 @@ if has('eval') endtry return 1 endfunction + +" Check if the given Vim version and patch is available. + function! s:HasVersionAndPatch(version, patch) + return v:version > a:version + \ || (v:version == a:version && has('patch' . a:patch)) + endfunction endif @@ -117,6 +126,9 @@ endif " existing files. set fileencodings=utf-8,latin1 +" Always use unix line-endings for new files. +set fileformats=unix,dos + " Wrap text after 78 characters. set textwidth=78 @@ -144,6 +156,10 @@ set formatoptions+=ro " Don't break a line if was already longer then 'textwidth' when insert mode " started. set formatoptions+=l +" Remove comment leader when joining lines where it makes sense. +if HasVersionAndPatch(703, 541) + set formatoptions+=j +endif " Allow virtual editing (cursor can be positioned anywhere, even when there is " no character) in visual block mode. @@ -156,8 +172,8 @@ set incsearch " Activate syntax folding. if has('folding') set foldmethod=syntax - " Only use fold column if we have enough space (for example in a (virtual) - " terminals). + " Only use fold column if we have enough space (for example not in a + " (virtual) terminal which has only 80 columns). if &columns > 80 set foldcolumn=2 endif @@ -191,7 +207,7 @@ set hidden set background=dark " Use my color scheme if 256 colors are available. -if &t_Co == 256 +if &t_Co == 256 || has('gui_running') colorscheme simon endif @@ -235,6 +251,14 @@ if v:version >= 700 set listchars+=nbsp:! endif +" Don't draw the vertical split separator by using space as character. Thanks +" to scp1 in #vim on Freenode (2012-06-16 16:12 CEST) for the idea to use a +" non-breakable space. But a simple space works as well, as long as the +" current color scheme is not reset. +if has('windows') && has('folding') + set fillchars+=vert:\ " comment to prevent trailing whitespace +endif + if has('statusline') " Always display the status line even if there is only one window. set laststatus=2 @@ -262,12 +286,79 @@ if has('statusline') endif endfunction + " Like %f but use relative filename if it's shorter than the absolute path + " (e.g. '../../file' vs. '~/long/path/to/file'). fnamemodify()'s ':.' is + " not enough because it doesn't create '../'s. + function! StatuslineRelativeFilename() + " Display only filename for help files. + if &buftype == 'help' + return expand('%:t') + endif + " Special case for scratch files. + if &buftype == 'nofile' + return '[Scratch]' + endif + + let l:path = expand('%') + " No file. + if l:path == '' + return '[No Name]' + endif + " Path is already relative, nothing to do. + if stridx(l:path, '/') != 0 + return l:path + endif + + " Absolute path to this file. + let l:path = expand('%:p') + " Shortened path to this file, thanks to bairui in #vim on Freenode + " (2012-06-23 00:54) for the tip to use fnamemodify(). This is what + " Vim normally uses as %f (minus some exceptions). + let l:original_path = fnamemodify(l:path, ':~') + " Absolute path to the current working directory. + let l:cwd = getcwd() + + " Working directory completely contained in path, replace it with a + " relative path. Happens for example when opening a file with netrw. + " %f displays this as absolute path, but we want a relative path of + " course. + if stridx(l:path, l:cwd) == 0 + return strpart(l:path, strlen(l:cwd) + 1) + endif + + let l:path_list = split(l:path, '/') + let l:cwd_list = split(l:cwd, '/') + + " Remove the common path. + while l:path_list[0] == l:cwd_list[0] + call remove(l:path_list, 0) + call remove(l:cwd_list, 0) + endwhile + + " Add as many '..' as necessary for the relative path and join the + " path. Thanks to Raimondi in #vim on Freenode (2012-06-23 01:13) for + " the hint to use repeat() instead of a loop. + let l:path = repeat('../', len(l:cwd_list)) . join(l:path_list, '/') + + " Use the shorter path, either relative or absolute. + if strlen(l:path) < strlen(l:original_path) + return l:path + else + return l:original_path + endif + endfunction + set statusline= " on the left set statusline+=%02n " buffer number set statusline+=%{StatuslineBufferCount()} " highest buffer number set statusline+=: - set statusline+=%f\ " path to current file in buffer + if has('modify_fname') + set statusline+=%{StatuslineRelativeFilename()} " path to current file + set statusline+=\ " space after path + else + set statusline+=%f\ " path to current file in buffer + endif set statusline+=%h " [help] if buffer is help file set statusline+=%w " [Preview] if buffer is preview buffer set statusline+=%m " [+] if buffer was modified, @@ -291,7 +382,7 @@ endif " modified by a plugin or other settings. Except for which isn't " affected by mappings. -" Easy way to exit insert mode. +" Easy way to exit insert mode. jk is preferred because it's faster. inoremap jj inoremap jk " Also for command mode, thanks to http://github.com/mitechie/pyvim @@ -350,7 +441,8 @@ endif " Write before suspending, thanks to deryni in #vim on Freenode (2011-05-09 " 20:02 CEST). To suspend without saving either unmap this or use :stop. -" Only the current buffer is written. +" Only the current buffer is written, thus switching to another buffer works +" too. nnoremap :update:stop " 2 gives more verbose information, use it by default. Thanks to NCS_One @@ -366,6 +458,33 @@ nmap - " (2010-05-16 18:38 CEST) for this idea. nnoremap gb :bnext nnoremap gB :bprevious +if has('eval') + " But when starting again at the first buffer, print a warning which + " reminds me that I've already seen that buffer. + function! s:NextBuffer() + " Are we currently on the last buffer and moving to the first? + let l:last_buffer = 0 + if bufnr('%') == bufnr('$') && bufnr('$') > 1 + let l:last_buffer = 1 + endif + + " Go to the next buffer. + if !l:last_buffer + bnext + + " Go to the first buffer, silent is necessary or the following message + " won't be displayed because it's overwritten by the status message + " displayed when entering a buffer. + else + silent bnext + + echohl WarningMsg + echo 'Starting again at first buffer.' + echohl None + endif + endfunction + nnoremap gb :call NextBuffer() +endif " Fast access to buffers. nnoremap 1 :1buffer @@ -502,9 +621,11 @@ endif " ABBREVIATIONS -" Fix some of my spelling mistakes. +" Fix some of my spelling mistakes (German). inoreabbrev relle reelle inoreabbrev reele reelle +" Fix some of my spelling mistakes (English). +inoreabbrev completly completely " SYNTAX SETTINGS @@ -576,7 +697,8 @@ if has('syntax') \ '| call matchadd("Error", "\\%u" . l:x)' \ '| endfor' -" Reduce visibility of tabs in contrast to normal SpecialKeys. +" Special highlight for tabs to reduce their visibility in contrast to other +" SpecialKey characters (e.g. ^L). if &t_Co == 256 && HasSyntaxGroup('specialKeyTab') call matchadd('specialKeyTab', '\t') endif @@ -593,6 +715,8 @@ if has('syntax') " Settings for specific filetypes. + " C + let g:c_no_if0_fold = 1 " fix weird double fold in #if0 in recent versions " Haskell. let g:hs_highlight_delimiters = 1 let g:hs_highlight_boolean = 1 @@ -627,11 +751,17 @@ if has('eval') silent! execute 'call pathogen#runtime_append_all_bundles()' endif +" Settings for securemodelines. + " Only allow items I need (also includes spl which is not enabled by + " default). + let g:secure_modelines_allowed_items = ['ft', 'spl', 'fdm', + \ 'sw', 'sts', 'noet'] + " Settings for the NERD commenter. " Don't create any mappings I don't want to use. let g:NERDCreateDefaultMappings = 0 " Map toggle comment. - map NERDCommenterToggle + nmap NERDCommenterToggle " XPTemplate settings. " Try to maintain snippet rendering even after editing outside of a @@ -710,7 +840,7 @@ if has('autocmd') \ setlocal textwidth=72 " Use the same comment string as for Vim files in Vimperator files. autocmd FileType vimperator setlocal commentstring=\"%s -" Use tex compiler for (La)TeX files. +" Use TeX compiler for (La)TeX files. autocmd FileType tex compiler tex " FTDETECT AUTO COMMANDS