diff --git a/after/ftplugin/help.vim b/after/ftplugin/help.vim
index a766e81..ccd86d5 100644
--- a/after/ftplugin/help.vim
+++ b/after/ftplugin/help.vim
@@ -1,4 +1,8 @@
 " Disable spell checking which is enabled for text files
 setlocal nospell
+
 " Don't keep cursor from buffer edges
 setlocal scrolloff=0
+
+" Don't display line numbers
+setlocal nonumber norelativenumber
diff --git a/plugin/autocmds.vim b/plugin/autocmds.vim
new file mode 100644
index 0000000..cb5ba04
--- /dev/null
+++ b/plugin/autocmds.vim
@@ -0,0 +1,8 @@
+augroup reopen_at_last_cursor
+  autocmd!
+  " Reopening a file at last curson position
+  au FocusGained * set relativenumber
+  au FocusLost * set norelativenumber
+  au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
+          \ | exe "normal! g'\"" | endif
+augroup END
diff --git a/plugin/functions.vim b/plugin/functions.vim
new file mode 100644
index 0000000..5b92783
--- /dev/null
+++ b/plugin/functions.vim
@@ -0,0 +1,80 @@
+" Strip trailing whitespace
+function! <SID>StripWhitespace()
+  let l = line(".")
+  let c = col(".")
+  %s/\s\+$//e
+  call cursor(l, c)
+endfunction
+command! StripWhitespace :call <SID>StripWhitespace()
+augroup strip_white_space
+  " Strip whitespace on buffer write
+  autocmd!
+  autocmd BufWritePre * :call <SID>StripWhitespace()
+augroup END
+
+" Show highlight group under cursor
+map \hi :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") .
+  \ '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
+  \ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>
+
+" Stringify
+" Make a code block in to a C string literal
+function! <SID>Stringify()
+  " Escape existing escape characters
+  execute 's/\\/\\\\/ge'
+  " Escape quotes
+  execute 's/"/\\"/ge'
+  " Prepend quote
+  execute 's/^/"/g'
+  " Append carriage return, quote
+  execute 's/$/\\n"/g'
+  noh
+endfunction
+map <silent> <leader>s :call <SID>Stringify()<CR>
+" Make a C string literal in to a code block
+function! <SID>Destringify()
+  " Remove final quote and carriage return
+  execute 's/\\n"\s*$//ge'
+  " Remove first quote
+  execute 's:^\(\s*\)":\1:ge'
+  " Remove quote escapes
+  execute 's/\\"/"/ge'
+  " Remove escapes of escapes characters
+  execute 's/\\\\/\\/ge'
+  noh
+endfunction
+map <silent> <leader>S :call <SID>Destringify()<CR>
+
+" Invoke terminal command without prompt and then redraw.
+command! -nargs=+ Silent execute 'silent <args>' | redraw!
+
+" Set the tab width for the current filetype
+function! <SID>TabWidth(width)
+  execute "set tabstop=".a:width
+  execute "set shiftwidth=".a:width
+  execute "set softtabstop=".a:width
+  echo "Tab width is now ".a:width
+endfunction
+command! -nargs=1 TabWidth :call <SID>TabWidth(<f-args>)
+
+" Toggle task list bullet
+function! <SID>TaskToggle()
+  " Get current line
+  let l:line = getline('.')
+
+  " Get the ' ' or 'x' character from within the task bullet
+  let l:pattern = '[-\*+] \[\zs[ x]\ze]'
+  let l:char = matchstr(l:line, l:pattern)
+
+  " Toggle the ' ' or 'x' character
+  if l:char == 'x'
+    let l:char = ' '
+  else
+    let l:char = 'x'
+  endif
+
+  " Replace the current line with a new one
+  call setline(line('.'), substitute(l:line, l:pattern, l:char, ''))
+endfunction
+command! TaskToggle :call <SID>TaskToggle()
+nnoremap <leader>x :TaskToggle<CR>
diff --git a/plugin/mappings.vim b/plugin/mappings.vim
new file mode 100644
index 0000000..8d1f104
--- /dev/null
+++ b/plugin/mappings.vim
@@ -0,0 +1,59 @@
+" YouCompleteMe
+nnoremap <leader>fx :YcmCompleter FixIt<CR>
+nnoremap <leader>jd :YcmCompleter GoTo<CR>
+nnoremap <leader>gt :YcmCompleter GetType<CR>
+nnoremap <leader>gp :YcmCompleter GetParent<CR>
+nnoremap <leader>gd :YcmCompleter GetDoc<CR>
+nnoremap <leader>sd :YcmShowDetailedDiagnostic<CR>
+
+" DoxygenToolkit
+nnoremap <leader>d :Dox<CR>
+
+" Treat long lines as line containing breaks
+nnoremap j gj
+nnoremap k gk
+" Quick write
+map <leader>w :w!<CR>
+
+" Switch panes
+nnoremap <C-h> <C-w>h
+nnoremap <C-j> <C-w>j
+nnoremap <C-k> <C-w>k
+nnoremap <C-l> <C-w>l
+
+" Quick tabs
+exec "nmap <leader>tn :tabnew "
+nmap <leader>tc :tabclose<CR>
+nmap <leader>to :tabonly<CR>
+exec "nmap <leader>tm :tabmove "
+
+" Clear search highlights
+map <leader><Space> :noh<CR>
+
+" Quick clipboard yank/put
+map <leader>y "+y
+map <leader>Y "+Y
+map <leader>p "+p
+map <leader>P "+P
+
+" Jump to current location list item
+nmap <leader>ll :ll<CR>
+" Jump to next location list item
+nmap <leader>ln :lnext<CR>
+" Jump to previous location list item
+nmap <leader>lp :lprevious<CR>
+
+" Quickly access spelling menu
+imap <C-s> <C-g>u<C-X>s
+nmap <C-s> i<C-g>u<C-X>s
+
+" Disable 'Q' from opening Ex mode
+nmap Q <nop>
+" Disable 'K' from loading man pages in normal mode
+nmap K <nop>
+" Disable 'K' from loading man pages in visual mode
+vmap K <nop>
+
+" Split line at the cursor
+nnoremap [j i<CR><Esc>
+nnoremap ]j a<CR><Esc>
diff --git a/plugin/options.vim b/plugin/options.vim
new file mode 100644
index 0000000..58a2a97
--- /dev/null
+++ b/plugin/options.vim
@@ -0,0 +1,61 @@
+" Enable all mouse features
+set mouse=a
+
+" Don't show completeopt preview buffer
+set completeopt-=preview
+
+" Set window title to titlestring
+set title
+
+" Show relative line numbers & current line number
+set number
+
+" Keep cursor from buffer edges
+set scrolloff=8
+
+" Turn backup off
+set nobackup nowritebackup noswapfile
+
+" Wrap to whole words
+set wrap linebreak nolist
+
+" Don't add 2 spaces after end of sentence
+set nojoinspaces
+
+" Use Unix as standard file type
+set fileformats=unix,dos,mac
+
+" Allow : in filenames to allow gf to specify line numbers
+set isfname-=:
+
+" Highlight search matches & show search matches while typing
+set hlsearch
+
+" Set ignore search case unless mixed
+set ignorecase smartcase
+
+" Allow buffers with changes to be hidden
+set hidden
+
+" Open new splits on the other side of the axis
+set splitbelow splitright
+
+" Indicates a fast terminal connection
+set ttyfast
+
+" Set syntax as default fold method
+set foldmethod=syntax foldlevel=20
+
+" Automatically write changes to files
+set autowrite
+
+" Format text
+"   r - insert comment leader on 'o' and 'O'
+"   q - allow formatting with 'gq'
+set formatoptions+=rq
+
+" Enable modeline
+set modeline
+
+" Don't redraw during execution macros, registers, commands, etc.
+set lazyredraw
diff --git a/vimrc b/vimrc
index fb63079..49b866d 100644
--- a/vimrc
+++ b/vimrc
@@ -1,162 +1,183 @@
-" Config {{{
-if platform#is_windows()
-  set rtp+=~/.vim
-endif
-
-" Plugins {{{
-call plug#begin('~/.vim/plugs')
-
-" vim-airline improved status bar
+call plug#begin('~/.vim/plugs')
+" statusline, tabline {{{
+" vim-airline - improved status bar
 Plug 'vim-airline/vim-airline'
 let g:airline_left_sep=''
 let g:airline_right_sep=''
