zsh:add git log alias
[dotfiles.git] / vim / vimrc
1 " Bundle ------------------------------------------------------------------ {{{
2 " Sun Sep 21 00:46:43 CST 2014
3 " refer https://github.com/connermcd/dotfiles.git
4 " and  https://bitbucket.org/sjl/dotfiles
5 set nocompatible
6 filetype off
7
8 set rtp+=~/.vim/bundle/Vundle.vim
9 call vundle#begin()
10
11 Plugin 'gmarik/Vundle.vim'
12 Bundle 'vim-scripts/FuzzyFinder'
13 Bundle 'vim-scripts/L9'
14 Bundle 'Valloric/YouCompleteMe'
15 Bundle 'octol/vim-cpp-enhanced-highlight'
16 Bundle 'bling/vim-airline'
17 Bundle 'payneseu/nerdtree'
18 Bundle 'Townk/vim-autoclose'
19 Bundle 'majutsushi/tagbar'
20 Bundle 'vim-scripts/tcd.vim'
21 Bundle 'vim-scripts/cmdline-completion'
22 Bundle 'vim-scripts/vcscommand.vim'
23 Bundle 'Lokaltog/vim-easymotion'
24 "Bundle 'vim-scripts/YankRing.vim'
25 Bundle 'vim-scripts/gtags.vim'
26 Bundle 'kshenoy/vim-signature'
27 Bundle 'nathanaelkane/vim-indent-guides'
28 Bundle 'rking/ag.vim'
29 Bundle 'payneseu/mark-2.8.4'
30 "Bundle 'derekwyatt/vim-fswitch'
31 Bundle 'sjl/gundo.vim'
32 Bundle 'tpope/vim-markdown'
33 "Bundle 'vim-scripts/BreakPts'
34 "Bundle 'vim-scripts/genutils'
35 "Bundle 'vim-scripts/Marks-Browser'
36 Bundle 'MattesGroeger/vim-bookmarks'
37
38 call vundle#end()
39 filetype plugin indent on
40
41 " }}}
42 " Basic options ----------------------------------------------------------- {{{
43 set number
44 set tabstop=4
45 set softtabstop=4
46 set shiftwidth=4
47 set smartindent
48 set smarttab
49 set vb t_vb=
50 set scrolloff=5
51 set sidescroll=10
52 set history=1000
53 set ruler
54 set showcmd
55 set incsearch
56 set hidden
57 set diffopt=filler,vertical
58
59 "set list
60 set listchars=tab:▸\ ,eol:¬,extends:❯,precedes:❮
61 set ttymouse=xterm2
62 set mouse=a
63 set splitbelow
64 set splitright
65 set nobackup
66 set noswapfile
67 set magic
68 set completeopt=longest,menuone
69 set ttyfast
70 "set wildmode=list:longest
71 set wildmenu
72 set wildignore=*.o,*.obj,*~,*.swp,*.DS_Store,*.git,*.svn,*.hg
73 set lazyredraw
74 set hlsearch
75 set autoindent
76 set confirm
77 set nostartofline   " don't jump to first character when paging
78 set nowrap
79 "set textwidth, formatoptions for chinese
80 set formatoptions+=m
81 set colorcolumn=+1
82 syntax on
83 " colorscheme {{{
84 set cursorline
85 if has("gui_running")
86         set macmeta  "" Macvim only
87         colorscheme molokai
88         set guioptions+=c
89         set guifont=Sauce\ Code\ Powerline\ Light:h11
90         highlight Cursor guifg=white guibg=green
91         set guicursor=a:blinkon0
92         set guioptions=eac
93 "       set lines=999
94 "       set columns=999
95 else
96         set t_Co=256
97         colorscheme molokai22
98         " http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTinkbdoZ8eNR1X2UobLTeww1jFrvfJxTMfKSq-L%2B%40mail.gmail.com&forum_name=tmux-users
99         "https://gist.github.com/andyfowler/1195581  
100         if exists('$TMUX')
101           let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
102           let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
103         else
104           let &t_SI = "\<Esc>]50;CursorShape=1\x7"
105           let &t_EI = "\<Esc>]50;CursorShape=0\x7"
106         endif"
107 endif
108         
109 " }}}
110 " }}}
111 " Mappings ---------------------------------------------------------------- {{{
112 let mapleader = ";"
113 map Q gq
114 " Normal mode ------------------------------------------------------------- {{{
115 nnoremap Y      y$
116 nnoremap ' `
117 nnoremap ` '
118 nnoremap J      <C-D>
119 nnoremap K      <C-U>
120
121 nmap <Leader>w  :w<CR>
122 nmap <Leader>q  :q<CR>
123 nmap <Leader>e  :e<Space>
124 nmap <Leader>W  :w !sudo tee %<CR>
125 nmap <Leader>h  :vertical help<Space>
126 nmap <Leader>t  :tabedit<Space>
127 "nmap <Leader>x :x<CR>
128
129 " windows 
130 nmap <C-H>  <C-W>h
131 nmap <C-J>  <C-W>j
132 nmap <C-L>  <C-W>l
133 nmap <C-K>  <C-W>k
134 nnoremap <Leader>v      <C-W>v
135 nnoremap <Leader>s      <C-W>s
136 "nnoremap  so           <C-W>o
137 nmap +  <C-w>3+
138 nmap -  <C-w>3-
139 nmap <  <C-w>3<
140 nmap >  <C-w>3>
141 nmap =  <C-w>=
142
143 nnoremap <C-D>  <C-D>zz
144 nnoremap <C-U>  <C-U>zz
145
146 nnoremap <SPACE>        <C-F>
147 nnoremap <S-SPACE>      <C-B>
148 nnoremap <BS>   <C-B>
149 nnoremap <A-n>  gt
150 nnoremap <A-p>  gT
151 "nmap <A-TAB>   :bn<CR>
152 " map <A-TAB> Alt+TAB  
153 "noremap <A-S-TAB> "input C-V then input key sequence to
154 "http://vim.wikia.com/wiki/Make_Shift-Tab_work
155 nnoremap <ESC><TAB> :bn<CR>
156 nnoremap \e\19 :bp<CR>
157 "nmap <A-S-TAB> :bp<CR>
158 "nmap <A-SPACE> :b#<CR>
159 "nmap <Leader>d :bd<CR>
160 "" keymappig for register operations
161 nnoremap <Leader>r      :registers<CR>
162 "noremap <Leader>x      :<C-p>
163 nnoremap <Leader>a :
164
165 nmap <Leader>p  "*p
166
167
168 nmap <A-=> :resize<CR>:vertical resize<CR>
169 nmap \e= :resize<CR>:vertical resize<CR>
170
171 nnoremap n nzzzv
172 nnoremap N      Nzzzv
173 nnoremap g;     g;zzzv
174 nnoremap g,     g,zzzv
175 nnoremap zR     zRzz
176 nnoremap zr     zrzz
177 nnoremap zn znzz
178
179 noremap <Leader>z       zmzvzz
180 nmap \\ :nohlsearch<CR>
181 " }}}
182 " Insert mode ------------------------------------------------------------- {{{
183 inoremap jj             <Esc>
184 inoremap <C-U> <C-G>u<C-U>
185 inoremap <C-a>  <Home>
186 inoremap <C-e>  <End>
187 inoremap <C-D>  <Del>
188 inoremap <C-b>  <S-Left>
189 inoremap <C-f>  <S-Right>
190 imap <A-d>      <S-Right><C-w>
191 " }}}
192 " Command mode ------------------------------------------------------- {{{
193 cmap jj         <C-c>
194 cnoremap <C-A>  <Home>
195 cnoremap <C-E>  <End>
196 cnoremap <C-B>  <Left>
197 cnoremap <C-F>  <Right>
198 cnoremap <C-D>  <Del>
199
200
201 if has("gui_running")
202 " only for Macvim <D-Left> D is Command key
203         cmap <A-a>      <D-Left>
204         cmap <A-e>      <D-Right>
205
206         cnoremap <A-b>  <S-Left>
207         cnoremap <A-f>  <S-Right>
208         cnoremap <A-d>  <S-Right><S-Right><S-Left><C-w>
209 else
210         cnoremap \eb     <S-Left>
211         cnoremap \ef     <S-Right>
212         cnoremap \ed     <S-Right><S-Right><S-Left><C-w>
213 endif
214 " delet a word left of cursor
215 cmap <S-BS>     <C-w>
216 " }}}
217 " Visual mode ------------------------------------------------------------- {{{
218 "" key mapping for  visul mode
219 vmap <C-k>      {       
220 vmap <C-j>      }       
221 "vmap <Leader>y "*y
222 vmap Y  "*y
223 " }}}
224 " }}}
225 " Plugins Configuration --------------------------------------------------- {{{
226 " Fuzzy Finder ------------------------------------------------------------ {{{
227 let g:fuf_modesDisable = []
228 let g:fuf_mrufile_maxItem = 400
229 let g:fuf_mrucmd_maxItem = 400
230 let g:fuf_file_exclude = '\v\~$|\.(DS_Store|o|exe|dll|bak|orig|swp|pyc)$|(^|[/\\])\.(hg|git|bzr|svn)($|[/\\])'
231 let g:fuf_buffertag_ctagsPath = '/usr/local/bin/ctags'
232 let g:fuf_enumeratingLimit = 30
233 nnoremap <silent> sj     :FufBuffer<CR>
234 nnoremap <silent> sk     :FufFileWithCurrentBufferDir<CR>
235 nnoremap <silent> sK     :FufFileWithFullCwd<CR>
236 nnoremap <silent> s<C-k> :FufFile<CR>
237 nnoremap <silent> sl     :FufCoverageFileChange<CR>
238 nnoremap <silent> sL     :FufCoverageFileChange<CR>
239 nnoremap <silent> s<C-l> :FufCoverageFileRegister<CR>
240 nnoremap <silent> sd     :FufDirWithCurrentBufferDir<CR>
241 nnoremap <silent> sD     :FufDirWithFullCwd<CR>
242 nnoremap <silent> s<C-d> :FufDir<CR>
243 nnoremap <silent> sn     :FufMruFile<CR>
244 nnoremap <silent> sN     :FufMruFileInCwd<CR>
245 nnoremap <silent> sm     :FufMruCmd<CR>
246 nnoremap <silent> su     :FufBookmarkFile<CR>
247 nnoremap <silent> s<C-u> :FufBookmarkFileAdd<CR>
248 vnoremap <silent> s<C-u> :FufBookmarkFileAddAsSelectedText<CR>
249 nnoremap <silent> si     :FufBookmarkDir<CR>
250 nnoremap <silent> s<C-i> :FufBookmarkDirAdd<CR>
251 nnoremap <silent> sT     :FufTag<CR>
252 nnoremap <silent> st     :FufTag!<CR>
253 nnoremap <silent> s<C-]> :FufTagWithCursorWord!<CR>
254 nnoremap <silent> s,     :FufBufferTag<CR>
255 nnoremap <silent> s<     :FufBufferTag!<CR>
256 vnoremap <silent> s,     :FufBufferTagWithSelectedText!<CR>
257 vnoremap <silent> s<     :FufBufferTagWithSelectedText<CR>
258 nnoremap <silent> s}     :FufBufferTagWithCursorWord!<CR>
259 "nnoremap <silent> s.     :FufBufferTagAll<CR>
260 "nnoremap <silent> s>     :FufBufferTagAll!<CR>
261 "vnoremap <silent> s.     :FufBufferTagAllWithSelectedText!<CR>
262 "vnoremap <silent> s>     :FufBufferTagAllWithSelectedText<CR>
263 "nnoremap <silent> s]     :FufBufferTagAllWithCursorWord!<CR>
264 nnoremap <silent> sG     :FufTaggedFile<CR>
265 nnoremap <silent> sg     :FufTaggedFile!<CR>
266 nnoremap <silent> so     :FufJumpList<CR>
267 nnoremap <silent> sp     :FufChangeList<CR>
268 nnoremap <silent> sq     :FufQuickfix<CR>
269 nnoremap <silent> sy     :FufLine<CR>
270 "  nnoremap <silent> sh     :FufHelp<CR>
271 nnoremap <silent> se     :FufEditDataFile<CR>
272 nnoremap <silent> sr     :FufRenewCache<CR>
273 " }}}
274 " YouCompleteMe ----------------------------------------------------------- {{{
275 "syntax on, must before the YCM,
276
277 let g:ycm_collect_identifiers_from_tags_files = 1
278 let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
279 let g:ycm_auto_trigger = 1
280 let g:ycm_seed_identifiers_with_syntax = 1
281 let g:ycm_show_diagnostics_ui = 0
282 let g:ycm_enable_diagnostic_signs = 0
283 set completeopt-=preview   " disable preview windows for completion
284 let g:ycm_confirm_extra_conf = 0
285 " delete default mapping for <leader>d
286 let g:ycm_key_detailed_diagnostics = ''
287
288 " }}}
289 " Airline ----------------------------------------------------------------- {{{
290 "if has("gui_running")
291
292   let g:airline_mode_map = {
293       \ '__' : '-',
294       \ 'n'  : 'N',
295       \ 'i'  : 'I',
296       \ 'R'  : 'R',
297       \ 'c'  : 'C',
298       \ 'v'  : 'V',
299       \ 'V'  : 'V',
300       \ '\16' : 'V',
301       \ 's'  : 'S',
302       \ 'S'  : 'S',
303       \ '\13' : 'S',
304       \ }
305
306         let g:airline_theme = 'badwolf'
307
308 "if has("gui_running")
309         let g:airline_powerline_fonts=1
310         let g:airline_left_sep = ''
311         let g:airline_left_alt_sep = ''
312         let g:airline_right_sep = ''
313         let g:airline_right_alt_sep = ''
314
315         let g:airline#extensions#tabline#show_buffers = 1
316         let g:airline#extensions#tabline#enabled = 1
317         let g:airline#extensions#tabline#left_sep = ''
318         let g:airline#extensions#tabline#left_alt_sep =''
319         let g:airline#extensions#tagbar#enabled = 1
320 "else 
321 "       let g:airline_powerline_fonts=1
322 "       let g:airline_left_sep = ''
323 ""      let g:airline_left_alt_sep = ''
324 "       let g:airline_right_sep = ''
325 ""      let g:airline_right_alt_sep = ''
326 "
327 "       let g:airline#extensions#tabline#show_buffers = 0
328 "       let g:airline#extensions#tabline#enabled = 1
329 "       let g:airline#extensions#tabline#left_sep = ''
330 ""      let g:airline#extensions#tabline#left_alt_sep =''
331 "       let g:airline#extensions#tagbar#enabled = 1
332 "endif
333         "
334 "       let g:airline_section_a = 'N'
335         let g:airline_section_b = '%f%m'
336         let g:airline_section_c = ''
337         let g:airline_section_x = '[%-.50{CurDir()}]'
338         let g:airline_section_y = '%y'
339         let g:airline_section_z = '%c, %l/%L %p%%'
340         let g:airline_section_warning = '' " (syntastic, whitespace)
341
342 set laststatus=2
343 set statusline=\ %<%F%m%=[%-.50{CurDir()}]\ %y\ %c,\ %l/%L\ \ %p%%\ 
344 function! CurDir()
345         let curdir = substitute(getcwd(), $HOME, "~", "g")
346         return curdir
347 endfunction
348
349 "endif
350 " }}}
351 " NerdTree ---------------------------------------------------------------- {{{
352 nmap <Leader>n  :NERDTreeToggle<CR>
353 nmap <Leader>N  :NERDTreeFind<CR>
354 " }}}
355 " AutoClose --------------------------------------------------------------- {{{
356 let g:AutoCloseProtectedRegions = ["Dialog", "ThoughBubble"]
357 " }}}
358 " TagBar ------------------------------------------------------------------ {{{
359 noremap <Leader>f       :TagbarToggle<CR><C-w>l
360 let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
361 " }}}
362 " Tcd --------------------------------------------------------------------- {{{
363 cabbrev cd Tcd
364 " }}}
365 " cmdline-completion ------------------------------------------------------ {{{
366 "http://foocoder.com/blog/mei-ri-vimcha-jian-suo-jin-xian-shi-vim-indent-guides.html/
367 cmap <C-J> <Plug>CmdlineCompletionBackward
368 cmap <C-K> <Plug>CmdlineCompletionForward
369 " }}}
370 " VSCCommand -------------------------------------------------------------- {{{
371 "" ==============  VCSCommand.vim =====================
372 "let VCSCommandSVKExec='disabled no such executable'
373 let VCSCommandDeleteOnHide=1    
374 let VCSCommandDisableMappings=1
375 "let VCSCommandEnableBufferSetup=1
376 "nmap <Leader>sd        :VCSVimDiff<CR>
377 augroup VCSCommand
378         autocmd User VCSBufferCreated silent! nmap <unique> <buffer> q :bwipeout<cr> | setlocal nomodifiable
379 augroup END
380 nmap <Leader>dg         :diffget<CR>
381 " }}}
382 " YankRing ---------------------------------------------------------------- {{{
383 let g:yankring_min_element_length = 2
384 nmap \r :YRShow<CR>
385 let g:yankring_replace_n_pkey = '<A->>'
386 let g:yankring_replace_n_nkey = '<A-<>'
387 let g:yankring_history_dir = "$HOME/.vim/temp/"
388 " }}}
389 " Gtags ------------------------------------------------------------------- {{{
390 if has("gui_running")
391         noremap <A-.> :Gtags<CR>
392         noremap <A-r> :Gtags -r<CR>
393         noremap <A-o> :Gtags -s<CR>
394         noremap <A-g> :Gtags -g<CR> 
395 else
396         noremap \e. :Gtags<CR>
397         noremap \er :Gtags -r<CR>
398 "       noremap j :Gtags -s<CR>
399         noremap \eg :Gtags -g<CR> 
400 endif
401 " }}}
402 " Marks ------------------------------------------------------------------- {{{
403 nmap  \h <Plug>MarkSet
404 nmap  * <Plug>MarkSearchNext
405 nmap  # <Plug>MarkSearchPrev
406 " }}}
407 " Gundo ------------------------------------------------------------------- {{{
408 "    nnoremap <F5> :GundoToggle<CR>
409 " }}}
410 " Bookmarks --------------------------------------------------------------- {{{
411
412 let g:bookmark_save_per_working_dir = 1
413 let g:bookmark_auto_close = 1
414 let g:bookmark_auto_save = 1
415 " unmap the default mapping in plugins
416 nmap <Plug>DisableBookmarkToggle        <Plug>BookmarkToggle
417 nmap <Plug>DisableBookmarkAnnotate      <Plug>BookmarkAnnotate
418 nmap <Plug>DisableBookmarkShowAll       <Plug>BookmarkShowAll
419 nmap <Plug>DisableBookmarkNext          <Plug>BookmarkNext
420 nmap <Plug>DisableBookmarkPrev          <Plug>BookmarkPrev
421 nmap <Plug>DisableBookmarkClear         <Plug>BookmarkClear
422 nmap <Plug>DisableBookmarkClearAll      <Plug>BookmarkClearAll
423 " remapping
424 nmap mm <Plug>BookmarkToggle
425 "  nmap ,i <Plug>BookmarkAnnotate
426 nmap \m <Plug>BookmarkShowAll
427 let g:bookmark_center = 1
428 let g:bookmark_auto_close = 1
429 "let g:bookmark_highlight_lines = 1
430 "  nmap ,j <Plug>BookmarkNext
431 "  nmap ,k <Plug>BookmarkPrev
432 "  nmap ,c <Plug>BookmarkClear
433 "  nmap ,x <Plug>BookmarkClearAll
434 " }}}
435
436 " }}}
437 " FileType ---------------------------------------------------------------- {{{
438 autocmd BufNewFile,BufRead *.log set filetype=logecc
439 autocmd BufNewFile,BufRead *.log.[0-9] set filetype=logecc
440 autocmd BufNewFile,BufRead *tmux.conf set filetype=tmux
441 autocmd BufNewFile,BufRead SConstruct set filetype=python
442 autocmd BufNewFile,BufRead SConscript* set filetype=python
443 autocmd BufNewFile,BufReadPost *.md set filetype=markdown
444 autocmd BufNewFile,BufRead *.c set filetype=cpp
445
446 " http://vim.wikia.com/wiki/Update_the_diff_view_automatically
447 autocmd InsertLeave,BufWritePost,CursorHold * if &diff == 1 | diffupdate | endif
448 " setlocal nomodifiable for svn diff
449 autocmd BufWinEnter *.svn-base setlocal nomodifiable 
450
451 autocmd WinEnter * nnoremap <buffer> gj @=(&diff)?']czz':'gj'<CR> |
452         \ nnoremap <buffer> gk @=(&diff)?'[czz':'gk'<CR>
453
454 autocmd FileType qf nnoremap <buffer> <silent> q :q<CR> | setlocal nowrap | setlocal nocursorline
455 autocmd FileType help nnoremap <buffer> <silent> q :q<CR> | vertical resize 85;
456 autocmd FileType c,cpp setlocal foldmethod=syntax |
457     \ let b:AutoClosePairs = AutoClose#DefaultPairsModified("\"", "{}") |
458         \ inoremap <buffer> { {<CR>}<ESC>kA<CR>
459 autocmd FileType python setlocal foldmethod=indent
460
461 autocmd FileType xml setlocal foldmethod=syntax |
462         \ let g:xml_syntax_folding=1
463 autocmd FileType vim setlocal foldmethod=marker |
464         \ setlocal formatoptions-=c formatoptions-=r formatoptions-=o |
465     \ let b:AutoClosePairs = AutoClose#DefaultPairsModified("", "{} \"")
466
467 autocmd Filetype markdown setlocal textwidth=80
468
469 autocmd CmdwinEnter * map <buffer> q :q<CR>
470
471 " }}}
472 " Functions --------------------------------------------------------------- {{{
473 " DiffOrig ---------------------------------------------------------------- {{{
474 " refert vimrc_example.vim 
475 " Convenient command to see the difference between the current buffer and the
476 " file it was loaded from, thus the changes you made.
477 " Only define it when not defined already.
478 if !exists(":DiffOrig")
479   command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
480                   \ | wincmd p | diffthis
481 endif 
482 " }}}
483 " Fold Quickfix ----------------------------------------------------------- {{{
484 "http://vim.wikia.com/wiki/Show_only_lines_in_quickfix_list_for_current_buffer 
485 if ! exists('g:foldmisses_context')
486   let g:foldmisses_context = 0
487 endif
488
489 " Add manual fold from line1 to line2, inclusive.
490 function! s:Fold(line1, line2)
491   if a:line1 < a:line2
492     execute a:line1.','.a:line2.'fold'
493   endif
494 endfunction
495
496 " Return list of line numbers for current buffer found in quickfix list.
497 function! s:GetHitLineNumbers(list)
498   let result = []
499   for d in a:list
500     if d.valid && d.bufnr == bufnr('')
501       call add(result, d.lnum)
502     endif
503   endfor
504   return result
505 endfunction
506
507 function! s:FoldMisses(list, context)
508   setlocal foldmethod=manual
509   normal! zE
510   let extra = a:context == 99999 ? g:foldmisses_context : a:context
511   let last = 0
512   for lnum in s:GetHitLineNumbers(a:list)
513 "    let start = last==0 ? 1 : last+extra
514     let start = last==0 ? 1 : last+1+extra
515     call s:Fold(start, lnum-1-extra)
516     let last = lnum
517   endfor
518   call s:Fold(last+1+extra, line('$'))
519 "  call s:Fold(last+extra, line('$'))
520 endfunction
521
522 ":[N]FoldMisses [N]     Show only the lines (and surrounding [N] lines
523 ":[N]FoldLMisses [N]    of context) in the current buffer that appear
524 "                       in the quickfix / location list.
525 "                       Missed, error-free lines are folded away.
526 command! -bar -count=99999 FoldMisses call s:FoldMisses(getqflist(), <count>)
527 command! -bar -count=99999 FoldLMisses call s:FoldMisses(getloclist(0), <count>)
528 " }}}
529 " ToggleList -------------------------------------------------------------- {{{
530 "http://vim.wikia.com/wiki/Toggle_to_open_or_close_the_quickfix_window
531 function! GetBufferList()
532   redir =>buflist
533   silent! ls
534   redir END
535   return buflist
536 endfunction
537
538 function! ToggleList(bufname, pfx)
539   let buflist = GetBufferList()
540   for bufnum in map(filter(split(buflist, '\n'), 'v:val =~ "'.a:bufname.'"'), 'str2nr(matchstr(v:val, "\\d\\+"))')
541     if bufwinnr(bufnum) != -1
542       exec(a:pfx.'close')
543       return
544     endif
545   endfor
546   if a:pfx == 'l' && len(getloclist(0)) == 0
547       echohl ErrorMsg
548       echo "Location List is Empty."
549       return
550   endif
551   let winnr = winnr()
552   exec(a:pfx.'open')
553   if winnr() != winnr
554     wincmd p
555   endif
556 endfunction
557
558 nmap <silent> \l :call ToggleList("Location List", 'l')<CR>
559 nmap <silent> \q :call ToggleList("Quickfix List", 'c')<CR>
560 " }}}
561 " DiffToggle -------------------------------------------------------------- {{{
562 "if !exists(":DiffToggle")
563 "       \ endif
564 "endif
565 function! DiffToggle()
566         if(&diff)
567                 diffoff | wincmd h | wincmd o
568         else
569                 exec ":VCSVimDiff" | wincmd h
570         endif
571 endfunction
572 nnoremap \d :call DiffToggle()<CR>
573 "noremap <Leader>d      @=(&diff)?':diffoff':":VCSVimDiff"<CR><CR>
574 " }}}
575
576 " }}}
577
578 "nnoremap <silent> <Space> @=(foldlevel('.')?'za':"\<Space>")<CR>
579 nnoremap <silent> <Space> @=(foldlevel('.')?'za':"\<Space>")<CR>
580 "noremap <Leader>d      @=(&diff)?':diffoff':":VCSVimDiff"<CR><CR>
581
582 " https://bitbucket.org/sjl/dotfiles/src/tip/vim/vimrc
583 " Make sure Vim returns to the same line when you reopen a file.
584 " Thanks, Amit
585 augroup line_return
586     au!
587     au BufReadPost *
588         \ if line("'\"") > 0 && line("'\"") <= line("$") |
589         \     execute 'normal! g`"zvzz' |
590         \ endif
591 augroup END
592
593 iabbrev  -...  <C-R>=repeat('-', 80 - col(".") - 4 ) . " {{{"
594 iabbrev         "}   " }}}
595
596 " $ sed -n l
597 " to show the key sequence when pressing some key, 
598 " such as Ctrl-V
599 " cnfile
600 " cpfile
601
602
603 " some prefix for mapping
604 " <Leader> = ;
605 " ,
606 " \
607 " m
608 nnoremap B ^
609 nnoremap E $
610 nnoremap <C-N>  :cn<CR>
611 nnoremap <C-P>  :cp<CR>
612 "http://dougblack.io/words/a-good-vimrc.html
613 "nnoremap gV `[v`]
614