scriptencoding utf-8
" ========================================================================
" 依云(lilydjwg) 的 vimrc
" 我的博客: http://lilydjwg.is-programmer.com/
"
" 整个适用于本人 *Only*
" 不过,其中的部分配置很可能非常适合你哦~~
" 不要整个地照搬,只“抄袭”对你自己有用的部分!
"
" 有任何意见和建议,或者其它想说的,可以到我的博客留言。
"
" 许可:GPLv3
" ========================================================================
" 其他文件[[[1
runtime vimrc_example.vim
"]]]
" 我的设置
" 函数[[[1
"   获取可读的文件大小[[[2
function Lilydjwg_getfsize(file)
  let size = getfsize(a:file)
  if has('python3')
    try
      py3 from myutils import filesize
      return py3eval('filesize('.size.')')
    catch /.*/
    endtry
  endif
  return size . 'B'
endfunction
"   打开 NERDTree,使用当前文件目录或者当前目录[[[2
function Lilydjwg_NERDTreeOpen()
  if exists("t:NERDTreeBufName")
    NERDTreeToggle
  else
    try
      NERDTree `=expand('%:h')`
    catch /E121/
      NERDTree `=getcwd()`
    endtry
  endif
endfunction
"   Perl-style quoted lists[[[2
function Lilydjwg_qw()
  let in = input('', 'qw(')
  return system('qw', in)
endfunction
"   使用分隔符连接多行 [[[2
function Lilydjwg_join(sep, bang) range
  if a:sep[0] == '\'
    let sep = strpart(a:sep, 1)
  else
    let sep = a:sep
  endif
  let lines = getline(a:firstline, a:lastline)
  if a:firstline == 1 && a:lastline == line('$')
    let dellast = 1
  else
    let dellast = 0
  endif
  exe a:firstline . ',' . a:lastline . 'd_'
  if a:bang != '!'
    call map(lines, "substitute(v:val, '^\\s\\+\\|\\s\\+$', '', 'g')")
  endif
  call append(a:firstline-1, join(lines, sep))
  if dellast
    $d_
  endif
endfunction
"   切换显示行号/相对行号/不显示 [[[2
function Lilydjwg_toggle_number()
  if &nu
    setl rnu
  elseif &rnu
    setl nornu
  else
    setl nu
  endif
endfunction
"   更改缩进[[[2
function Lilydjwg_reindent(...)
  if a:0 != 2
    echoerr "需要两个参数"
  endif
  let save_et = &et
  let save_ts = &ts
  try
    let &ts = a:1
    set noet
    retab!
    let &ts = a:2
    set et
    retab!
  finally
    let &et = save_et
    let &ts = save_ts
  endtry
endfunction
"   将当前窗口置于屏幕中间(全屏时用)[[[2
function CenterFull()
  on
  vs
  ene
  setl nocul
  setl nonu
  40winc |
  winc l
  vs
  winc l
  ene
  setl nocul
  setl nonu
  40winc |
  winc h
  redr!
endfunction
" 使用 colorpicker 程序获取颜色值(hex/rgba)[[[2
function Lilydjwg_colorpicker()
  if exists("g:last_color")
    let color = substitute(system("colorpicker ".shellescape(g:last_color)), '\n', '', '')
  else
    let color = substitute(system("colorpicker"), '\n', '', '')
  endif
  if v:shell_error == 1
    return ''
  elseif v:shell_error == 2
    " g:last_color 值不对
    unlet g:last_color
    return Lilydjwg_colorpicker()
  else
    let g:last_color = color
    return color
  endif
endfunction
" 更改光标下的颜色值(hex/rgba/rgb)[[[2
function Lilydjwg_changeColor()
  let color = Lilydjwg_get_pattern_at_cursor('\v\#[[:xdigit:]]{6}(\D|$)@=|<rgba\((\d{1,3},\s*){3}[.0-9]+\)|<rgb\((\d{1,3},\s*){2}\d{1,3}\)')
  if color == ""
    echohl WarningMsg
    echo "No color string found."
    echohl NONE
    return
  endif
  let g:last_color = color
  call Lilydjwg_colorpicker()
  exe 'normal! eF'.color[0]
  call setline('.', substitute(getline('.'), '\%'.col('.').'c\V'.color, g:last_color, ''))
endfunction
" Locate and return character "above" current cursor position[[[2
function LookFurther(down)
  "来源 http://www.ibm.com/developerworks/cn/linux/l-vim-script-1/,有修改
  "Locate current column and preceding line from which to copy
  let column_num      = virtcol('.')
  let target_pattern  = '\%' . column_num . 'v.'
  let target_pattern_1  = '\%' . (column_num+1) . 'v.'

  " FIXed 当光标位于如下 | 所示位置时,将取得错误的虚拟列号
  "          /中文
  "          |中文
  " 光标下的字符是多字节的?
  " echo '['.matchstr(getline('.'), target_pattern).']'
  if matchstr(getline('.'), target_pattern) == '' &&
    \ matchstr(getline('.'), target_pattern_1) != ''
    let column_num -= 1
    " 上面的字符可能是英文(前者)或者中文(后者)的
    let target_pattern  = '\%' . column_num . 'v.\|' . target_pattern
  endif
  if a:down
    let target_line_num = search(target_pattern, 'nW')
  else
    let target_line_num = search(target_pattern, 'bnW')
  endif

  "If target line found, return vertically copied character
  if !target_line_num
    return ""
  else
    return matchstr(getline(target_line_num), target_pattern)
  endif
