" " Tom Ryder (tejr)'s vimrc " ======================== " " " " This is a 'literate vimrc', in the Donald Knuth tradition. It's long, and " comments abound. " " This file should be saved as "vimrc" in the user runtime directory. On " Unix-like operating systems, this is ~/.vim; on Windows, it's ~/vimfiles. " It requires Vim 7.0 or newer with +eval, not running in &compatible mode. " The vimrc stub at ~/.vimrc on Unix or ~/_vimrc on Windows checks that these " conditions are met before loading this file. " " > And I was lifted up in heart, and thought " > Of all my late-shown prowess in the lists, " > How my strong lance had beaten down the knights, " > So many and famous names; and never yet " > Had heaven appeared so blue, nor earth so green, " > For all my blood danced in me, and I knew " > That I should light upon the Holy Grail. " > --Tennyson " " We'll start by removing unwanted addenda to 'runtimepath' from Debian " GNU/Linux's debian.vim, so that any Vim script installed at the system level " is ignored, since we don't want it interfering with our personal setup. " This doesn't raise an error if the paths aren't present, so we don't need to " check if they're already there. " set runtimepath-=/var/lib/vim/addons set runtimepath-=/var/lib/vim/addons/after " Splitting the values of a comma-separated option like 'runtimepath' " correctly, which we'll need to do a few times throughout this file, is a bit " more complicated than it seems. The list separator is more accurately " defined as a comma that is not preceded by a backslash, and which is " followed by any number of spaces and/or further commas. " " The pattern required for the split breaks down like this: " " \\ Literal backslash " \@R mapping prescribed later in this " file, add a hook that re-runs filetype detection and thereby ftplugin " loading. This is chiefly so that any global options set in this file don't " trample over needed buffer-local settings. " " If there's stuff in any of your ftplugins that doesn't cope well with being " reloaded, and just assumes a single BufRead event, it might be necessary to " rewrite those parts to be idempotent, or to add load guards around them so " that they only run once. " " Note that the SourceCmd event wasn't added until Vim 7.0.187, so we need to " check it exists first. " if exists('##SourceCmd') " We can't wrap this in a script-local function like I normally would, " because without a load guard around it, Vim will get upset that we're " trying to redefine that function the next time this script loads. " " So, we just inline the whole thing into the hook. It's only four " commands, anyway, and I'd rather most if not all of the vimrc was reloaded " when we source it. " autocmd vimrc SourceCmd $MYVIMRC,$MYVIM/vimrc \ source \|if exists('#filetypedetect#BufRead') \| doautocmd filetypedetect BufRead \|endif endif " We'll start our options by modernising a little in adjusting some options " with language-specific defaults. " " Traditional vi was often used for development in the C programming language. " The default values for a lot of Vim's options still reflect this common use " pattern. In this case, the 'comments' and 'commentstring' options reflect " the C syntax for comments: " " /* " * This is an ANSI C comment. " */ " " Similarly, the 'define' and 'include' options default to C preprocessor " directives: " " #define FOO "bar" " " #include "baz.h" " " Times change, however, and I don't get to work with C nearly as much as I'd " like. The defaults for these options no longer make sense, and so we blank " them, compelling filetype plugins to set them as they need instead. " set comments= commentstring= define= include= " The default value for the 'path' option is similar in that it has an aged " default; this option specifies directories in which project files and " includes can be unearthed by navigation commands like 'gf'. Specifically, " its default value comprises /usr/include, which is another C default. Let's " get rid of that, too. " set path-=/usr/include " Next, we'll adjust the global indentation settings. In general and as " a default, I prefer spaces to tabs, and I like to use four of them, for " a more distinct visual structure. Should you happen to disagree with this, " I cordially invite you to fite me irl. " " " " Filetype indent plugins will often refine these settings for individual " buffers. For example, 'expandtab' is not appropriate for Makefiles, nor for " the Go programming language. For another, two-space indents are more " traditional for Vim script. " set autoindent " Use indent of previous line on new lines set expandtab " Insert spaces when tab key is pressed in insert mode set shiftwidth=4 " Indent command like < and > use four-space indents " Apply 'softtabstop' option to make a tab key press in insert mode insert the " same number of spaces as defined by the indent depth in 'shiftwidth'. If " Vim is new enough to support it (v7.3.693), apply a negative value to do " this dynamically if 'shiftwidth' changes. " if v:version > 730 || v:version == 730 && has('patch693') set softtabstop=-1 else let &softtabstop = &shiftwidth endif " Relax traditional vi's harsh standards over what regions of the buffer can " be removed with backspace in insert mode. While this admittedly allows bad " habits to continue, since insert mode by definition is not really intended " for deleting text, I feel the convenience outweighs that in this case. " set backspace+=eol " Line breaks set backspace+=indent " Leading whitespace characters created by 'autoindent' set backspace+=start " Text before the start of the current insertion " Enable automatic backups of most file buffers. In practice, I don't need " these backups very much if I'm using version control sensibly, but they have " still saved my bacon a few times. " set backup " Try to keep the aforementioned backup files in a dedicated cache directory, " to stop them proliferating next to their prime locations and getting " committed to version control repositories. Create that directory if needed, " too, with restrictive permissions. " " If Vim is new enough (v8.1.251), add two trailing slashes to the path we're " inserting, which prompts Vim to incorporate the full escaped path in the " backup filename, avoiding collisions. " " As a historical note, other similar directory path list options supported " this trailing slashes hint for a long time before 'backupdir' caught up to " them. The 'directory' option for swapfiles has supported it at least as far " back as v5.8.0 (2001), and 'undodir' appears to have supported it since its " creation in v7.2.438. Even though the :help for 'backupdir' didn't say so, " people assumed it would work the same way, when in fact Vim simply ignored " it until v8.1.251. " " I don't want to add the slashes to the option value in older versions of Vim " where they don't do anything, so I check the version to see if there's any " point adding them. " " It's all so awkward. Surely options named something like 'backupfullpath', " 'swapfilefullpath', and 'undofullpath' would have been clearer. " if has('patch-8.1.251') set backupdir^=$MYVIM/cache/backup// else set backupdir^=$MYVIM/cache/backup endif let s:backupdir = split(&backupdir, s:option_split_pattern)[0] if exists('*mkdir') && !isdirectory(s:backupdir) call mkdir(s:backupdir, '', 0700) endif " Files in certain directories on Unix-compatible filesystems should not be " backed up for reasons of privacy, or an intentional ephemerality, or both. " This is particularly important if editing temporary files created by " sudoedit(8). We add a few paths to the default value of 'backupskip' here " in order to prevent the creation of such undesired backup files. " if has('unix') " Vim doesn't seem to check patterns added to 'backupskip' for uniqueness, " so adding them repeatedly if this file is reloaded results in duplicates. " This might be a bug in Vim. To work around this, we reset the path back " to its default first. " set backupskip& " * /dev/shm: RAM disk, default path for password-store's temporary files " * /usr/tmp: Hard-coded path for sudoedit(8) [1/2] " * /var/tmp: Hard-coded path for sudoedit(8) [2/2] " set backupskip^=/dev/shm/*,/usr/tmp/*,/var/tmp/* endif " The visual structure of code provided by indents breaks down if a lot of the " lines wrap. Ideally, most if not all lines would be kept below 80 " characters, but in cases where this isn't possible, soft-wrapping longer " lines when 'wrap' is on so that the indent is preserved in the following " line mitigates this breakdown somewhat. " " This option wasn't added until v7.4.338, so we need to check it exists " before we set it. " if exists('+breakindent') set breakindent endif " Rather than rejecting operations like :write or :saveas when 'readonly' is " set, and other situations in which data might be lost or I'm acting against " an option, Vim should give me a prompt to allow me to confirm that I know " what I'm doing. " set confirm " After staunchly opposing it for years, I have converted to two-spacing. You " can blame Steve Losh: " " " " Consequently, we specify that sentence objects for the purposes of the 's' " text object, the '(' and ')' sentence motions, and formatting with the 'gq' " command must be separated by *two* spaces. One space does not suffice. " " My defection to the two-spacers is the reason I now also leave 'joinspaces' " set, per its default, so that two spaces are inserted when consecutive " sentences separated by a line break are joined onto one line by the 'J' " command. " set cpoptions+=J " For word completion in insert mode with CTRL-X CTRL-K, or if 'complete' " includes the 'k' flag, this specifies the path to the system dictionary to " find words. This makes the dictionary completion work consistently, even if " 'spell' isn't set at that moment. " " At some point, I may end up having to set this option along with 'spellfile' " a bit more intelligently to ensure that spell checking and dictionary " function consistently with reference to the same resources. " " It's not an error if this file doesn't exist; indeed, on some systems I use, " it doesn't. " set dictionary^=/usr/share/dict/words " Keep swap files for file buffers in a dedicated directory, rather than the " default of writing them to the same directory as the buffer file. Add two " trailing slashes to the path to prompt Vim to use the full escaped path in " its name, in order to avoid filename collisions. Create that path if " needed, too. " set directory^=$MYVIM/cache/swap// let s:directory = split(&directory, s:option_split_pattern)[0] if exists('*mkdir') && !isdirectory(s:directory) call mkdir(s:directory, '', 0700) endif " On Unix, I keep LANG defined in my environment, and it's almost always set " to a multibyte (UTF-8) locale. This informs Vim's choice of internal " character encoding, but the default for the 'encoding' option is latin1, " which is seldom what I want, and if I do want it, I'll specify it with LANG " or possibly a manual :set command. UTF-8 makes much more sense as a default " encoding if Vim can't glean what I want from LANG. " if !exists('$LANG') set encoding=utf-8 endif " If Vim receives an Escape key code in insert mode, it shouldn't wait to see " if it's going to be followed by another key code, despite this being how the " function keys and Meta/Alt modifier are implemented for many terminal types. " Otherwise, if I press Escape, there's an annoying delay before 'showmode' " stops showing "--INSERT--". " " This breaks the function keys and the Meta/Alt modifier in insert mode in " most or maybe all of the terminals I use, but I don't want those keys in " insert mode anyway. It all works fine in the GUI, of course. " " There's no such option as 'esckeys' in Neovim, which I gather has completely " overhauled its method of keyboard event handling, so we need to check " whether the option exists before we try to set it. " if exists('+esckeys') set noesckeys endif " By default, I prefer that figuring out where a region of text to fold away " should be done by the indent level of its lines, since I tend to be careful " about my indentation even in languages where it has no structure " significance. " set foldmethod=indent " That said, I don't want any folding to actually take place unless " I specifically ask for it. " " I think of a Vim window with a file buffer loaded as a two-dimensional " planar view of the file, so that moving down one screen line means moving " down one buffer line, at least when 'wrap' is unset. Folds break that " mental model, and so I usually enable them explicitly only when I'm " struggling to grasp some in-depth code with very long functions or loops. " " Therefore, we set the depth level at which folds should automatically start " as closed to a rather high number, per the documentation's recommendations. " set foldlevelstart=99 " Automatic text wrapping options using flags in the 'formatoptions' option " begin here. I allow filetypes to set 't' and 'c' to configure whether text " or comments should be wrapped, and so I don't mess with either of those " flags here. " If a line is already longer than 'textwidth' would otherwise limit when " editing of that line begins in insert mode, don't suddenly automatically " wrap it; I'll break it apart myself with a command like 'gq'. " set formatoptions+=l " Don't wrap a line in such a way that a single-letter word like "I" or "a" is " at the end of it. Typographically, as far as I can tell, this seems to be " a stylistic preference rather than a rule like avoiding "widow" and "orphan" " lines in typesetting. I think it generally looks better to have the short " word start the line. " set formatoptions+=1 " If the filetype plugins have correctly described what the comment syntax for " the buffer's language looks like, it makes sense to use that to figure out " how to join lines within comments without redunant comment leaders cropping " up. For example, with this set, in Vim, joining lines in this very comment " with 'J' would remove the leading '"' characters that denote a comment. " " This option flag wasn't added until v7.3.541. Because we can't test for the " availability of option flags directly, we resort to a version number check " before attempting to add the flag. " if v:version > 730 || v:version == 730 && has('patch541') set formatoptions+=j endif " Separating sentences with two spaces has an advantage in distinguishing " between two different types of periods: periods that abbreviate longer " words, as in "Mr. Moolenaar", and periods that terminate sentences, like " this one. " " If we're using two-period spacing for sentences, Vim can interpret the " different spacing to distinguish between the two types, and can avoid " breaking a line just after an abbreviating period. That means the two words " in "Mr. Moolenaar" should never be split apart, preventing confusion on the " reader's part, and also preserving the semantics of the period for " subsequent reformats. " " This is what the 'p' flag does. I wrote the patch that added it, after " becoming envious of an analogous feature during an ill-fated foray into GNU " Emacs usage. " " " if has('patch-8.1.728') set formatoptions+=p endif " In an effort to avoid loading unnecessary files, we add a flag to the " 'guioptions' option to prevent the menu.vim runtime file from being loaded. " It doesn't do any harm, but I never use it, and it's easy to turn it off. " " The documentation for this flag in `:help 'go-M'` includes a note saying the " flag should be set here, rather that in the GUI-specific gvimrc file, as one " might otherwise think. " if has('gui_running') set guioptions+=M endif " By default, Vim doesn't allow a file buffer to have unsaved changes if it's " not displayed in a window. Setting this option removes that restriction so " that buffers can be modified and not displayed. " " Despite this option being in almost every vimrc I read, I didn't personally " need it for years into my Vim career, because I instinctively only closed " windows onto buffers after the buffers within them were saved anyway. " " However, the option really is required for batch operations performed with " commands like :argdo or :bufdo. After I started using those a bit more " often, I realised I finally had a reason to turn this on, and so on it shall " stay. " set hidden " I don't think I'm ever likely to be in a situation where remembering several " thousand Vim commands and search patterns is going to severely tax memory, " let alone hard disk space. The maximum value for this option is documented " as 10000, so let's just use that. " set history=10000 " Do highlight completed searches, but clear them away on vimrc reload. Later " on in this file, CTRL-L in normal mode is remapped to stack on a :nohlsearch " as well. " set hlsearch nohlsearch " Show search matches as I type my pattern, including scrolling the screen if " necessary. This is somewhat jarring sometimes, particularly when the cursor " runs so far away from home, but I think the benefits of being able to see " instances of what I'm trying to match as I try to match it do outweight " that. " set incsearch " If there's only one window, I don't need a statusline to appear beneath it. " I very often edit only one file, and just open a :help buffer or two. This " is the Vim default, but Neovim changed it, so we'll explicitly set it to the " default here in case we're using Neovim. " set laststatus=1 " Don't waste cycles and bandwidth redrawing the screen during batch execution " of macros. I think this does amount to the occasional :redraw needing to be " in a script, but it's not too bad, and last I checked it really does speed " things up, especially for linewise operations on really big data sets. " 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 " I like the brief jump to the matching brackets provided by the 'showmatch' " option; the only change I want is for it to be a little quicker, so we'll " adjust that to 0.3 seconds. " set showmatch matchtime=3 " Don't let your editor's options be configured by content in arbitrary files! " Down with modelines! Purge them from your files! Écrasez l'infâme! " " I think that modelines are Vim's worst misfeature, and that 'nomodeline' " should be the default. It's enabled pretty bad security vulnerabilities " over the years, and it's a lot more effective to use filetype detection, " other automatic command hooks, or systems like .editorconfig to set " variables specifically for a buffer or project. " set nomodeline " The only octal numbers I can think of that I ever even encounter are Unix " permissions masks, and I'd never use CTRL-A or CTRL-X to increment them. " Numbers with leading zeroes are far more likely to be decimals. " set nrformats-=octal " I like to leave the last line of the screen blank unless something is " actually happening in it, so I have grown to like the Vim default of " 'noruler'. System vimrc files tend to turn this back on, though, and Neovim " has it on by default, so we will often need to put it back to normal. " set noruler " Sessions are great, but they don't play together well with plugins and " filetype plugins. Restoring the same settings from both reloaded plugins " and from the session causes screeds of errors. Adjusting session behaviour " to stop it trying to restore quite so much makes them useable. " set sessionoptions-=localoptions " No buffer options or mappings set sessionoptions-=options " No global options or mappings " Prefix wrapped rows with three dots set showbreak=... " 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` set thesaurus^=$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 set undodir^=$MYVIM/cache/undo// let s:undodir = split(&undodir, s:option_split_pattern)[0] if exists('*mkdir') && !isdirectory(s:undodir) call mkdir(s:undodir, '', 0700) endif 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 set viminfo+=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 globpath(&runtimepath, 'plugin/scroll_next.vim') !=# '' \ && &loadplugins 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 globpath(&runtimepath, 'plugin/insert_cancel.vim') !=# '' \ && &loadplugins 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