-" tabline.vim sanely numbered tabs
-Plug 'mkitt/tabline.vim'
 
-" TODO Find YouCompleteMe Windows setup that works
+" tabline.vim - sanely numbered tabs
+Plug 'mkitt/tabline.vim'
+" }}}
+" completion {{{
+" YouCompleteMe {{{
 if !platform#is_windows()
   " YouCompleteMe with parameter completion
   Plug 'oblitum/YouCompleteMe', {'do': './install.py --clang-completer'}
-endif
-let g:ycm_min_num_of_chars_for_completion=1
-let g:ycm_complete_in_comments=1
-let g:ycm_complete_in_strings=1
-let g:ycm_collect_identifiers_from_comments_and_strings=1
-let g:ycm_autoclose_preview_window_after_insertion = 1
-let g:ycm_seed_identifiers_with_syntax=1
-let g:ycm_always_populate_location_list=1
-let g:ycm_error_symbol="-▸"
-let g:ycm_warning_symbol="-▸"
-set completeopt-=preview
-nnoremap <leader>fx :YcmCompleter FixIt<CR>
-nnoremap <leader>jd :YcmCompleter GoTo<CR>
-nnoremap <leader>gt :YcmCompleter GetType<CR>
-nnoremap <leader>gp :YcmCompleter GetParent<CR>
-nnoremap <leader>gd :YcmCompleter GetDoc<CR>
-nnoremap <leader>sd :YcmShowDetailedDiagnostic<CR>
-" Quick toggle quickfix & location list
-Plug 'Valloric/ListToggle'
 