endfunction
inoremap <silent> <C-Y> <C-R><C-R>=LookFurther(0)<CR>
inoremap <silent> <M-y> <C-R><C-R>=LookFurther(1)<CR>
" 对齐命令[[[2
function Lilydjwg_Align(type) range
  try
    let pat = g:Myalign_def[a:type]
  catch /^Vim\%((\a\+)\)\=:E716/
    echohl ErrorMsg
    echo "对齐方式" . a:type . "没有定义"
    echohl None
    return
  endtry
  call Align#AlignPush()
  call Align#AlignCtrl(pat[0])
  if len(pat) == 3
    call Align#AlignCtrl(pat[2])
  endif
  exe a:firstline.','.a:lastline."call Align#Align(0, '". pat[1] ."')"
  call Align#AlignPop()
endfunction
function Lilydjwg_Align_complete(ArgLead, CmdLine, CursorPos)
  return keys(g:Myalign_def)
endfunction
"  退格删除自动缩进 [[[2
function! Lilydjwg_checklist_bs(pat)
  " 退格可清除自动出来的列表符号
  if getline('.') =~ a:pat
    let ind = indent(line('.')-1)
    if !ind
      let ind = indent(line('.')+1)
    endif
    call setline(line('.'), repeat(' ', ind))
    return ""
  else
    return "\<BS>"
  endif
endfunction
"   字典补全 <C-X><C-K> 与 <C-K>[[[2
function Lilydjwg_dictcomplete()
  if pumvisible()
    return "\<C-K>"
  else
    return "\<C-X>\<C-K>"
  endif
endfunction
"   自动加执行权限[[[2
function Lilydjwg_chmodx()
  if strpart(getline(1), 0, 2) == '#!'
    let f = expand("%:p")
    if stridx(getfperm(f), 'x') != 2
      call system("chmod +x ".shellescape(f))
      e!
      filetype detect
      nmap <buffer> <S-F5> :!%:p<CR>
    endif
  endif
endfunction
"   返回当前日期的中文表示[[[2
function Lilydjwg_zh_date()
  let d = strftime("%Y年%m月%d日")
  let d = substitute(d, '[年月]\@<=0', '', 'g')
  return d
endfunction
"   关闭某个窗口[[[2
function Lilydjwg_close(winnr)
  let winnum = bufwinnr(a:winnr)
  if winnum == -1
    return 0
  endif
  " Goto the workspace window, close it and then come back to the
  " original window
  let curbufnr = bufnr('%')
  exe winnum . 'wincmd w'
  close
  " Need to jump back to the original window only if we are not
  " already in that window
  let winnum = bufwinnr(curbufnr)
  if winnr() != winnum
    exe winnum . 'wincmd w'
  endif
  return 1
endfunction
"  补全 So 命令[[[2
function Lilydjwg_complete_So(ArgLead, CmdLine, CursorPos)
  let path = 'so/' . a:ArgLead . '*'
  let ret = split(globpath(&rtp, path), '\n')
  call filter(ret, 'v:val =~ "\.vim$"')
  " XXX 如果文件名特殊则可能不对
  call map(ret, 'fnamemodify(v:val, '':t:r'')')
  return ret
endfunction
"  取得光标处的匹配[[[2
function Lilydjwg_get_pattern_at_cursor(pat)
  let col = col('.') - 1
  let line = getline('.')
  let ebeg = -1
  let cont = match(line, a:pat, 0)
  while (ebeg >= 0 || (0 <= cont) && (cont <= col))
    let contn = matchend(line, a:pat, cont)
    if (cont <= col) && (col < contn)
      let ebeg = match(line, a:pat, cont)
      let elen = contn - ebeg
      break
    else
      let cont = match(line, a:pat, contn)
    endif
  endwhile
  if ebeg >= 0
    return strpart(line, ebeg, elen)
  else
    return ""
  endif
endfunction
"   切换配色方案[[[2
function Lilydjwg_toggle_color()
  let colors = ['pink_lily', 'lilypink', 'darkBlue', 'spring2']
  " spring2 是增加了彩色终端支持的 spring
  if !exists("g:colors_name")
    let g:colors_name = 'pink_lily'
  endif
  let i = index(colors, g:colors_name)
  let i = (i+1) % len(colors)
  exe 'colorscheme ' . get(colors, i)
endfunction
" 打开 snippets 文件[[[2
function Lilydjwg_snippets(ft)
  if a:ft == ''
    exe 'tabe '.g:snippets_dir.&ft.'.snippets'
  else
    exe 'tabe '.g:snippets_dir.a:ft.'.snippets'
  endif
endfunction
"   %xx -> 对应的字符(到消息)[[[2
function Lilydjwg_hexchar()
  let chars = Lilydjwg_get_pattern_at_cursor('\(%[[:xdigit:]]\{2}\)\+')
  if chars == ''
    echohl WarningMsg
    echo '在光标处未发现%表示的十六进制字符串!'
    echohl None
    return
  endif
  let str = substitute(chars, '%', '\\x', 'g')
  exe 'echo "'. str . '"'
