vimrc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. set nocompatible " Don't have to try to be compatible with old vi
  2. """"""""
  3. "" Plugin Loading with Pathogen
  4. """""""""""""""""""""""""""""""""""""""""""""""""""
  5. runtime bundle/vim-pathogen/autoload/pathogen.vim
  6. call pathogen#infect()
  7. call pathogen#helptags()
  8. """"""""
  9. "" General Behaviours
  10. """""""""""""""""""""""""""""""""""""""""""""""""""
  11. set encoding=utf-8
  12. set splitbelow " New splits appear below current window instead of above
  13. set splitright " New splits appear right of current window
  14. set ttyfast " Smooth movement
  15. set ttymouse=xterm2
  16. set mouse=a
  17. set scrolloff=4 " keep distance from top and bottom for current line
  18. set cursorline " ensure that there is a cursor line
  19. " Persistent undo
  20. if has("persistent_undo")
  21. set undofile
  22. set undodir=~/.vim/undo
  23. endif
  24. """"""""
  25. "" Autocommands
  26. """""""""""""""""""""""""""""""""""""""""""""""""""
  27. if has("autocmd")
  28. " Enable filetype specific features
  29. filetype plugin indent on
  30. " Clear existing autocmd
  31. autocmd!
  32. " When editing a file, always jump to the last cursor position
  33. " (from Ubuntu's `/etc/vim/vimrc`)
  34. autocmd BufReadPost *
  35. \ if line("'\"") > 0 && line ("'\"") <= line("$") |
  36. \ exe "normal! g'\"" |
  37. \ endif
  38. " Show trailing white space
  39. autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
  40. autocmd InsertLeave * match ExtraWhitespace /\s\+$/
  41. " Source the vimrc file after saving it
  42. autocmd BufWritePost .vimrc nested source $MYVIMRC
  43. " QuickFix - Local remaps:
  44. " - `q` to close qf buffer
  45. " - `o` to open location entry under cursor
  46. autocmd FileType qf nnoremap <silent> <buffer> q :ccl<CR>:lcl<CR>
  47. autocmd FileType qf nnoremap <silent> <buffer> o <CR>
  48. " QuickFix - Global remaps:
  49. " - `<TAB>` and `\` for previous and next location entry
  50. " - unmaps when qf buffer is closed.
  51. autocmd BufWinEnter quickfix
  52. \ setlocal nocursorline |
  53. \ let g:qfix_win = bufnr("$") |
  54. \ call MapQfPrevNext()
  55. autocmd BufWinLeave *
  56. \ if exists("g:qfix_win") && expand("<abuf>") == g:qfix_win |
  57. \ unlet! g:qfix_win |
  58. \ call UnmapQfPrefNext() |
  59. \ endif
  60. " QuickFix - Open window after any grep invocation (Glog and Ggrep)
  61. autocmd QuickFixCmdPost *grep* cwindow |
  62. \ setlocal nocursorline |
  63. \ let g:qfix_win = bufnr("$") |
  64. \ call MapQfPrevNext()
  65. " Fugitive - Go up to previous tree object while exploring git tree with '..'
  66. autocmd User fugitive
  67. \ if fugitive#buffer().type() =~# '^\%(tree\|blob\)$' |
  68. \ nnoremap <buffer> .. :edit %:h<CR> |
  69. \ endif
  70. " Fugitive - Delete buffers when they are not active
  71. autocmd BufReadPost fugitive://* set bufhidden=delete
  72. " PHP - Offline docs, manpage-style, using `K`.
  73. " - needs pman installed through PEAR: `pear install doc.php.net/pman`
  74. if executable('pman')
  75. autocmd FileType php set keywordprg=pman
  76. endif
  77. else
  78. set autoindent on
  79. endif
  80. """"""""
  81. "" Tabs and Text Formatting
  82. """"""""""""""""""""""""""""""""""""""""""""""""""""""
  83. set expandtab " change to single spaces
  84. set tabstop=2 " actual tab press distance
  85. set shiftround " indent to nearest tabstops
  86. set shiftwidth=2 " amount to indent with > and <
  87. set smarttab " backspace tabs where appropriate even if spaces
  88. set softtabstop=2 " let backspace delete by indents
  89. set nowrap " do not wrap long lines of text
  90. set backspace=eol,start,indent "backspace over everything
  91. set textwidth=80 " try to keep text within 80 characters
  92. set colorcolumn=+1 " mark out the limits of the textwidth
  93. set listchars=trail:_,tab:>.,eol:$
  94. set fillchars=fold:.
  95. """"""""
  96. "" UI - Colours
  97. """"""""""""""""""""""""""""""""""""""""""""""""""""""
  98. syntax enable
  99. colorscheme solarized
  100. set t_Co=16
  101. set background=dark
  102. " set colour for folded lines
  103. highlight Folded term=none cterm=none ctermfg=darkred ctermbg=none
  104. " show trailing white space
  105. highlight ExtraWhitespace ctermfg=red ctermbg=red guifg=red guibg=red
  106. " reverse indent guides highlighting
  107. highlight IndentGuidesOdd ctermbg=darkgrey
  108. highlight IndentGuidesEven ctermbg=black
  109. """"""""
  110. "" UI - Numbering
  111. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  112. set number " show line numbers
  113. """"""""
  114. "" UI - Statusline (now using powerline)
  115. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  116. set laststatus=2 " status line is second last line (not hidden by commands)
  117. """"""""
  118. "" UI - Code Folding
  119. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  120. set foldmethod=indent
  121. set foldlevel=10
  122. set foldtext=FoldText()
  123. """"""""
  124. "" UI - Search
  125. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  126. set hlsearch " make searches highlighted
  127. set incsearch " vim will search as you type!
  128. set ignorecase " ignore case for searches
  129. set smartcase " well, unless a user puts in uppercase search characters
  130. set magic " enables wildcard searching
  131. " use ack for grepping if available
  132. if executable('ack-grep')
  133. set grepprg=ack-grep\ --with-filename\ --nocolor\ --nogroup
  134. elseif executable('ack')
  135. set grepprg=ack\ --with-filename\ --nocolor\ --nogroup
  136. endif
  137. set shellpipe=&> " don't display ack/grep terminal output. NOTE: not reliable
  138. " https://github.com/mileszs/ack.vim/issues/18
  139. """"""""
  140. "" Key Remaps
  141. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  142. let mapleader = "," " easier to use than \
  143. " More convenient escape
  144. inoremap kj <ESC>
  145. inoremap jk <ESC>
  146. " Yank to end of line, like D deletes to end of line
  147. nnoremap Y y$
  148. " Add extra lines up and down
  149. nnoremap <leader>j o<Esc>k
  150. nnoremap <leader>k O<Esc>j
  151. " Edit .vimrc
  152. nnoremap <leader>v :e $MYVIMRC<CR>
  153. " Clear trailing white space
  154. nnoremap <silent> <leader>$ :%s/\s\+$//g<CR>
  155. " Convert tabs to spaces
  156. nnoremap <silent> <leader><TAB> :%s/<TAB>/ /g<CR>
  157. " Space as a Folding toggle in normal mode.
  158. nnoremap <silent> <space> @=(foldlevel('.')?'za':"\<space>")<CR>
  159. " Backspace to clear current search (and stop highlighting)
  160. nnoremap <silent> <backspace> :call ClearSearch()<CR>
  161. nnoremap <silent> <leader>n :set number!<CR>
  162. nnoremap <silent> <leader>w :set wrap!<CR>
  163. nnoremap <silent> <leader>80 gggqG<C-o><C-o>
  164. " Toggle paste mode - no autoindenting of pasted material
  165. nnoremap <silent> <leader>p :set paste! paste?<CR>
  166. " Toggle visible whitespace characters
  167. nnoremap <silent> <leader>l :set list!<CR>
  168. " Toggle keyboard layout
  169. nnoremap <silent> <leader><space> :call CycleKeymap()<CR>
  170. " Toggle scrollbind for moving multiple splits in sync together
  171. nnoremap <silent> <leader>s :set scrollbind! scrollbind?<CR>
  172. " Toggle mouse support.
  173. nnoremap <silent> <leader>m :call ToggleMouse()<CR>
  174. " Toggle NERDTree file browser
  175. nnoremap <silent> <leader>d :NERDTreeToggle<CR>
  176. " Toggle Commenting out lines with NERDCommenter
  177. nnoremap <silent> <leader>, :call NERDComment("n", "toggle")<CR>
  178. vnoremap <silent> <leader>, <ESC>:call NERDComment("x", "toggle")<CR>
  179. " Traverse undo tree with Gundo
  180. nnoremap <silent> <leader>u :GundoToggle<CR>
  181. " Git commands with Fugitive
  182. nnoremap <silent> <leader>gs :Gstatus<CR>
  183. nnoremap <silent> <leader>gc :Gcommit -v<CR>
  184. nnoremap <silent> <leader>gl :Glog<CR><CR>
  185. nnoremap <silent> <leader>gap :Git add -p<CR>
  186. nnoremap <silent> <leader>b :Gblame<CR>
  187. nnoremap <silent> <leader>gd :Gdiff<CR>
  188. " Ack with Ctrl-F
  189. nnoremap <C-F> :Grep<space>
  190. " Code heirarchy with Tagbar
  191. nnoremap <silent> <leader>t :TagbarToggle<CR>
  192. """"""""
  193. "" Key Remaps - Movement and Windows
  194. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  195. " jump to beginning and end of line easier
  196. nmap H ^
  197. nmap L $
  198. vmap H ^
  199. vmap L $
  200. " Smart way to move between windows
  201. nnoremap <C-j> <C-W>j
  202. nnoremap <C-k> <C-W>k
  203. nnoremap <C-h> <C-W>h
  204. nnoremap <C-l> <C-W>l
  205. " mapping to make movements operate on 1 screen line in wrap mode
  206. onoremap <silent> <expr> j ScreenMovement("j")
  207. onoremap <silent> <expr> k ScreenMovement("k")
  208. onoremap <silent> <expr> 0 ScreenMovement("0")
  209. onoremap <silent> <expr> ^ ScreenMovement("^")
  210. onoremap <silent> <expr> $ ScreenMovement("$")
  211. nnoremap <silent> <expr> j ScreenMovement("j")
  212. nnoremap <silent> <expr> k ScreenMovement("k")
  213. nnoremap <silent> <expr> 0 ScreenMovement("0")
  214. nnoremap <silent> <expr> ^ ScreenMovement("^")
  215. nnoremap <silent> <expr> $ ScreenMovement("$")
  216. xnoremap <silent> <expr> j ScreenMovement("j")
  217. xnoremap <silent> <expr> k ScreenMovement("k")
  218. xnoremap <silent> <expr> 0 ScreenMovement("0")
  219. xnoremap <silent> <expr> ^ ScreenMovement("^")
  220. xnoremap <silent> <expr> $ ScreenMovement("$")
  221. """"""""
  222. "" Plugin options
  223. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  224. """"""""" NERDTree
  225. let g:NERDTreeQuitOnOpen = 1 " close sidebar after we go to selection
  226. """"""""" Gundo
  227. let g:gundo_width = 30
  228. let g:gundo_preview_height = 12
  229. let g:gundo_preview_bottom = 1
  230. """"""""" Powerline
  231. set rtp+=~/dotfiles/powerline/powerline/powerline/bindings/vim
  232. set noshowmode " don't show e.g. --INSERT-- since we're using powerline
  233. """"""""" Tagbar
  234. let g:tagbar_autoclose = 1 " close sidebar after we go to selection
  235. """"""""" EasyGrep
  236. let g:EasyGrepCommand = 1 " don't use the built in vimgrep, which is slow
  237. " Caveat about using ack: cannot search unsaved changes in buffer, unlike vimgrep
  238. let g:EasyGrepJumpToMatch = 0
  239. let g:EasyGrepHighlightQfMatches = 1
  240. let g:EasyGrepRecursive = 1 " always start trying to recurse through directories
  241. """"""""" Indent Guides
  242. let g:indent_guides_enable_on_vim_startup = 1
  243. let g:indent_guides_auto_colors = 0
  244. """"""""" SuperTab
  245. let g:SuperTabDefaultCompletionType = 'context'
  246. """"""""" Syntastic
  247. let g:syntastic_auto_jump = 1
  248. """"""""" CtrlP
  249. let g:ctrlp_working_path_mode = 'rw'
  250. let g:ctrlp_user_command = {
  251. \ 'types': {
  252. \ 1: ['.git', 'cd %s && git ls-files'],
  253. \ 2: ['.hg', 'hg --cwd %s locate -I .']
  254. \ },
  255. \ 'fallback': 'find %s -type f'
  256. \ }
  257. """"""""" Vdebug
  258. let g:vdebug_options = {
  259. \ 'break_on_open' : 0,
  260. \ 'watch_window_style' : 'compact',
  261. \ 'path_maps' : {"/usr": "/jails/alcatraz/usr"}
  262. \ }
  263. """"""""" Vim Markdown
  264. let g:vim_markdown_folding_disabled = 1
  265. """"""""" Sparkup
  266. let g:sparkupNextMapping = '<leader>n' " resolve conflict with vim-multiple-cursors
  267. """"""""" MatchIt
  268. " matchit.vim included in vim since 6.0. Load it if there isn't a newer version.
  269. " (from sensible.vim)
  270. if !exists('g:loaded_matchit') && findfile('plugin/matchit.vim', &rtp) ==# ''
  271. runtime! macros/matchit.vim
  272. endif
  273. """"""""
  274. "" Functions
  275. """"""""""""""""""""""""""""""""""""""""""""""""""""""""
  276. function! FoldText()
  277. let line = getline(v:foldstart)
  278. let indent = indent(v:foldstart)
  279. let indentOnly = strpart(line, 0, indent-1)
  280. let linecount = v:foldend+1 - v:foldstart
  281. let foldtext = '+'.indentOnly.'... ('.linecount.' More lines)'
  282. return foldtext
  283. endfunction
  284. function! ToggleMouse()
  285. if &mouse == 'a'
  286. set mouse=
  287. echo "Mouse usage disabled"
  288. else
  289. set mouse=a
  290. echo "Mouse usage enabled"
  291. endif
  292. endfunction
  293. function! ScreenMovement(movement)
  294. if &wrap
  295. return "g" . a:movement
  296. else
  297. return a:movement
  298. endif
  299. endfunction
  300. function! ClearSearch()
  301. if (@/ != "")
  302. let @/=""
  303. redraw
  304. endif
  305. endfunction
  306. function! CycleKeymap()
  307. if has('keymap')
  308. if (&keymap == '')
  309. set keymap=colemak
  310. echo "Colemak keymap selected"
  311. elseif (&keymap == 'colemak')
  312. set keymap=dvorak
  313. echo "Dvorak keymap selected"
  314. else
  315. set keymap=
  316. echo "Qwerty keymap selected"
  317. endif
  318. else
  319. echo "Keymaps not supported"
  320. endif
  321. endfunction
  322. function! MapQfPrevNext()
  323. exec "nmap <silent> <tab> :cprev<CR>"
  324. exec "nmap <silent> <bslash> :cnext<CR>"
  325. endfunction
  326. function! UnmapQfPrefNext()
  327. exec "nunmap <tab>"
  328. exec "nunmap <bslash>"
  329. endfunction