mrufiles.vim 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. " =============================================================================
  2. " File: autoload/ctrlp/mrufiles.vim
  3. " Description: Most Recently Used Files extension
  4. " Author: Kien Nguyen <github.com/kien>
  5. " =============================================================================
  6. " Static variables {{{1
  7. let [s:mrbs, s:mrufs] = [[], []]
  8. fu! ctrlp#mrufiles#opts()
  9. let [pref, opts] = ['g:ctrlp_mruf_', {
  10. \ 'max': ['s:max', 250],
  11. \ 'include': ['s:in', ''],
  12. \ 'exclude': ['s:ex', ''],
  13. \ 'case_sensitive': ['s:cseno', 1],
  14. \ 'relative': ['s:re', 0],
  15. \ 'save_on_update': ['s:soup', 1],
  16. \ }]
  17. for [ke, va] in items(opts)
  18. let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]]
  19. endfo
  20. endf
  21. cal ctrlp#mrufiles#opts()
  22. " Utilities {{{1
  23. fu! s:excl(fn)
  24. retu !empty({s:ex}) && a:fn =~# {s:ex}
  25. endf
  26. fu! s:mergelists()
  27. let diskmrufs = ctrlp#utils#readfile(ctrlp#mrufiles#cachefile())
  28. cal filter(diskmrufs, 'index(s:mrufs, v:val) < 0')
  29. let mrufs = s:mrufs + diskmrufs
  30. retu s:chop(mrufs)
  31. endf
  32. fu! s:chop(mrufs)
  33. if len(a:mrufs) > {s:max} | cal remove(a:mrufs, {s:max}, -1) | en
  34. retu a:mrufs
  35. endf
  36. fu! s:reformat(mrufs, ...)
  37. let cwd = getcwd()
  38. let cwd .= cwd !~ '[\/]$' ? ctrlp#utils#lash() : ''
  39. if {s:re}
  40. let cwd = exists('+ssl') ? tr(cwd, '/', '\') : cwd
  41. cal filter(a:mrufs, '!stridx(v:val, cwd)')
  42. en
  43. if a:0 && a:1 == 'raw' | retu a:mrufs | en
  44. let idx = strlen(cwd)
  45. if exists('+ssl') && &ssl
  46. let cwd = tr(cwd, '\', '/')
  47. cal map(a:mrufs, 'tr(v:val, "\\", "/")')
  48. en
  49. retu map(a:mrufs, '!stridx(v:val, cwd) ? strpart(v:val, idx) : v:val')
  50. endf
  51. fu! s:record(bufnr)
  52. if s:locked | retu | en
  53. let bufnr = a:bufnr + 0
  54. let bufname = bufname(bufnr)
  55. if bufnr > 0 && !empty(bufname)
  56. cal filter(s:mrbs, 'v:val != bufnr')
  57. cal insert(s:mrbs, bufnr)
  58. cal s:addtomrufs(bufname)
  59. en
  60. endf
  61. fu! s:addtomrufs(fname)
  62. let fn = fnamemodify(a:fname, ':p')
  63. let fn = exists('+ssl') ? tr(fn, '/', '\') : fn
  64. if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} )
  65. \ || !empty(getbufvar('^'.fn.'$', '&bt')) || !filereadable(fn) | retu
  66. en
  67. let idx = index(s:mrufs, fn, 0, !{s:cseno})
  68. if idx
  69. cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn')
  70. cal insert(s:mrufs, fn)
  71. if {s:soup} && idx < 0
  72. cal s:savetofile(s:mergelists())
  73. en
  74. en
  75. endf
  76. fu! s:savetofile(mrufs)
  77. cal ctrlp#utils#writecache(a:mrufs, s:cadir, s:cafile)
  78. endf
  79. " Public {{{1
  80. fu! ctrlp#mrufiles#refresh(...)
  81. let mrufs = s:mergelists()
  82. cal filter(mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)')
  83. if exists('+ssl')
  84. cal map(mrufs, 'tr(v:val, "/", "\\")')
  85. cal map(s:mrufs, 'tr(v:val, "/", "\\")')
  86. let cond = 'count(mrufs, v:val, !{s:cseno}) == 1'
  87. cal filter(mrufs, cond)
  88. cal filter(s:mrufs, cond)
  89. en
  90. cal s:savetofile(mrufs)
  91. retu a:0 && a:1 == 'raw' ? [] : s:reformat(mrufs)
  92. endf
  93. fu! ctrlp#mrufiles#remove(files)
  94. let mrufs = []
  95. if a:files != []
  96. let mrufs = s:mergelists()
  97. let cond = 'index(a:files, v:val, 0, !{s:cseno}) < 0'
  98. cal filter(mrufs, cond)
  99. cal filter(s:mrufs, cond)
  100. en
  101. cal s:savetofile(mrufs)
  102. retu s:reformat(mrufs)
  103. endf
  104. fu! ctrlp#mrufiles#add(fn)
  105. if !empty(a:fn)
  106. cal s:addtomrufs(a:fn)
  107. en
  108. endf
  109. fu! ctrlp#mrufiles#list(...)
  110. retu a:0 ? a:1 == 'raw' ? s:reformat(s:mergelists(), a:1) : 0
  111. \ : s:reformat(s:mergelists())
  112. endf
  113. fu! ctrlp#mrufiles#bufs()
  114. retu s:mrbs
  115. endf
  116. fu! ctrlp#mrufiles#tgrel()
  117. let {s:re} = !{s:re}
  118. endf
  119. fu! ctrlp#mrufiles#cachefile()
  120. if !exists('s:cadir') || !exists('s:cafile')
  121. let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'mru'
  122. let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
  123. en
  124. retu s:cafile
  125. endf
  126. fu! ctrlp#mrufiles#init()
  127. if !has('autocmd') | retu | en
  128. let s:locked = 0
  129. aug CtrlPMRUF
  130. au!
  131. au BufAdd,BufEnter,BufLeave,BufWritePost * cal s:record(expand('<abuf>', 1))
  132. au QuickFixCmdPre *vimgrep* let s:locked = 1
  133. au QuickFixCmdPost *vimgrep* let s:locked = 0
  134. au VimLeavePre * cal s:savetofile(s:mergelists())
  135. aug END
  136. endf
  137. "}}}
  138. " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2