endfunction
"  用火狐打开链接[[[2
function Lilydjwg_open_url()
  let s:url = Lilydjwg_get_pattern_at_cursor('\v(https?://|ftp://|file:/{3}|www\.)(\w|[.-])+(:\d+)?(/(\w|[~@#$%^&+=/.?:-])+)?')
  if s:url == ""
    echohl WarningMsg
    echomsg '在光标处未发现URL!'
    echohl None
  else
    echo '打开URL:' . s:url
    if has("win32") || has("win64")
      " start 不是程序,所以无效。并且,cmd 只能使用双引号
      " call system("start '" . s:url . "'")
      call system("cmd /q /c start \"" . s:url . "\"")
    elseif has("mac")
      call system("open '" . s:url . "'")
    else
      " call system("gnome-open " . s:url)
      call system("setsid firefox '" . s:url . "' &")
    endif
  endif
  unlet s:url
endfunction
"  Title Save [[[2
function Lilydjwg_TSave()
  let line = getline(1)
  if line =~ '^\s*$'
    let line = getline(2)
  endif
  let line = substitute(line, '[:/\\]', '-', 'g')
  let line = substitute(line, '^\s\+', '', 'g')
  let line = substitute(line, '\s\+$', '', 'g')
  let line = substitute(line, ' ', '\\ ', 'g')
  let line = substitute(line, '\r', '', 'g')
  exe 'sav ' . line . '.txt'
endfunction
"  切换 ve [[[2
function Lilydjwg_toggle_ve()
  if &ve == 'all'
    let &ve = ''
  else
    let &ve = 'all'
  endif
endfunction
"  切换 ambiwidth [[[2
function Lilydjwg_toggle_ambiwidth()
  if &ambiwidth == 'double'
    let &ambiwidth = 'single'
  else
    let &ambiwidth = 'double'
  endif
endfunction
"  打开日记文件 [[[2
function Lilydjwg_edit_diary()
  if exists("g:my_diary_file") && filewritable(expand(g:my_diary_file))
    exe 'e '.g:my_diary_file
    normal gg
  else
    echoerr "Diary not set or not exists!"
  endif
endfunction
"  是否该调用 cycle?[[[2
function Lilydjwg_trycycle(dir)
  let pat = Lilydjwg_get_pattern_at_cursor('[+-]\?\d\+')
  if pat
    if a:dir ==? 'x'
      return "\<C-X>"
    else
      return "\<C-A>"
    end
  else
    let mode = mode() =~ 'n' ? 'w' : 'v'
    let dir = a:dir ==? 'x' ? -1 : 1
    return ":\<C-U>call Cycle('" . mode . "', " . dir . ", v:count1)\<CR>"
  end
endfunction
" set 相关[[[1
"   一般设置[[[2
" maybe necessary when root
syntax on
" set guifont=文泉驿等宽正黑\ Medium\ 10
set number
set smarttab
" 不要响铃,更不要闪屏
set visualbell t_vb=
au GUIEnter * set t_vb=
set viminfo='100,:10000,<50,s10,h
set history=10000
set wildmenu
set delcombine " 组合字符一个个地删除
set laststatus=2 " 总是显示状态栏
" 首先尝试最长的,接着轮换补全项
set wildmode=longest:full,full
set ambiwidth=double
set shiftround
set diffopt+=vertical,context:3,foldcolumn:0
set fileencodings=ucs-bom,utf-8,gb18030,cp936,latin1
set fileformats=unix,dos,mac
set formatoptions=croqn2mB1
set nojoinspaces
set virtualedit=block
set nostartofline
" set guioptions=egmrLtai
set guioptions=acit
set mousemodel=popup
" 没必要,而且很多时候 = 表示赋值
set isfname-==
set nolinebreak
set nowrapscan
set scrolloff=5
set sessionoptions=blank,buffers,curdir,folds,help,options,tabpages,winsize,slash,unix,resize
set shiftwidth=2
set winaltkeys=no
set noequalalways
set listchars=eol:$,tab:>-,nbsp:~
set display=lastline
set completeopt+=longest
set maxcombine=4
set cedit=<C-Y>
set whichwrap=b,s,[,]
set tags+=./../tags,./../../tags,./../../../tags
" Avoid command-line redraw on every entered character by turning off Arabic
" shaping (which is implemented poorly).
if has('arabic')
  set noarabicshape
endif
" Linux 与 Windows 等 [[[2
if has("gui_macvim")
  set macmeta
end
if has("win32") || has("win64")
  let g:LustyExplorerSuppressRubyWarning = 1
  " Win 路径 [[[3
  let g:VEConf_favorite = expand("$VIM/vimfiles/ve_favorite")
  let g:NERDTreeBookmarksFile = expand("$VIM/vimfiles/NERDTreeBookmarks")
  let g:undodir = expand("$TMP/vimundo")
  let g:vimfiles = expand("$VIM/vimfiles")
  let g:dictfilePrefix = expand('$VIM/vimfiles/dict/')
  set errorfile=$TMP/error
  if has("python3")
    py3file $VIM/vimfiles/vimrc.py
  endif
  " Win 程序 [[[3
  "   用默认的程序打开文件
  nmap <C-S-F5> :!"%"<CR>
  command Hex silent !winhex '%'
  command SHELL silent cd %:p:h|silent exe "!start cmd"|silent cd -
  command Nautilus silent !explorer %:p:h
  " Win 配置 [[[3
  command FScreen simalt ~x
  command Fscreen simalt ~r