-" UltiSnips snippet engine
+  let g:ycm_min_num_of_chars_for_completion=1
+
+  let g:ycm_complete_in_comments=1
+  let g:ycm_complete_in_strings=1
+  let g:ycm_collect_identifiers_from_comments_and_strings=1
+  let g:ycm_seed_identifiers_with_syntax=1
+
+  let g:ycm_autoclose_preview_window_after_insertion = 1
+  let g:ycm_always_populate_location_list=1
+
+  let g:ycm_error_symbol="-▸"
+  let g:ycm_warning_symbol="-▸"
+  " TODO Find YouCompleteMe Windows setup that works
+endif
+" }}}
+
+" ultisnips - snippet engine
 Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
 
-" CMake completions & syntax
-Plug 'richq/vim-cmake-completion' | Plug 'rperier/vim-cmake-syntax'
+" vim-cmake-completion - completion & help
+Plug 'richq/vim-cmake-completion'
 
-" Completion for vimscript
+" vimomni - Completion for vimscript
 Plug 'vim-scripts/vimomni', {'for': ['vim']}
-
-" format.vim format with text objects
+" }}}
+" format {{{
+" format.vim - format with text objects
 if platform#is_linux()
   Plug 'git@bitbucket.org:infektor/format.vim.git'
 else
   Plug '~/Sandbox/format'
 endif
-
-" delimitMate paired delimiters
-Plug 'jiangmiao/auto-pairs'
-" Improved % matching
-Plug 'opennota/vim-matchit'
-" Tabulaize text with regex
-Plug 'godlygeek/tabular'
-" Display xterm color table
-Plug 'guns/xterm-color-table.vim'
-" Sane insert mode pasting from system clipboard
-Plug 'ConradIrwin/vim-bracketed-paste'
-" Open file:line at line from terminal
-Plug 'bogado/file-line'
-" Open file:line at line from command
-Plug 'kopischke/vim-fetch'
-
-" fzf CLI FuZzy Finder wrapper
-Plug 'junegunn/fzf', {'dir': '~/.fzf', 'do': './install --all --no-update-rc'}
-Plug 'junegunn/fzf.vim'
-exec 'nmap <C-f>f :Files '
-nmap <C-f>g :GitFiles<CR>
-exec 'nmap <C-f>a :Ag '
-nmap <C-f>b :Buffers<CR>
-nmap <C-f>l :BLines<CR>
-nmap <C-f>c :Commits<CR>
-nmap <C-f>h :Helptags<CR>
-nmap <C-f>s :Snippets<CR>
-
-" Library for creating text objects
+" }}}
+" text objects {{{
+" vim-textobj-user - library for creating text objects
 Plug 'kana/vim-textobj-user'
