mixed.vim 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. " =============================================================================
  2. " File: autoload/ctrlp/mixed.vim
  3. " Description: Mixing Files + MRU + Buffers
  4. " Author: Kien Nguyen <github.com/kien>
  5. " =============================================================================
  6. " Init {{{1
  7. if exists('g:loaded_ctrlp_mixed') && g:loaded_ctrlp_mixed
  8. fini
  9. en
  10. let [g:loaded_ctrlp_mixed, g:ctrlp_newmix] = [1, 0]
  11. cal add(g:ctrlp_ext_vars, {
  12. \ 'init': 'ctrlp#mixed#init(s:compare_lim)',
  13. \ 'accept': 'ctrlp#acceptfile',
  14. \ 'lname': 'fil + mru + buf',
  15. \ 'sname': 'mix',
  16. \ 'type': 'path',
  17. \ 'opmul': 1,
  18. \ 'specinput': 1,
  19. \ })
  20. let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
  21. " Utilities {{{1
  22. fu! s:newcache(cwd)
  23. if g:ctrlp_newmix || !has_key(g:ctrlp_allmixes, 'data') | retu 1 | en
  24. retu g:ctrlp_allmixes['cwd'] != a:cwd
  25. \ || g:ctrlp_allmixes['filtime'] < getftime(ctrlp#utils#cachefile())
  26. \ || g:ctrlp_allmixes['mrutime'] < getftime(ctrlp#mrufiles#cachefile())
  27. \ || g:ctrlp_allmixes['bufs'] < len(ctrlp#mrufiles#bufs())
  28. endf
  29. fu! s:getnewmix(cwd, clim)
  30. if g:ctrlp_newmix
  31. cal ctrlp#mrufiles#refresh('raw')
  32. let g:ctrlp_newcache = 1
  33. en
  34. let g:ctrlp_lines = copy(ctrlp#files())
  35. cal ctrlp#progress('Mixing...')
  36. let mrufs = copy(ctrlp#mrufiles#list('raw'))
  37. if exists('+ssl') && &ssl
  38. cal map(mrufs, 'tr(v:val, "\\", "/")')
  39. en
  40. let bufs = map(ctrlp#buffers('id'), 'fnamemodify(bufname(v:val), ":p")')
  41. let mrufs = bufs + filter(mrufs, 'index(bufs, v:val) < 0')
  42. if len(mrufs) > len(g:ctrlp_lines)
  43. cal filter(mrufs, 'stridx(v:val, a:cwd)')
  44. el
  45. let cwd_mrufs = filter(copy(mrufs), '!stridx(v:val, a:cwd)')
  46. let cwd_mrufs = ctrlp#rmbasedir(cwd_mrufs)
  47. for each in cwd_mrufs
  48. let id = index(g:ctrlp_lines, each)
  49. if id >= 0 | cal remove(g:ctrlp_lines, id) | en
  50. endfo
  51. en
  52. cal map(mrufs, 'fnamemodify(v:val, ":.")')
  53. let g:ctrlp_lines = len(mrufs) > len(g:ctrlp_lines)
  54. \ ? g:ctrlp_lines + mrufs : mrufs + g:ctrlp_lines
  55. if len(g:ctrlp_lines) <= a:clim
  56. cal sort(g:ctrlp_lines, 'ctrlp#complen')
  57. en
  58. let g:ctrlp_allmixes = { 'filtime': getftime(ctrlp#utils#cachefile()),
  59. \ 'mrutime': getftime(ctrlp#mrufiles#cachefile()), 'cwd': a:cwd,
  60. \ 'bufs': len(ctrlp#mrufiles#bufs()), 'data': g:ctrlp_lines }
  61. endf
  62. " Public {{{1
  63. fu! ctrlp#mixed#init(clim)
  64. let cwd = getcwd()
  65. if s:newcache(cwd)
  66. cal s:getnewmix(cwd, a:clim)
  67. el
  68. let g:ctrlp_lines = g:ctrlp_allmixes['data']
  69. en
  70. let g:ctrlp_newmix = 0
  71. retu g:ctrlp_lines
  72. endf
  73. fu! ctrlp#mixed#id()
  74. retu s:id
  75. endf
  76. "}}}
  77. " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2