tag.vim 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. " =============================================================================
  2. " File: autoload/ctrlp/tag.vim
  3. " Description: Tag file extension
  4. " Author: Kien Nguyen <github.com/kien>
  5. " =============================================================================
  6. " Init {{{1
  7. if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag
  8. fini
  9. en
  10. let g:loaded_ctrlp_tag = 1
  11. cal add(g:ctrlp_ext_vars, {
  12. \ 'init': 'ctrlp#tag#init()',
  13. \ 'accept': 'ctrlp#tag#accept',
  14. \ 'lname': 'tags',
  15. \ 'sname': 'tag',
  16. \ 'enter': 'ctrlp#tag#enter()',
  17. \ 'type': 'tabs',
  18. \ })
  19. let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
  20. " Utilities {{{1
  21. fu! s:findcount(str)
  22. let [tg, fname] = split(a:str, '\t\+\ze[^\t]\+$')
  23. let [fname, tgs] = [expand(fname, 1), taglist('^'.tg.'$')]
  24. if empty(tgs) | retu [1, 1] | en
  25. let [fnd, ct, pos] = [0, 0, 0]
  26. for each in tgs
  27. let ct += 1
  28. let fulname = fnamemodify(each["filename"], ':p')
  29. if stridx(fulname, fname) >= 0
  30. \ && strlen(fname) + stridx(fulname, fname) == strlen(fulname)
  31. let fnd += 1
  32. let pos = ct
  33. en
  34. if fnd > 1 | brea | en
  35. endfo
  36. retu [fnd, pos]
  37. endf
  38. fu! s:filter(tags)
  39. let [nr, alltags] = [0, a:tags]
  40. wh 0 < 1
  41. if alltags[nr] =~ '^!' && alltags[nr] !~ '^!_TAG_'
  42. let nr += 1
  43. con
  44. en
  45. if alltags[nr] =~ '^!_TAG_' && len(alltags) > nr
  46. cal remove(alltags, nr)
  47. el
  48. brea
  49. en
  50. endw
  51. retu alltags
  52. endf
  53. fu! s:syntax()
  54. if !ctrlp#nosy()
  55. cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
  56. sy match CtrlPTabExtra '\zs\t.*\ze$'
  57. en
  58. endf
  59. " Public {{{1
  60. fu! ctrlp#tag#init()
  61. if empty(s:tagfiles) | retu [] | en
  62. let g:ctrlp_alltags = []
  63. let tagfiles = sort(filter(s:tagfiles, 'count(s:tagfiles, v:val) == 1'))
  64. for each in tagfiles
  65. let alltags = s:filter(ctrlp#utils#readfile(each))
  66. cal extend(g:ctrlp_alltags, alltags)
  67. endfo
  68. cal s:syntax()
  69. retu g:ctrlp_alltags
  70. endf
  71. fu! ctrlp#tag#accept(mode, str)
  72. cal ctrlp#exit()
  73. let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t')
  74. let [tg, fnd] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str)]
  75. let cmds = {
  76. \ 't': ['tab sp', 'tab stj'],
  77. \ 'h': ['sp', 'stj'],
  78. \ 'v': ['vs', 'vert stj'],
  79. \ 'e': ['', 'tj'],
  80. \ }
  81. let cmd = fnd[0] == 1 ? cmds[a:mode][0] : cmds[a:mode][1]
  82. let cmd = cmd == 'tj' && &modified ? 'hid '.cmd : cmd
  83. let cmd = cmd =~ '^tab' ? tabpagenr('$').cmd : cmd
  84. if fnd[0] == 1
  85. if cmd != ''
  86. exe cmd
  87. en
  88. exe fnd[1].'ta' tg
  89. el
  90. exe cmd tg
  91. en
  92. cal ctrlp#setlcdir()
  93. endf
  94. fu! ctrlp#tag#id()
  95. retu s:id
  96. endf
  97. fu! ctrlp#tag#enter()
  98. let tfs = tagfiles()
  99. let s:tagfiles = tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'),
  100. \ 'filereadable(v:val)') : []
  101. endf
  102. "}}}
  103. " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2