-" Entire file text object.
+
+" vim-textobj-entire - Entire file text object
 let g:textobj_entire_no_default_key_mappings = 1
 Plug 'kana/vim-textobj-entire'
 xmap a% <Plug>(textobj-entire-a)
 omap a% <Plug>(textobj-entire-a)
 xmap i% <Plug>(textobj-entire-i)
 omap i% <Plug>(textobj-entire-i)
-" Parameter text object
+
+" vim-textobj-parameter - Parameter text object
 Plug 'sgur/vim-textobj-parameter'
-" Underscope text object
+
+" vim-textobj-underscore - Underscope text object
 Plug 'lucapette/vim-textobj-underscore'
-" Comment block text object
+
+" vim-textobj-comment - Comment block text object
 Plug 'glts/vim-textobj-comment'
-" Conflict marker text object
+
+" vim-textobj-conflict - Conflict marker text object
 Plug 'rhysd/vim-textobj-conflict'
-
-" vim-commentary toggle comments
+" }}}
+" tpope {{{
+" vim-commentary - toggle comments
 Plug 'tpope/vim-commentary'
-" vim-surround edit delimiters
+
+" vim-surround - edit delimiters
 Plug 'tpope/vim-surround'
-" vim-repeat better dot command
+
+" vim-repeat - better dot command
 Plug 'tpope/vim-repeat'
-" vim-fugitive git wrapper
+
+" vim-fugitive - git wrapper
 Plug 'tpope/vim-fugitive'
-" vim-eunuch unix warppers
+
+" vim-eunuch - unix command warppers
 Plug 'tpope/vim-eunuch'
-" vim-vinegar improved directory browser
+
+" vim-vinegar - improved directory browser
 Plug 'tpope/vim-vinegar'
-" vim-abolish camelCase to under_score & stuff
+
+" vim-abolish - camelCase to under_score & stuff
 Plug 'tpope/vim-abolish'
-" vim-unimpaired for pairs of tasks
+
+" vim-unimpaired - for pairs of tasks
 Plug 'tpope/vim-unimpaired'
-" vim-sensible sane default settings
+
+" vim-sensible - sane default settings
 Plug 'tpope/vim-sensible'
-" vim-speeddating
+
+" vim-speeddating - sane date manipulation
 Plug 'tpope/vim-speeddating'
+" }}}
+" utility {{{
+" fzf.vim - Fuzzy finder {{{
+Plug 'junegunn/fzf', {'dir': '~/.fzf', 'do': './install --all --no-update-rc'}
+Plug 'junegunn/fzf.vim'
+exec 'nnoremap <C-f>f :Files '
+nnoremap <C-f>g :GitFiles<CR>
+exec 'nnoremap <C-f>a :Ag '
+nnoremap <C-f>b :Buffers<CR>
+nnoremap <C-f>l :BLines<CR>
+nnoremap <C-f>c :Commits<CR>
+nnoremap <C-f>h :Helptags<CR>
+nnoremap <C-f>s :Snippets<CR>
+" }}}
 
-" DoxygenToolkit documentation stubs
-Plug 'vim-scripts/DoxygenToolkit.vim'
-let g:DoxygenToolkit_commentType="C++"
-map <leader>d :Dox<CR>
-
-" vim-notes easy note taking
+" vim-notes - easy note taking {{{
 Plug 'xolox/vim-notes' | Plug 'xolox/vim-misc'
+
 let g:notes_directories = ['~/Sync/Notes']
 let g:notes_title_sync = 'rename_file'
 let g:notes_word_boundries = 1
+
 hi link notesTodo Todo
 hi link notesDoneMarker Note
 hi link notesXXX Important
+" }}}
 
 if !platform#is_windows()
   " Seemless vim/tmux pane navigation
   Plug 'christoomey/vim-tmux-navigator'
+
   " Enable focus events when in tmux session
   Plug 'tmux-plugins/vim-tmux-focus-events'
 endif
 
