bookmarkdir.vim 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. " =============================================================================
  2. " File: autoload/ctrlp/bookmarkdir.vim
  3. " Description: Bookmarked directories extension
  4. " Author: Kien Nguyen <github.com/kien>
  5. " =============================================================================
  6. " Init {{{1
  7. if exists('g:loaded_ctrlp_bookmarkdir') && g:loaded_ctrlp_bookmarkdir
  8. fini
  9. en
  10. let g:loaded_ctrlp_bookmarkdir = 1
  11. cal add(g:ctrlp_ext_vars, {
  12. \ 'init': 'ctrlp#bookmarkdir#init()',
  13. \ 'accept': 'ctrlp#bookmarkdir#accept',
  14. \ 'lname': 'bookmarked dirs',
  15. \ 'sname': 'bkd',
  16. \ 'type': 'tabs',
  17. \ 'opmul': 1,
  18. \ 'nolim': 1,
  19. \ 'wipe': 'ctrlp#bookmarkdir#remove',
  20. \ })
  21. let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
  22. " Utilities {{{1
  23. fu! s:getinput(str, ...)
  24. echoh Identifier
  25. cal inputsave()
  26. let input = call('input', a:0 ? [a:str] + a:000 : [a:str])
  27. cal inputrestore()
  28. echoh None
  29. retu input
  30. endf
  31. fu! s:cachefile()
  32. if !exists('s:cadir') || !exists('s:cafile')
  33. let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'bkd'
  34. let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
  35. en
  36. retu s:cafile
  37. endf
  38. fu! s:writecache(lines)
  39. cal ctrlp#utils#writecache(a:lines, s:cadir, s:cafile)
  40. endf
  41. fu! s:getbookmarks()
  42. retu ctrlp#utils#readfile(s:cachefile())
  43. endf
  44. fu! s:savebookmark(name, cwd)
  45. let entries = filter(s:getbookmarks(), 's:parts(v:val)[1] != a:cwd')
  46. cal s:writecache(insert(entries, a:name.' '.a:cwd))
  47. endf
  48. fu! s:setentries()
  49. let time = getftime(s:cachefile())
  50. if !( exists('s:bookmarks') && time == s:bookmarks[0] )
  51. let s:bookmarks = [time, s:getbookmarks()]
  52. en
  53. endf
  54. fu! s:parts(str)
  55. let mlist = matchlist(a:str, '\v([^\t]+)\t(.*)$')
  56. retu mlist != [] ? mlist[1:2] : ['', '']
  57. endf
  58. fu! s:process(entries, type)
  59. retu map(a:entries, 's:modify(v:val, a:type)')
  60. endf
  61. fu! s:modify(entry, type)
  62. let [name, dir] = s:parts(a:entry)
  63. let dir = fnamemodify(dir, a:type)
  64. retu name.' '.( dir == '' ? '.' : dir )
  65. endf
  66. fu! s:msg(name, cwd)
  67. redr
  68. echoh Identifier | echon 'Bookmarked ' | echoh Constant
  69. echon a:name.' ' | echoh Directory | echon a:cwd
  70. echoh None
  71. endf
  72. fu! s:syntax()
  73. if !ctrlp#nosy()
  74. cal ctrlp#hicheck('CtrlPBookmark', 'Identifier')
  75. cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
  76. sy match CtrlPBookmark '^> [^\t]\+' contains=CtrlPLinePre
  77. sy match CtrlPTabExtra '\zs\t.*\ze$'
  78. en
  79. endf
  80. " Public {{{1
  81. fu! ctrlp#bookmarkdir#init()
  82. cal s:setentries()
  83. cal s:syntax()
  84. retu s:process(copy(s:bookmarks[1]), ':.')
  85. endf
  86. fu! ctrlp#bookmarkdir#accept(mode, str)
  87. let parts = s:parts(s:modify(a:str, ':p'))
  88. cal call('s:savebookmark', parts)
  89. if a:mode =~ 't\|v\|h'
  90. cal ctrlp#exit()
  91. en
  92. cal ctrlp#setdir(parts[1], a:mode =~ 't\|h' ? 'chd!' : 'lc!')
  93. if a:mode == 'e'
  94. cal ctrlp#switchtype(0)
  95. cal ctrlp#recordhist()
  96. cal ctrlp#prtclear()
  97. en
  98. endf
  99. fu! ctrlp#bookmarkdir#add(dir)
  100. let str = 'Directory to bookmark: '
  101. let cwd = a:dir != '' ? a:dir : s:getinput(str, getcwd(), 'dir')
  102. if cwd == '' | retu | en
  103. let cwd = fnamemodify(cwd, ':p')
  104. let name = s:getinput('Bookmark as: ', cwd)
  105. if name == '' | retu | en
  106. let name = tr(name, ' ', ' ')
  107. cal s:savebookmark(name, cwd)
  108. cal s:msg(name, cwd)
  109. endf
  110. fu! ctrlp#bookmarkdir#remove(entries)
  111. cal s:process(a:entries, ':p')
  112. cal s:writecache(a:entries == [] ? [] :
  113. \ filter(s:getbookmarks(), 'index(a:entries, v:val) < 0'))
  114. cal s:setentries()
  115. retu s:process(copy(s:bookmarks[1]), ':.')
  116. endf
  117. fu! ctrlp#bookmarkdir#id()
  118. retu s:id
  119. endf
  120. "}}}
  121. " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2