else
  " Linux 路径 [[[3
  let g:VEConf_favorite = expand("~/.vim/ve_favorite")
  let g:NERDTreeBookmarksFile = expand("~/.vim/NERDTreeBookmarks")
  let g:undodir = expand("~/tmpfs/.vimundo")
  let g:vimfiles = expand("~/.vim")
  let g:dictfilePrefix = expand('~/.vim/dict/')
  set errorfile=~/tmpfs/error
  let my_diary_file = expand('~/secret/diary/2012.rj')
  let g:MuttVim_configfile = expand('~/scripts/python/pydata/muttvim.json')
  cmap <C-T> ~/tmpfs/
  " cron 的目录不要备份
  set backupskip+=/etc/cron.*/*
  set backupdir=.,~/temp,/tmp
  if has("python3")
    py3file ~/.vim/vimrc.py
  endif
  " Linux 程序 [[[3
  "   用默认的程序打开文件
  "   FIXME xdg-open 的配置在哪里?为什么不用浏览器打开 HTML 文件呢?
  nmap <C-S-F5> :!gnome-open "%"<CR>
  set grepprg=grep\ -nH\ $*
  command Hex silent !setsid ghex2 '%'
  command SHELL silent cd %:p:h|silent exe '!setsid terminal'|silent cd -
  command Nautilus silent !nautilus %:p:h
  autocmd BufWritePost    * call Lilydjwg_chmodx()
  " Linux 配置 [[[3
  command FScreen winpos 0 0|set lines=40|set columns=172
  command Fscreen set lines=40|set columns=88
endif
" 语言相关 [[[3
if $LANGUAGE =~ '^zh' || ($LANGUAGE == '' && v:lang =~ '^zh')
  " 缓冲区号 文件名 行数 修改 帮助 只读 编码 换行符 BOM ======== 字符编码 位置 百分比位置
  set statusline=%n\ %<%f\ %L行\ %{&modified?'[+]':&modifiable\|\|&ft=~'^\\vhelp\|qf$'?'':'[-]'}%h%r%{&fenc=='utf-8'\|\|&fenc==''?'':'['.&fenc.']'}%{&ff=='unix'?'':'['.&ff.']'}%{&bomb?'[BOM]':''}%{&eol?'':'[noeol]'}%=\ 0x%-4.8B\ \ \ \ %-14.(%l,%c%V%)\ %P
else
  set statusline=%n\ %<%f\ %LL\ %{&modified?'[+]':&modifiable\|\|&ft=~'^\\vhelp\|qf$'?'':'[-]'}%h%r%{&fenc=='utf-8'\|\|&fenc==''?'':'['.&fenc.']'}%{&ff=='unix'?'':'['.&ff.']'}%{&bomb?'[BOM]':''}%{&eol?'':'[noeol]'}%=\ 0x%-4.8B\ \ \ \ %-14.(%l,%c%V%)\ %P
endif
" 图形与终端 [[[2
let colorscheme = 'lilypink'
if has("gui_running")
  " 有些终端不能改变大小
  set columns=88
  set lines=38
  set cursorline
  exe 'colorscheme' colorscheme
elseif has("unix")
  set ambiwidth=single
  " 防止退出时终端乱码
  " 这里两者都需要。只前者标题会重复,只后者会乱码
  set t_fs=(B
  set t_IE=(B
  if &term =~ "256color"
    set cursorline
    exe 'colorscheme' colorscheme
  else
    " 在Linux文本终端下非插入模式显示块状光标
    if &term == "linux" || &term == "fbterm"
      set t_ve+=[?6c
      autocmd InsertEnter * set t_ve-=[?6c
      autocmd InsertLeave * set t_ve+=[?6c
      " autocmd VimLeave * set t_ve-=[?6c
    endif
    if &term == "fbterm"
      set cursorline
      exe 'colorscheme' colorscheme
    elseif $TERMCAP =~ 'Co#256'
      set t_Co=256
      set cursorline
      exe 'colorscheme' colorscheme
    else
      " 暂时只有这个配色比较适合了
      colorscheme default
      " 在终端下自动加载vimim输入法
      runtime so/vimim.vim
    endif
  endif
  " 在不同模式下使用不同颜色的光标
  " 不要在 ssh 下使用
  if &term =~ "256color" && !exists('$SSH_TTY')
    let color_normal = 'HotPink'
    let color_insert = 'RoyalBlue1'
    let color_exit = 'green'
    if &term =~ 'xterm\|rxvt'
      exe 'silent !echo -ne "\e]12;"' . shellescape(color_normal, 1) . '"\007"'
      let &t_SI="\e]12;" . color_insert . "\007"
      let &t_EI="\e]12;" . color_normal . "\007"
      exe 'autocmd VimLeave * :silent !echo -ne "\e]12;"' . shellescape(color_exit, 1) . '"\007"'
    elseif &term =~ "screen"
      if exists('$TMUX')
    if &ttymouse == 'xterm'
      set ttymouse=xterm2
    endif
    exe 'silent !echo -ne "\033Ptmux;\033\e]12;"' . shellescape(color_normal, 1) . '"\007\033\\"'
    let &t_SI="\033Ptmux;\033\e]12;" . color_insert . "\007\033\\"
    let &t_EI="\033Ptmux;\033\e]12;" . color_normal . "\007\033\\"
    exe 'autocmd VimLeave * :silent !echo -ne "\033Ptmux;\033\e]12;"' . shellescape(color_exit, 1) . '"\007\033\\"'
      elseif !exists('$SUDO_UID') " or it may still be in tmux
    exe 'silent !echo -ne "\033P\e]12;"' . shellescape(color_normal, 1) . '"\007\033\\"'
    let &t_SI="\033P\e]12;" . color_insert . "\007\033\\"
    let &t_EI="\033P\e]12;" . color_normal . "\007\033\\"
    exe 'autocmd VimLeave * :silent !echo -ne "\033P\e]12;"' . shellescape(color_exit, 1) . '"\007\033\\"'
      endif
    endif
    unlet color_normal
    unlet color_insert
    unlet color_exit
  endif
endif
unlet colorscheme
" 不同的 Vim 版本 [[[2
if has("conceal")
  set concealcursor=nc
endif
if has("persistent_undo")
  let &undodir=g:undodir
  if !isdirectory(&undodir)
    call mkdir(&undodir, '', 0700)
  endif
  set undofile
endif
if v:version > 702
  set cryptmethod=blowfish
endif
unlet g:undodir
" map 相关[[[1
"   nmap [[[2
"     Fx 相关 [[[3
nmap <F2> <Leader>be
nmap <F4> :ls<CR>:buffer 
nmap <F6> :cnext<CR>
nmap <S-F6> :cprevious<CR>
nmap <silent> <F9> :enew<CR>
nmap <silent> <F8> :GundoToggle<CR>
nmap <F11> :next<CR>
nmap <S-F11> :previous<CR>
nmap <S-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
"     重新载入当前文件
nmap <F5> :e!<CR>
"     t 开头 [[[3
nmap <silent> tt :tabnew<CR>
nmap t= mxHmygg=G`yzt`x
nmap ta ggVG
nmap <silent> tf :call Lilydjwg_open_url()<CR>
"     less style 清除高亮
nmap <silent> <M-u> :nohls<CR>
nmap tj Jx
nmap tl ^v$h
nmap <silent> to :call append('.', '')<CR>j
nmap <silent> tO :call append(line('.')-1, '')<CR>k
nmap tp "+P
nmap <silent> tv :call Lilydjwg_toggle_ve()<CR>
nmap tw :call Lilydjwg_toggle_ambiwidth()<CR>
"     w 开头 [[[3
nmap wc :set cursorline!<CR>
nmap wd :diffsplit 
nnoremap <silent> wf :call Lilydjwg_NERDTreeOpen()<CR>
nnoremap <silent> wn :call Lilydjwg_toggle_number()<CR>
nnoremap <silent> wt :TlistToggle<CR>
nnoremap <silent> wb :TagbarToggle<CR>
"     - 开头 [[[3
nmap -+ :set nomodified<CR>
nmap -c :call Lilydjwg_toggle_color()<CR>
nmap -ft :exe 'tabe '.g:vimfiles.'/ftplugin/'.&ft.'.vim'<CR>
nmap -syn :exe 'tabe '.g:vimfiles.'/syntax/'.&ft.'.vim'<CR>
nmap -int :exe 'tabe '.g:vimfiles.'/indent/'.&ft.'.vim'<CR>
"     显示高亮组 [[[4
nnoremap wh :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>
"     Alt 组合键 [[[3
nmap <M-m> :MRU 
" 打开草稿
nmap <unique> <silent> <M-s> <Plug>ShowScratchBuffer
for i in range(1, 9)
  exec 'nnoremap <silent> <M-' . i . '> '. i .'gt'
endfor
"     lusty-explorer [[[4
nmap <M-b> :LustyBufferExplorer<CR>
nmap <M-g> :LustyBufferGrep<CR>
nmap <M-l> :LustyFilesystemExplorerFromHere<CR>
"     FuzzyFinder [[[4
nmap <M-L> :FufFile<CR>
"     其它开头的 [[[3
nmap <silent> <C-Tab> :tabnew<CR>
nmap <BS> <C-O>
nmap <C-D> <C-W>q
nnoremap <Space> za
nmap ' <C-W>
nmap Y y$
nmap 'm :MarksBrowser<CR>
nmap :: :!
nmap cd :lcd %:p:h<CR>:echo expand('%:p:h')<CR>
nmap gb :setl fenc=gb18030<CR>
nmap d<CR> :%s/\r//eg<CR>``
nmap cac :call Lilydjwg_changeColor()<CR>
nmap gl :IndentGuidesToggle<CR>
nmap gs :echo Lilydjwg_getfsize(expand('%'))<CR>
"   imap [[[2
inoremap <S-CR> <CR>    
inoremap <M-c> <C-R>=Lilydjwg_colorpicker()<CR>
inoremap <C-J> <C-P>
inoremap <M-j> <C-N>
inoremap <M-q> <C-R>=Lilydjwg_qw()<CR>
imap <S-BS> <C-W>
cmap <S-BS> <C-W>
"     日期和时间 [[[3
imap <silent> <F5> <C-R>=Lilydjwg_zh_date()<CR>
imap <silent> <S-F5> <C-R>=strftime("%Y-%m-%d")<CR>
imap <silent> <C-F5> <C-R>=strftime("%Y-%m-%d %H:%M")<CR>
"     补全 [[[3
imap <F2> <C-X><C-O>
imap <F3> <C-X><C-F>
imap <S-F3> <C-X><C-L>
imap <F7> <C-R>=Lilydjwg_dictcomplete()<CR>
"     补全最长项
inoremap <expr> <C-L> pumvisible()?"\<C-E>\<C-N>":"\<C-N>"
"   vmap [[[2
vnoremap <Leader># "9y?<C-R>='\V'.substitute(escape(@9,'\?'),'\n','\\n','g')<CR><CR>
vnoremap <Leader>* "9y/<C-R>='\V'.substitute(escape(@9,'\/'),'\n','\\n','g')<CR><CR>
vnoremap <C-C> "+y
"     中文引号 [[[3
vmap “ <ESC>`<i“<ESC>`>a”<ESC>
vmap ” <ESC>`>a”<ESC>`<i“<ESC>
"   cmap [[[2
"     还是这样吧
"     FIXME 但这样在 wildmenu 补全时会有点奇怪
cmap <C-P> <Up>
cmap <C-N> <Down>
cnoremap <Left> <Space><BS><Left>
cnoremap <Right> <Space><BS><Right>
"   g[jk] [[[2
nmap <M-j> gj
nmap <M-k> gk
vmap <M-j> gj
vmap <M-k> gk
"   surround [[[2
"      比起 c,我更喜欢用 s
xmap c <Plug>Vsurround
xmap C <Plug>VSurround
"      原 cs 和 cscope 的冲突了
nmap cS <Plug>Csurround
"     以 % 表示的字符 [[[2
map <silent> t% :w !ascii2uni -a J -q<CR>
nmap <silent> t% :call Lilydjwg_hexchar()<CR>
"     HTML 转义 [[[2
"     I got the idea from unimpaired.vim
noremap <silent> [x :HTMLEscape<CR>
noremap <silent> ]x :HTMLUnescape<CR>
nnoremap <silent> [x :.HTMLEscape<CR>
nnoremap <silent> ]x :.HTMLUnescape<CR>
"     Ctrl-S 保存文件 [[[2
nmap <silent> <C-S> :update<CR>
imap <silent> <C-S> <ESC>:update<CR>
vmap <silent> <C-S> <ESC>:update<CR>
"     快速隐藏当前窗口内容[[[2
nmap <F12> :tabnew<CR>
imap <F12> <ESC>:tabnew<CR>
vmap <F12> <ESC>:tabnew<CR>
"     Shift+鼠标滚动[[[2
if v:version < 703
  nmap <silent> <S-MouseDown> zhzhzh
  nmap <silent> <S-MouseUp> zlzlzl
  vmap <silent> <S-MouseDown> zhzhzh
  vmap <silent> <S-MouseUp> zlzlzl
else
  map <S-ScrollWheelDown> <ScrollWheelRight>
  map <S-ScrollWheelUp> <ScrollWheelLeft>
  imap <S-ScrollWheelDown> <ScrollWheelRight>
  imap <S-ScrollWheelUp> <ScrollWheelLeft>
endif
"     Shift+鼠标中键[[[2
nnoremap <silent> <S-MiddleMouse> "+P
inoremap <silent> <S-MiddleMouse> <C-R>+
"     上下移动一行文字[[[2
nmap <C-j> mz:m+<cr>`z
nmap <C-k> mz:m-2<cr>`z
vmap <C-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <C-k> :m'<-2<cr>`>my`<mzgv`yo`z
" 自动命令[[[1
"   自动关闭预览窗口(不能用在命令窗口,所以设置了一个变量)
let s:cmdwin = 0
autocmd CmdwinEnter * let s:cmdwin = 1
autocmd CmdwinLeave * let s:cmdwin = 0
autocmd InsertLeave * if s:cmdwin == 0 && pumvisible() == 0|pclose|endif
autocmd BufReadCmd *.maff call zip#Browse(expand("<amatch>"))
autocmd BufRead */WualaDrive/* setl noswapfile
"   见 ft-syntax-omni
if has("autocmd") && exists("+omnifunc")
  autocmd Filetype *
    \ if &omnifunc == "" |
    \   setlocal omnifunc=syntaxcomplete#Complete |
    \ endif
endif
" 自定义命令[[[1
" 对齐 xxx: xxx (两栏)
" .vimrc 有可能是软链接
exe 'command Set tabe ' . escape(resolve($MYVIMRC), ' ')
" 删除当前文件
command Delete if delete(expand('%')) | echohl WarningMsg | echo "删除当前文件失败" | echohl None | endif
command -nargs=1 -range=% -bang Join <line1>,<line2>call Lilydjwg_join(<q-args>, "<bang>")
command -nargs=+ Reindent call Lilydjwg_reindent(<f-args>)
" TODO better implement
command -range=% ClsXML <line1>,<line2>!tidy -utf8 -iq -xml
command -range=% ClsHTML <line1>,<line2>!tidy -utf8 -iq -omit -w 0
command MB tabe ~/temp/mb
command -nargs=1 -complete=customlist,Lilydjwg_complete_So So runtime so/<args>.vim
"   读取命令内容并将其插入到当前光标下
command -nargs=1 -complete=command ReadCommand redir @">|exe "<args>"|normal $p:redir END<CR>
command -nargs=1 Delmark delm <args>|wviminfo!
"   删除空行
command -range=% -bar DBlank <line1>,<line2>g/^\s*$/d_|nohls
"   某个 pattern 出现的次数
command -range=% -nargs=1 Count <line1>,<line2>s/<args>//gn|nohls
command -range=% -bar SBlank <line1>,<line2>s/\v(^\s*$\n){2,}/\r/g
"   删除拖尾的空白
command -range=% -bar TWS <line1>,<line2>s/\s\+$//|nohls|normal ``
"   设置成 Linux 下适用的格式
command Lin setl ff=unix fenc=utf8 nobomb eol
"   设置成 Windows 下适用的格式
command Win setl ff=dos fenc=gb18030
"   以第一行的文字为名保存当前文件
command TSave call Lilydjwg_TSave()
command -nargs=? -complete=file RSplit vs <args>|normal <C-W>L<C-W>w
command -range=% -bar SQuote <line1>,<line2>s/“\|”\|″/"/ge|<line1>,<line2>s/‘\|’\|′/'/ge
command -range -bar HTMLEscape <line1>,<line2>s/&/\&amp;/ge|<line1>,<line2>s/</\&lt;/ge|<line1>,<line2>s/>/\&gt;/ge
command -range -bar HTMLUnescape <line1>,<line2>s/&amp;/\&/ge|<line1>,<line2>s/&lt;/</ge|<line1>,<line2>s/&gt;/>/ge
command RJ silent call Lilydjwg_edit_diary()
"   载入 snippets
command -nargs=? Snippets silent call Lilydjwg_snippets("<args>")
"   用 VimExplorer 插件打开当前文件所在的目录
command Path VE %:p:h
command -nargs=1 Enc e ++bad=keep ++enc=<args> %
command CenterFull call CenterFull()
command MusicSelect runtime so/musicselect.vim
command -nargs=1 -range=% -complete=customlist,Lilydjwg_Align_complete LA <line1>,<line2>call Lilydjwg_Align("<args>")
command -nargs=1 -range=% Column <line1>,<line2>Align! w<args>0P1p \S\@<=\s\@=
command -range=% Paste <line1>,<line2>py3 LilyPaste()
" 插件配置[[[1
"   easymotion[[[2
let EasyMotion_leader_key = '<M-q>'
let EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyz'
"   neocomplcache[[[2
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_force_overwrite_completefunc = 1
"   cycle[[[2
"   https://github.com/lilydjwg/vim-cycle
nnoremap <expr> <silent> <C-X> Lilydjwg_trycycle('x')
vnoremap <expr> <silent> <C-X> Lilydjwg_trycycle('x')
nnoremap <expr> <silent> <C-A> Lilydjwg_trycycle('p')
vnoremap <expr> <silent> <C-A> Lilydjwg_trycycle('p')
nnoremap <Plug>CycleFallbackNext <C-A>
nnoremap <Plug>CycleFallbackPrev <C-X>
let g:cycle_no_mappings = 1
let g:cycle_default_groups = [
      \ [['true', 'false']],
      \ [['yes', 'no']],
      \ [['and', 'or']],
      \ [['on', 'off']],
      \ [['>', '<']],
      \ [['==', '!=']],
      \ [['是', '否']],
      \ [["in", "out"]],
      \ [["min", "max"]],
      \ [["get", "post"]],
      \ [["to", "from"]],
      \ [["read", "write"]],
      \ [['with', 'without']],
      \ [["exclude", "include"]],
      \ [["asc", "desc"]],
      \ [["next", "prev"]],
      \ [["encode", "decode"]],
      \ [["left", "right"]],
      \ [["hide", "show"]],
      \ [['「:」', '『:』'], 'sub_pairs'],
      \ [['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
      \ 'Friday', 'Saturday'], 'hard_case', {'name': 'Days'}],
      \ [["enable", "disable"]],
      \ ]
"   Erlang[[[2
let g:erlangHighlightBif = 1
let g:erlangFold = 1
"   CountJump[[[2
"   Regex in Javascript, etc
call CountJump#TextObject#MakeWithCountSearch('', '/', 'ai', 'v', '\\\@<!/', '\\\@<!/')
call CountJump#TextObject#MakeWithCountSearch('', ':', 'ai', 'v', '\\\@<!:', '\\\@<!:')
call CountJump#TextObject#MakeWithCountSearch('', '_', 'ai', 'v', '_', '_')
call CountJump#TextObject#MakeWithCountSearch('', '<Tab>', 'ai', 'v', '\t', '\t')
"   colorizer.vim[[[2
let g:colorizer_nomap = 1
"   grep.vim[[[2
let g:Grep_Default_Options = '--binary-files=without-match'
"   NERDTree[[[2
let g:NERDTreeMapToggleZoom = 'a'
let g:NERDTreeMapToggleHidden = 'h'
"   另见平台相关部分
"   DirDiff[[[2
let g:DirDiffDynamicDiffText = 1
let g:DirDiffExcludes = "*~,*.swp"
let g:DirDiffWindowSize = 20
"   gundo[[[2
let gundo_preview_bottom = 1
let gundo_prefer_python3 = 1
"   bufexplorer[[[2
let g:bufExplorerFindActive = 0
"   taglist[[[2
let Tlist_Show_One_File = 1
let tlist_vimwiki_settings = 'wiki;h:headers'
let tlist_tex_settings = 'latex;h:headers'
let tlist_wiki_settings = 'wiki;h:headers'
let tlist_diff_settings = 'diff;f:file'
let tlist_git_settings = 'diff;f:file'
let tlist_gitcommit_settings = 'gitcommit;f:file'
let tlist_privoxy_settings = 'privoxy;s:sections'
"  来源 http://gist.github.com/476387
let tlist_html_settings = 'html;h:Headers;o:IDs;c:Classes'
hi link MyTagListFileName Type
"   2html.vim, 使用XHTML格式[[[2
let use_xhtml = 1
"   shell 脚本打开折叠
let g:sh_fold_enabled = 3 " 打开函数和 here 文档的折叠
"   Align[[[2
let g:Align_xstrlen = 3
"   Lilydjwg_Align
let g:Myalign_def = {
      \   'css': ['WP0p1l:', ':\@<=', 'v \v^\s*/\*|\{|\}'],
      \   'comma': ['WP0p1l:', ',\@<=', 'g ,'],
      \   'colon': ['WP0p1l:', ':\@<=', 'g ,'],
      \   'commalist': ['WP0p1l', ',\@<=', 'g ,'],
      \   'define': ['WP0p1l:', ' \d\@=', 'g ^#define\s'],
      \ }