-" Markdown live browser preview
+" ListToggle - toggle quickfix and location lists
+Plug 'Valloric/ListToggle'
+
+" auto-pairs - paired delimiters
+Plug 'jiangmiao/auto-pairs'
+
+" vim-matchit - Improved % matching
+Plug 'opennota/vim-matchit'
+
+" tabular - Tabulaize text with regex
+Plug 'godlygeek/tabular'
+
+" xterm-color-table.vim - view term and hex colors
+Plug 'guns/xterm-color-table.vim'
+" }}}
+" syntax {{{
+" Improved syntax for C/C++
+Plug 'kbenzie/vim-native-syntax'
+let g:native_syntax#highlight_operators=1
+
+" DoxygenToolkit.vim - documentation stubs
+Plug 'vim-scripts/DoxygenToolkit.vim'
+let g:DoxygenToolkit_commentType="C++"
+
+" markdown live browser preview
 Plug 'suan/vim-instant-markdown'
-" Markdown folding
+
+" markdown folding
 Plug 'nelstrom/vim-markdown-folding'
 let g:markdown_fenced_languages=['cpp', 'c', 'cmake', 'sh', 'vim', 'python']
 
-" Foling form python
+" SimplyFold - python folding
 Plug 'tmhedberg/SimpylFold'
+
 " Syntax checking for python
 Plug 'nvie/vim-flake8', {'for': ['python']}
 
 " Folding for json
 Plug 'elzr/vim-json'
 
-" Improved syntax for C/C++
-Plug 'kbenzie/vim-native-syntax'
-let g:native_syntax#highlight_operators=1
+" cmake - syntax
+Plug 'rperier/vim-cmake-syntax'
 
 " GLSL syntax
 Plug 'tikhomirov/vim-glsl'
@@ -166,209 +187,11 @@ Plug 'beyondmarc/hlsl.vim'
 
 " OpenCL C syntax
 Plug 'frasercrmck/opencl.vim'
-
-" spir-vim in development
-Plug '~/spir-vim'
-" jira.vim in development
-Plug '~/jira.vim'
-
-call plug#end()
 " }}}
