" Tom Ryder (tejr)'s vimrc: " Requires Vim 7.0 or newer with +eval. " Set an environment variable for the user runtime directory, if not already " set; use the first element of &runtimepath, rather like 'spellfile' if !exists('$MYVIM') && &runtimepath !=# '' let $MYVIM = vimrc#SplitOption(&runtimepath)[0] endif " The all-important default indent settings; filetypes to tweak set autoindent " Use indent of previous line on new lines set expandtab " Use spaces instead of tabs set shiftwidth=4 " Indent with four spaces " Make insert mode tab key add the same number of spaces as 'shiftwidth', use " negative value to do this dynamically, if Vim is new enough to support it let &softtabstop = vimrc#Version('7.3.693') ? -1 : &shiftwidth " Let me backspace over pretty much anything set backspace+=eol " Line breaks set backspace+=indent " Spaces from 'autoindent' set backspace+=start " Before the start of current insertion " Keep backup files in dedicated directory; add trailing double-slash to keep " full path in name, if Vim is new enough to support that set backup execute 'set backupdir^='.vimrc#EscapeSetPart( \ $MYVIM.'/cache/backup'.(vimrc#Version('8.1.251') ? '//' : '') \ ) call vimrc#Establish(&backupdir) " Add some *nix paths not to back up if has('unix') set backupskip& " Reset to avoid duplicates (Vim bug?) set backupskip+=/dev/shm/* " Shared memory RAM disk set backupskip+=/usr/tmp/* " Hard-coded path for `sudo -e` 1/2 set backupskip+=/var/tmp/* " Hard-coded path for `sudo -e` 2/2 endif " Indent wrapped lines if exists('+breakindent') " v7.4.338 set breakindent endif " Clear default 'comments' and 'commentstring', filetype to handle set comments= set commentstring= " Add completion options set completeopt+=longest " Insert longest common substring set completeopt+=menuone " Show the menu even if only one match " Give me a prompt instead of just rejecting risky :write, :saveas set confirm " Sentence objects are separated by two spaces set cpoptions+=J " Specify where to look for a dictionary even if 'spell' isn't on set dictionary^=/usr/share/dict/words " Keep swap files in dedicated directory, named with full path execute 'set directory^='.vimrc#EscapeSetPart( \ $MYVIM.'/cache/swap//' \ ) call vimrc#Establish(&directory) " If the environment didn't set an encoding, use UTF-8, not ASCII if !exists('$LANG') set encoding=utf-8 endif " Don't wait for a key after Escape in insert mode if exists('+esckeys') " No such option in Neovim set noesckeys endif " Fold based on indent, but only when I ask set foldlevelstart=99 set foldmethod=indent " Automatic formatting options set formatoptions+=l " Don't break a long line in insert mode set formatoptions+=1 " Avoid breaking lines after one-letter words if vimrc#Version('7.3.541') set formatoptions+=j " Delete comment leaders when joining lines endif if vimrc#Version('8.1.728') set formatoptions+=p " Don't break a single space after a period endif " Don't load GUI menus; set here before GUI starts or any filetype or syntax " logic is performed if has('gui_running') set guioptions+=M endif " Allow buffers to have changes without being displayed set hidden " Keep much more command and search history set history=2000 " Highlight completed searches; clear on reload set hlsearch nohlsearch " Don't assume I'm editing C; let the filetype set this set include= " Show search matches as I type my pattern set incsearch " Don't show a status line if there's only one window " This is Vim's default, but not Neovim's set laststatus=1 " Don't redraw the screen during batch execution set lazyredraw " Break lines at word boundaries set linebreak " Define extra 'list' display characters set listchars&vi " Neovim adds duplicates otherwise set listchars+=tab:>- " Tab characters, preserve width set listchars+=trail:- " Trailing spaces set listchars+=extends:> " Unwrapped text to screen right set listchars+=precedes:< " Unwrapped text to screen left set listchars+=nbsp:+ " Non-breaking spaces " Show matching brackets a bit more briefly set matchtime=3 " Don't allow setting options via buffer content set nomodeline " Treat numbers with a leading zero as decimal, not octal set nrformats-=octal " Don't search /usr/include by default set path-=/usr/include " Disable command line display of file position if a system vimrc or Neovim " has switched it on set noruler " Remove Debian's 'runtimepath' addenda if present set runtimepath-=/var/lib/vim/addons set runtimepath-=/var/lib/vim/addons/after " Make sessions usable set sessionoptions-=localoptions " No buffer options or mappings set sessionoptions-=options " No global options or mappings " Don't show startup splash screen (I donated) set shortmess+=I " Prefix wrapped rows with three dots set showbreak=... " Jump to matching bracket when typed in insert mode set showmatch " New window positioning set splitbelow " Below the current window, not above set splitright " Right of the current window, not left " Don't try to syntax highlight run-on lines set synmaxcol=500 " Add thesaurus; install with `make install-vim-thesaurus` execute 'set thesaurus^='.vimrc#EscapeSetPart( \ $MYVIM.'/ref/thesaurus.txt' \ ) " PuTTY is a fast terminal, but Vim doesn't know that yet if &term =~# '^putty' set ttyfast endif " Don't use terminal mouse support, even if it would work; the manual says to " set 't_RV' to do this, but that doesn't seem to work if exists('+ttymouse') " No such option in Neovim set ttymouse= endif " Keep persistent undo files in dedicated directory, named with full path if has('persistent_undo') " v7.2.438 set undofile execute 'set undodir^='.vimrc#EscapeSetPart( \ $MYVIM.'/cache/undo//' \ ) call vimrc#Establish(&undodir) endif " Keep the viminfo file in the home Vim directory, mostly to stop history " getting clobbered when something runs Vim without using this vimrc if exists('+viminfofile') " Use new option method if we can (v8.1.716) set viminfofile=$MYVIM/cache/viminfo else " Resort to clunkier method with 'viminfo' option flag execute 'set viminfo+='.vimrc#EscapeSet( \ 'n'.$MYVIM.'/cache/viminfo' \ ) endif " Let me move beyond buffer text in visual block mode set virtualedit+=block " Never beep at me set visualbell t_vb= " Tab completion settings set wildignore=*~,#*#,*.7z,.DS_Store,.git,.hg,.svn,*.a,*.adf,*.asc,*.au,*.aup \,*.avi,*.bin,*.bmp,*.bz2,*.class,*.db,*.dbm,*.djvu,*.docx,*.exe \,*.filepart,*.flac,*.gd2,*.gif,*.gifv,*.gmo,*.gpg,*.gz,*.hdf,*.ico \,*.iso,*.jar,*.jpeg,*.jpg,*.m4a,*.mid,*.mp3,*.mp4,*.o,*.odp,*.ods,*.odt \,*.ogg,*.ogv,*.opus,*.pbm,*.pdf,*.png,*.ppt,*.psd,*.pyc,*.rar,*.rm \,*.s3m,*.sdbm,*.sqlite,*.swf,*.swp,*.tar,*.tga,*.ttf,*.wav,*.webm,*.xbm \,*.xcf,*.xls,*.xlsx,*.xpm,*.xz,*.zip if exists('+wildignorecase') " v7.3.072 set wildignorecase " Case insensitive tab completion endif set wildmode=list:longest " Tab press completes and lists " Load filetype settings, plugins, and maps filetype plugin indent on " Use syntax highlighting if !exists('syntax_on') syntax enable endif " Try to use sahara color scheme with 'cursorline' set; otherwise, use the " default color scheme with a dark background try colorscheme sahara set cursorline catch syntax reset set background=dark set nocursorline endtry " Space bar scrolls down a page, :next at buffer's end if plugin available if vimrc#PluginReady('scroll_next') nmap (ScrollNext) else nnoremap endif " Remap insert Ctrl-C to undo the escaped insert operation, but don't break " the key if the plugin isn't there if vimrc#PluginReady('insert_cancel') imap (InsertCancel) endif " Map double Ctrl-K in insert mode to search digraph names imap (DigraphSearch) " Stack Ctrl-L to clear search highlight, make it work in insert mode too nnoremap :nohlsearch vnoremap :nohlsearchgv inoremap :nohlsearch " Remap normal/visual & and g& to preserve substitution flags nnoremap & :&& xnoremap & :&& nnoremap g& :%&& " Map g: as a 'colon operator' nmap g: (ColonOperator) " Cycle through argument list nnoremap [a :previous nnoremap ]a :next " Cycle through buffers nnoremap [b :bprevious nnoremap ]b :bnext " Cycle through quickfix list items nnoremap [c :cprevious nnoremap ]c :cnext " Cycle through location list items nnoremap [l :lprevious nnoremap ]l :lnext " Insert blank lines around current line nmap [ (PutBlankLinesAbove) nmap ] (PutBlankLinesBelow) " Set leader keys let mapleader = '\' let maplocalleader = ',' " \a toggles 'formatoptions' 'a' flag using a plugin nnoremap a :ToggleFlagLocal formatoptions a " \b toggles settings friendly to copying and pasting nmap b (CopyLinebreakToggle) " \c toggles 'cursorline'; no visual mode map as it doesn't work nnoremap c :setlocal cursorline! cursorline? " \C toggles 'cursorcolumn'; works in visual mode nnoremap C :setlocal cursorcolumn! cursorcolumn? xnoremap C :setlocal cursorcolumn! cursorcolumn?gv " \d inserts the local date (POSIX date) nnoremap d :read !date " \D inserts the UTC date (POSIX date) nnoremap D :read !date -u " \e forces a buffer to be editable nnoremap e :setlocal modifiable noreadonly " \f shows the current 'formatoptions' at a glance nnoremap f :setlocal formatoptions? " \F reloads filetype plugins nnoremap F :doautocmd filetypedetect BufRead " \g shows the current file's fully expanded path nnoremap g :echo expand('%:p') " \G changes directory to the current file's location nnoremap G :cd %:hpwd " \h toggles highlighting search results nnoremap h :set hlsearch! hlsearch? " \H shows command history nnoremap H :history : " \i toggles showing matches as I enter my pattern nnoremap i :set incsearch! incsearch? " \j jumps to buffers ("jetpack") nnoremap j :buffers:buffer " \k shows my marks nnoremap k :marks " \l toggles showing tab, end-of-line, and trailing white space nnoremap l :setlocal list! list? xnoremap l :setlocal list! list?gv " \L toggles 'colorcolumn' showing 'textwidth' nnoremap L :ToggleFlagLocal colorcolumn +1 xnoremap L :ToggleFlagLocal colorcolumn +1gv " \m shows normal maps nnoremap m :map " \M shows buffer-local normal maps nnoremap M :map " \n toggles line number display nnoremap n :setlocal number! number? xnoremap n :setlocal number! number?gv " \N toggles position display in bottom right nnoremap N :set ruler! ruler? xnoremap N :set ruler! ruler?gv " \o opens a line below in paste mode nmap o (PasteOpenBelow) " \O opens a line above in paste mode nmap O (PasteOpenAbove) " \p toggles paste mode nnoremap p :set paste! paste? " \P creates the path to the current file nnoremap P :call mkdir(expand('%:h'), 'p') " \q formats the current paragraph nnoremap q gqap " \r acts as a replacement operator nmap r (ReplaceOperator) xmap r (ReplaceOperator) " \R reloads ~/.vimrc nnoremap R :source $MYVIMRC " \s toggles spell checking nnoremap s :setlocal spell! spell? " \S shows loaded scripts nnoremap S :scriptnames " \t shows current filetype nnoremap t :setlocal filetype? " \T clears filetype nnoremap T :setlocal filetype= " \u sets US English spelling (compare \z) nnoremap u :setlocal spelllang=en_us " \v shows all global variables nnoremap v :let g: v: " \V shows all local variables nnoremap V :let b: t: w: " \w toggles wrapping nnoremap w :setlocal wrap! wrap? xnoremap w :setlocal wrap! wrap?gv " \x strips trailing whitespace via a custom plugin nnoremap x :StripTrailingWhitespace xnoremap x :StripTrailingWhitespace " \X squeezes repeated blank lines via a custom plugin nnoremap X :SqueezeRepeatBlanks xnoremap X :SqueezeRepeatBlanks " \y shows all registers nnoremap y :registers " \z sets NZ English spelling (compare \u) nnoremap z :setlocal spelllang=en_nz " \= runs the whole buffer through =, preserving position nnoremap = :KeepPosition normal! 1G=G " \+ runs the whole buffer through gq, preserving position nnoremap + :KeepPosition normal! 1GgqG " \. runs the configured make program into the location list nnoremap . :lmake! " \< and \> adjust indent of last edit; good for pasting nnoremap :'[,'] nnoremap > :'[,']> " \_ uses last changed or yanked text as an object onoremap _ :normal! `[v`] " \% uses entire buffer as an object onoremap % :normal! 1GVG " \{ and \} move to lines with non-space chars before current column map { (VerticalRegionUp) sunmap { map } (VerticalRegionDown) sunmap } " \/ types :vimgrep for me ready to enter a search pattern nnoremap / :vimgrep /\c/j ** " \? types :lhelpgrep for me ready to enter a search pattern nnoremap ? :lhelpgrep \c " \* escapes regex metacharacters nmap * (RegexEscape) xmap * (RegexEscape) " \\ jumps to the last edit position mark, like g;, but works as a motion " "Now, where was I?" (tap-tap) nnoremap \ `" xnoremap \ `" " \DEL deletes the current buffer nnoremap :bdelete " \INS edits a new buffer nnoremap :enew " \TAB toggles 'autoindent' nnoremap :setlocal autoindent! autoindent? " Some useful abbreviations inoreabbrev tr@ tom@sanctum.geek.nz inoreabbrev tr/ " Things I almsot always type wrnog inoreabbrev almsot almost inoreabbrev wrnog wrong inoreabbrev Fielding Feilding inoreabbrev THe the inoreabbrev THere there " Reload this file when I save it, modified or nay augroup vimrc autocmd! autocmd BufWritePost $MYVIMRC,$MYVIM/vimrc \ source $MYVIMRC augroup END