"   EnhancedCommentify[[[2
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseSyntax = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyCommentsOp = 'Yes'
let g:EnhCommentifyAlignRight = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'
"   indent/html.vim[[[2
let g:html_indent_inctags = "html,body,head,tbody,p,li,dd,marquee,header,nav,article,section"
let g:html_indent_script1 = "inc"
let g:html_indent_style1 = "inc"
"   mru[[[2
if has("win32") || has("win64")
  let MRU_File = '$VIM/vimfiles/vim_mru_files'
else
  let MRU_File = '~/.vim/vim_mru_files'
endif
let MRU_Max_Entries = 2000
let MRU_Exclude_Files = '\v^.*\~$|/COMMIT_EDITMSG$|/itsalltext/|^/tmp/'
"  加载菜单太耗时
let MRU_Add_Menu = 0
"   syntax/haskell.vim[[[2
let hs_highlight_boolean = 1
let hs_highlight_types = 1
let hs_highlight_more_types = 1
"   syntax/python.vim[[[2
let python_highlight_all = 1
"   syntax/vim.vim 默认会高亮 s:[a-z] 这样的函数名为错误[[[2
let g:vimsyn_noerror = 1
let g:netrw_list_hide = '^\.[^.].*'
"   tasklist[[[2
let g:tlTokenList = ["FIXME", "TODO", "XXX", "NotImplemented"]
"   vimExplorer[[[2
let g:VEConf_showHiddenFiles = 0
"   另见平台相关部分
"   不要占用 ' 的映射
let g:VEConf_fileHotkey = {}
let g:VEConf_fileHotkey.gotoPlace = '`'
let g:VEConf_fileHotkey.help = '<F1>'
let g:VEConf_treeHotkey = {}
let g:VEConf_treeHotkey.help = '<F1>'
let g:VEConf_treeHotkey.toggleNode = '<Space>'
"   VimIm,不要更改弹出菜单的颜色[[[2
let g:vimim_menu_color = 1
"   vimwiki[[[2
let g:vimwiki_list = [{'path': '~/.vimwiki/'}]
let g:vimwiki_camel_case = 0
let g:vimwiki_hl_cb_checked = 1
let g:vimwiki_folding = 0
let g:vimwiki_browsers = ['firefox']
let g:vimwiki_CJK_length = 1
let g:vimwiki_dir_link = 'index'
let g:vimwiki_html_header_numbering = 2
let g:vimwiki_conceallevel = 2
"   xml.vim,使所有的标签都关闭[[[2
let xml_use_xhtml = 1
"   netrw,elinks不行,使用curl吧
if executable("curl")
  let g:netrw_http_cmd  = "curl"
  let g:netrw_http_xcmd = "-o"