-
-" Mappings {{{
-" Enable all mouse features
-set mouse=a
-
-" Treat long lines as line containing breaks
-map j gj
-map k gk
-" Quick write
-map <leader>w :w!<CR>
-
-" Switch panes
-nnoremap <C-h> <C-w>h
-nnoremap <C-j> <C-w>j
-nnoremap <C-k> <C-w>k
-nnoremap <C-l> <C-w>l
-
-" Quick tabs
-exec "nmap <leader>tn :tabnew "
-nmap <leader>tc :tabclose<CR>
-nmap <leader>to :tabonly<CR>
-exec "nmap <leader>tm :tabmove "
-
-" Clear search highlights
-map <leader><Space> :noh<CR>
-
-" Quick clipboard yank/put
-map <leader>y "+y
-map <leader>Y "+Y
-map <leader>p "+p
-map <leader>P "+P
-
-" Jump to current location list item
-nmap <leader>ll :ll<CR>
-" Jump to next location list item
-nmap <leader>ln :lnext<CR>
-" Jump to previous location list item
-nmap <leader>lp :lprevious<CR>
-
-" Quickly access spelling menu
-imap <C-s> <C-g>u<C-X>s
-nmap <C-s> i<C-g>u<C-X>s
-
-" Disable 'Q' from opening Ex mode
-nmap Q <nop>
-" Disable 'K' from loading man pages in normal mode
-nmap K <nop>
-" Disable 'K' from loading man pages in visual mode
-vmap K <nop>
-
-" Split line at the cursor
-nnoremap [j i<CR><Esc>
-nnoremap ]j a<CR><Esc>
-" Mappings }}}
-
-" Behaviour {{{
-" Set window title to titlestring
-set title
-" Show relative line numbers & current line number
-set number
-" Keep cursor from buffer edges
-set scrolloff=8
-" Turn backup off
-set nobackup nowritebackup noswapfile
-
-" Wrap to whole words
-set wrap linebreak nolist
-" Don't add 2 spaces after end of sentence
-set nojoinspaces
-
-" Use Unix as standard file type
-set fileformats=unix,dos,mac
-" Allow : in filenames to allow gf to specify line numbers
-set isfname-=:
-
-" Highlight search matches & show search matches while typing
-set hlsearch
-" Set ignore search case unless mixed
-set ignorecase smartcase
-
-" Allow buffers with changes to be hidden
-set hidden
-" Open new splits on the other side of the axis
-set splitbelow splitright
-" Indicates a fast terminal connection
-set ttyfast
-" Set syntax as default fold method
-set foldmethod=syntax
-set foldlevel=20
-
-" Automatically write changes to files
-set autowrite
-
-" Format text
-"   r - insert comment leader on 'o' and 'O'
-"   q - allow formatting with 'gq'
-set formatoptions+=rq
-
-" Enable modeline
-set modeline
-
-" Don't redraw during execution macros, registers, commands, etc.
-set lazyredraw
-" Behaviour }}}
-
-" Autocommands {{{
-augroup reopen_at_last_cursor
-  autocmd!
-  " Reopening a file at last curson position
-  au FocusGained * set relativenumber
-  au FocusLost * set norelativenumber
-  au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
-          \ | exe "normal! g'\"" | endif
-augroup END
-" Autocommands }}}
-
-" Functions {{{
-" Strip trailing whitespace
-function! <SID>StripWhitespace()
-  let l = line(".")
-  let c = col(".")
-  %s/\s\+$//e
-  call cursor(l, c)
-endfunction
-command! StripWhitespace :call <SID>StripWhitespace()
-augroup strip_white_space
-  " Strip whitespace on buffer write
-  autocmd!
-  autocmd BufWritePre * :call <SID>StripWhitespace()
-augroup END
-
-" Show highlight group under cursor
-map \hi :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") .
-  \ '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
-  \ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>
-
-" Stringify
-" Make a code block in to a C string literal
-function! <SID>Stringify()
-  " Escape existing escape characters
-  execute 's/\\/\\\\/ge'
-  " Escape quotes
-  execute 's/"/\\"/ge'
-  " Prepend quote
-  execute 's/^/"/g'
-  " Append carriage return, quote
-  execute 's/$/\\n"/g'
-  noh
-endfunction
-map <silent> <leader>s :call <SID>Stringify()<CR>
-" Make a C string literal in to a code block
-function! <SID>Destringify()
-  " Remove final quote and carriage return
-  execute 's/\\n"\s*$//ge'
-  " Remove first quote
-  execute 's:^\(\s*\)":\1:ge'
-  " Remove quote escapes
-  execute 's/\\"/"/ge'
-  " Remove escapes of escapes characters
-  execute 's/\\\\/\\/ge'
-  noh
-endfunction
-map <silent> <leader>S :call <SID>Destringify()<CR>
-
-" Invoke terminal command without prompt and then redraw.
-command! -nargs=+ Silent execute 'silent <args>' | redraw!
-
-" Set the tab width for the current filetype
-function! <SID>TabWidth(width)
-  execute "set tabstop=".a:width
-  execute "set shiftwidth=".a:width
-  execute "set softtabstop=".a:width
-  echo "Tab width is now ".a:width
-endfunction
-command! -nargs=1 TabWidth :call <SID>TabWidth(<f-args>)
-
-" Toggle task list bullet
-function! <SID>TaskToggle()
-  " Get current line
-  let l:line = getline('.')
-
-  " Get the ' ' or 'x' character from within the task bullet
-  let l:pattern = '[-\*+] \[\zs[ x]\ze]'
-  let l:char = matchstr(l:line, l:pattern)
-
-  " Toggle the ' ' or 'x' character
-  if l:char == 'x'
-    let l:char = ' '
-  else
-    let l:char = 'x'
-  endif
-
-  " Replace the current line with a new one
-  call setline(line('.'), substitute(l:line, l:pattern, l:char, ''))
-endfunction
-command! TaskToggle :call <SID>TaskToggle()
-nnoremap <leader>x :TaskToggle<CR>
-" Functions }}}
+" local {{{
+" spir-vim
+Plug '~/spir-vim'
+" jira.vim
+Plug '~/jira.vim'
+" }}}
+call plug#end()