" Tom Ryder (tejr)'s vimrc: " " This file is not truly self-contained; it should run without errors on its " own without the accompanying plugins to which it refers near the end of this " file, but you'll get errors for some of the leader maps, for example. " Use UTF-8 by default wherever possible if has('multi_byte') set encoding=utf-8 scriptencoding utf-8 endif " Use different keys for global and local leaders if has('eval') let g:mapleader = '\' let g:maplocalleader = '_' endif " Load filetype settings, including filetype plugins and indent settings if has('autocmd') filetype plugin indent on endif " Options dependent on the syntax feature if has('syntax') && !has('g:syntax_on') " Use syntax highlighting with 150 lines of context silent! syntax enable silent! syntax sync minlines=150 " Opinionated; if the author is using color at all, it will probably be with " a dark background set background=dark " The 'sahara' colorscheme only works in the GUI or with 256 colors if has('gui_running') || &t_Co >= 256 silent! colorscheme sahara endif endif " Let me backspace over pretty much anything set backspace= set backspace+=indent " Spaces from 'audoindent' set backspace+=eol " Line breaks set backspace+=start " The start of current insertion " Default to no backup files at all, in a way that even ancient/tiny Vims will " understand; the auto_cache_dirs.vim plugin will take care of re-enabling " this with a 'backupdir' setting set nobackup set nowritebackup " If backups are enabled, use a more explicit and familiar backup suffix set backupext=.bak " Allow jumping between windows and tabs to find an open instance of a given " buffer with :sbuffer. set switchbuf=useopen if v:version >= 701 set switchbuf+=usetab endif " Cycle back and forth through buffers. nnoremap [b :bprevious nnoremap ]b :bnext " Keep plenty of command and search history, because disk space is cheap set history=2000 " Always tell me the number of lines changed by a command set report=0 " Command-line based features if has('cmdline_info') " Show my current position in the status bar set ruler " Show the keystrokes being entered in the screen set showcmd " Show the mode we're using if not normal mode (e.g. --INSERT--) set showmode endif " \d inserts the current local date from date(1) nnoremap d :read !date " \D inserts the current UTC date from date(1) nnoremap D :read !date -u " 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') " Use the wild menu, both completing and showing all possible completions " with a single Tab press, just as I've configured Bash to do set wildmenu set wildmode=list:longest " Don't complete certain files that I'm not likely to want to manipulate " from within Vim: if has('wildignore') set wildignore+=*.a,*.o set wildignore+=*.bmp,*.gif,*.ico,*.jpg,*.png set wildignore+=.DS_Store,.git,.hg,.svn set wildignore+=*~,*.swp,*.tmp endif " Complete files without case sensitivity, if the option is available if exists('+wildignorecase') set wildignorecase endif endif " A few very important custom digraphs if has('digraphs') digraph ./ 8230 " Ellipsis (HORIZONTAL ELLIPSIS U+2026) digraph %% 8984 " Mac command key (PLACE OF INTEREST SIGN U+2318) digraph 8: 9731 " Snowman (SNOWMAN U+2603) endif " Set up short message settings set shortmess= set shortmess+=f " (file 3 of 5) -> (3 of 5) set shortmess+=i " [Incomplete last line] -> [eol] set shortmess+=I " I donated to Uganda, thanks Bram set shortmess+=l " 999 lines, 888 characters -> 999L, 888C set shortmess+=m " [Modified] -> [+] set shortmess+=n " [New File] -> [New] set shortmess+=o " Don't stack file writing messages set shortmess+=O " Don't stack file reading messages set shortmess+=r " [readonly] -> [RO] set shortmess+=t " Truncate file message at start if too long set shortmess+=T " Truncate other message in midle if too long set shortmess+=w " written -> [w], appended -> [a] set shortmess+=x " [dos format] -> [dos] " Don't show whitespace characters or end-of-line characters visually by " default, but make \l toggle between them set nolist nnoremap l :set list! list? " Don't show line numbers by default, but \n toggles them set nonumber nnoremap n :set number! number? " Bind \p to show filetype nnoremap p :set filetype? " Use all ancestors of current directory for :find if has('file_in_path') set path=** endif " If the Vim buffer for a file doesn't have any changes and Vim detects the " file has been altered, quietly update it set autoread " Save a file automatically if I change buffers or perform operations with the " argument list; this is particularly helpful for me as I don't use 'hidden' set autowrite " Don't use modelines at all, they're apparently potential security problems " and I've never used them anyway set nomodeline " I really like ZZ and ZQ, so I wrote a couple more mappings; ZW forces a " write of the current buffer, but doesn't quit, and ZA forces a write of all " buffers but doesn't quit nnoremap ZW :write! nnoremap ZA :wall! " 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 " \f shows the current formatoptions at a glance nnoremap f :setlocal formatoptions? " Match all forms of brackets in pairs (including angle brackets) set matchpairs+=<:> " Change and delete with C and D both cut off the remainder of the line from " the cursor, but Y yanks the whole line, which is inconsistent (and can be " done with yy anyway); this fixes it so it only yanks the rest of the line nnoremap Y y$ " Allow the cursor to get to the top or bottom of the screen before scrolling " vertically, but set a reasonably wide gutter for scrolling horizontally; no " particular reason, just suits me better set scrolloff=0 set sidescrolloff=16 " Rebind in normal mode as a lazy scroll nnoremap " Some special settings for searching, if available if has('extra_search') " Searching as I enter my pattern, \i toggles this set incsearch nnoremap i :set incsearch! incsearch? " Highlight search results, \h toggles this set hlsearch nnoremap h :set hlsearch! hlsearch? " Pressing ^L will clear highlighting until the next search-related " operation; quite good because the highlighting gets distracting after " you've found what you wanted nnoremap :nohlsearch endif " Configure spell checking features, if available if has('spell') " Don't check spelling by default, but bind \s to toggle this set nospell nnoremap s :setlocal spell! spell? " Use New Zealand English for spelling by default (it's almost identical " to British English), but bind \u to switch to US English and \z to " switch back set spelllang=en_nz nnoremap u :setlocal spelllang=en_us spelllang? nnoremap z :setlocal spelllang=en_nz spelllang? endif " Preserve the flags for a pattern when repeating a substitution with &; I " don't really understand why this isn't a default, but there it is nnoremap & :&& " Same again for visual mode; we use vnoremap rather than xnoremap to stay " compatible with old Vims without doing :execute dances vnoremap & :&& " Default to no swap files at all, in a way that even ancient/tiny Vims will " understand; the auto_cache_dirs.vim plugin will take care of re-enabling " this with a 'directory' setting set noswapfile " 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= " Don't bother about checking whether Escape is being used as a means to enter " a Meta-key combination, just register Escape immediately if exists('+esckeys') set noesckeys endif " Don't bother drawing the screen while executing macros or other automated or " scripted processes, just draw the screen as it is when the operation " completes set lazyredraw " Improve redrawing smoothness by assuming that my terminal is reasonably " fast set ttyfast " Never use any kind of bell, visual or not set visualbell t_vb= " Require less than one second between keys for mappings to work correctly set timeout set timeoutlen=1000 " Require less than a twentieth of a second between keys for key codes to work " correctly; I don't use Escape as a meta key anyway set ttimeout set ttimeoutlen=50 " Rebind Ctrl-C in insert mode to undo the current insert operation inoremap u " Keep screeds of undo history set undolevels=2000 " 'undodir' and 'undofile' settings will be taken care of by the " auto_cache_dirs.vim plugin if applicable/possible if has('persistent_undo') set noundofile endif " When in visual block mode, let me move the cursor anywhere in the buffer; " don't restrict me only to regions with text if has('virtualedit') set virtualedit+=block endif " Adopt the indent of the last line on new lines 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 " 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 " Configuration for window features if has('windows') " Show the status in a distinct bar above the command line only if there's " more than one window on the screen or in the current tab set laststatus=1 " Don't resize windows we're not splitting (Tmux-like; think Mondrian) set noequalalways " New split windows appear below or to the right of the existing window, " not above or to the left per the default set splitbelow if has('vertsplit') set splitright endif " Only show the tab bar if there's more than one tab if exists('+showtabline') set showtabline=1 endif " Get rid of visually noisy folding characters if has('folding') let &fillchars = 'diff: ,fold: ,vert: ' endif endif " Don't wrap by default, but use \w to toggle it on or off quickly set nowrap nnoremap w :set wrap! wrap? " When wrapping text, if a line is so long that not all of it can be shown on " the screen, show as much as possible anyway; by default Vim fills the left " 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:> " Swap the j/gj and k/gk command pairs so that we move by screen row, not " buffer line, with j/k nnoremap j gj nnoremap k gk nnoremap gj j nnoremap gk k " Line break settings and mappings if has('linebreak') " Break lines at word boundaries if possible set linebreak " Precede continued lines with '...' set showbreak=... " If we have the option, indent wrapped lines as much as the first line if exists('+breakindent') set breakindent endif endif " Disable most core plugin stuff that I don't use; after/plugin/dist.vim " clears these variables later if has('eval') " 2html.vim is often useful, so keep that " matchparen.vim I use constantly " I handle versioning plugins manually, and have never used .vba let g:loaded_getscriptPlugin = 1 let g:loaded_vimballPlugin = 1 " This is what grep, sed, Awk, and Perl are for let g:loaded_logiPat = 1 " ^Z, my dudes let g:loaded_netrwPlugin = 1 " Vim servers? What is this, Emacs? let g:loaded_rrhelper = 1 " System dictionaries plus custom per-machine spell files are fine let g:loaded_spellfile_plugin = 1 " If I want to read a file or a file archived within it I'll decompress or " unarchive it myself; a text editor should not do this let g:loaded_gzip = 1 let g:loaded_tarPlugin = 1 let g:loaded_zipPlugin = 1 endif " Insert blank lines above and below via my custom unimpaired.vim rip nmap [ PutBlankLinesAbove nmap ] PutBlankLinesBelow " \b toggles copy-pasteable linebreak settings nmap b CopyLinebreakToggle " \m in visual/select mode starts a mail message with the selected lines vmap m MailMuttSelected " \m in normal mode starts a mail message with the current line nmap m MailMuttLine " \M in normal mode starts a mail message with the whole buffer nmap M MailMuttBuffer " \x strips trailing whitespace via a custom plugin nmap x StripTrailingWhitespace " Use toggle_option_flag.vim plugin to bind quick toggle actions for some " 'formatoptions' flags if has('user_commands') " \a: Reformat paragraphs to 'textwidth' on all insert or delete operations nnoremap a :ToggleOptionFlagLocal formatoptions a " \c: Reformat comments to 'textwidth' nnoremap c :ToggleOptionFlagLocal formatoptions c " \j: Delete comment leaders when joining lines nnoremap j :ToggleOptionFlagLocal formatoptions j " \t: Reformat non-comment text to 'textwidth' nnoremap t :ToggleOptionFlagLocal formatoptions t endif " Add the packaged version of matchit.vim included in the distribution, if " possible; plugin/macros.vim loads this for older Vims if has('packages') silent! packadd! matchit endif " Source all .vim files from ~/.vim/config, which may override any of the " above runtime! config/*.vim