endif
" cscope setting [[[1
if has("cscope") && executable("cscope")
  " 设置 [[[2
  set csto=1
  set cst
  set cscopequickfix=s-,c-,d-,i-,t-,e-

  " add any database in current directory
  function Lilydjwg_csadd()
    set nocsverb
    if filereadable("cscope.out")
      cs add cscope.out
    endif
    set csverb
  endfunction

  autocmd BufRead *.c,*.cpp,*.h call Lilydjwg_csadd()

  " 映射 [[[2
  " 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
  nmap css :cs find s <C-R>=expand("<cword>")<CR><CR>
  " 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
  nmap csg :cs find g <C-R>=expand("<cword>")<CR><CR>
  " 查找本函数调用的函数
  nmap csd :cs find d <C-R>=expand("<cword>")<CR><CR>
  " 查找调用本函数的函数
  nmap csc :cs find c <C-R>=expand("<cword>")<CR><CR>
  " 查找指定的字符串
  nmap cst :cs find t <C-R>=expand("<cword>")<CR><CR>
  " 查找egrep模式,相当于egrep功能,但查找速度快多了
  nmap cse :cs find e <C-R>=expand("<cword>")<CR><CR>
  " 查找并打开文件,类似vim的find功能
  nmap csf :cs find f <C-R>=expand("<cfile>")<CR><CR>
  " 查找包含本文件的文件
  nmap csi :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
  " 生成新的数据库
  nmap csn :lcd %:p:h<CR>:!my_cscope<CR>
  " 自己来输入命令
  nmap cs<Space> :cs find 
endif
" 最后 [[[1
runtime local.vim
" vim:fdm=marker:fmr=[[[,]]]