707
|
1 " =============================================================================
|
|
2 " File: autoload/ctrlp/tag.vim
|
|
3 " Description: Tag file extension
|
|
4 " Author: Kien Nguyen <github.com/kien>
|
|
5 " =============================================================================
|
|
6
|
|
7 " Init {{{1
|
|
8 if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag
|
|
9 fini
|
|
10 en
|
|
11 let g:loaded_ctrlp_tag = 1
|
|
12
|
|
13 cal add(g:ctrlp_ext_vars, {
|
|
14 \ 'init': 'ctrlp#tag#init()',
|
|
15 \ 'accept': 'ctrlp#tag#accept',
|
|
16 \ 'lname': 'tags',
|
|
17 \ 'sname': 'tag',
|
|
18 \ 'enter': 'ctrlp#tag#enter()',
|
|
19 \ 'type': 'tabs',
|
|
20 \ })
|
|
21
|
|
22 let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
23 " Utilities {{{1
|
|
24 fu! s:findcount(str, tgaddr)
|
|
25 let [tg, ofname] = split(a:str, '\t\+\ze[^\t]\+$')
|
|
26 let tgs = taglist('^'.tg.'$')
|
|
27 if len(tgs) < 2
|
|
28 retu [0, 0, 0, 0]
|
|
29 en
|
|
30 let bname = fnamemodify(bufname('%'), ':p')
|
|
31 let fname = expand(fnamemodify(simplify(ofname), ':s?^[.\/]\+??:p:.'), 1)
|
|
32 let [fnd, cnt, pos, ctgs, otgs] = [0, 0, 0, [], []]
|
|
33 for tgi in tgs
|
|
34 let lst = bname == fnamemodify(tgi["filename"], ':p') ? 'ctgs' : 'otgs'
|
|
35 cal call('add', [{lst}, tgi])
|
|
36 endfo
|
|
37 let ntgs = ctgs + otgs
|
|
38 for tgi in ntgs
|
|
39 let cnt += 1
|
|
40 let fulname = fnamemodify(tgi["filename"], ':p')
|
|
41 if stridx(fulname, fname) >= 0
|
|
42 \ && strlen(fname) + stridx(fulname, fname) == strlen(fulname)
|
|
43 let fnd += 1
|
|
44 let pos = cnt
|
|
45 en
|
|
46 endfo
|
|
47 let cnt = 0
|
|
48 for tgi in ntgs
|
|
49 let cnt += 1
|
|
50 if tgi["filename"] == ofname
|
|
51 if a:tgaddr != ""
|
|
52 if a:tgaddr == tgi["cmd"]
|
|
53 let [fnd, pos] = [0, cnt]
|
|
54 en
|
|
55 else
|
|
56 let [fnd, pos] = [0, cnt]
|
|
57 en
|
|
58 en
|
|
59 endfo
|
|
60 retu [1, fnd, pos, len(ctgs)]
|
|
61 endf
|
|
62
|
|
63 fu! s:filter(tags)
|
|
64 let nr = 0
|
|
65 wh 0 < 1
|
|
66 if a:tags == [] | brea | en
|
|
67 if a:tags[nr] =~ '^!' && a:tags[nr] !~# '^!_TAG_'
|
|
68 let nr += 1
|
|
69 con
|
|
70 en
|
|
71 if a:tags[nr] =~# '^!_TAG_' && len(a:tags) > nr
|
|
72 cal remove(a:tags, nr)
|
|
73 el
|
|
74 brea
|
|
75 en
|
|
76 endw
|
|
77 retu a:tags
|
|
78 endf
|
|
79
|
|
80 fu! s:syntax()
|
|
81 if !ctrlp#nosy()
|
|
82 cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
|
|
83 sy match CtrlPTabExtra '\zs\t.*\ze$'
|
|
84 en
|
|
85 endf
|
|
86 " Public {{{1
|
|
87 fu! ctrlp#tag#init()
|
|
88 if empty(s:tagfiles) | retu [] | en
|
|
89 let g:ctrlp_alltags = []
|
|
90 let tagfiles = sort(filter(s:tagfiles, 'count(s:tagfiles, v:val) == 1'))
|
|
91 for each in tagfiles
|
|
92 let alltags = s:filter(ctrlp#utils#readfile(each))
|
|
93 cal extend(g:ctrlp_alltags, alltags)
|
|
94 endfo
|
|
95 cal s:syntax()
|
|
96 retu g:ctrlp_alltags
|
|
97 endf
|
|
98
|
|
99 fu! ctrlp#tag#accept(mode, str)
|
|
100 cal ctrlp#exit()
|
|
101 let tgaddr = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\t\zs[^\t]\{-1,}\ze\%(;"\)\?\t')
|
|
102 let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t')
|
|
103 let [tg, fdcnt] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str, tgaddr)]
|
|
104 let cmds = {
|
|
105 \ 't': ['tab sp', 'tab stj'],
|
|
106 \ 'h': ['sp', 'stj'],
|
|
107 \ 'v': ['vs', 'vert stj'],
|
|
108 \ 'e': ['', 'tj'],
|
|
109 \ }
|
|
110 let utg = fdcnt[3] < 2 && fdcnt[0] == 1 && fdcnt[1] == 1
|
|
111 let cmd = !fdcnt[0] || utg ? cmds[a:mode][0] : cmds[a:mode][1]
|
|
112 let cmd = a:mode == 'e' && ctrlp#modfilecond(!&aw)
|
|
113 \ ? ( cmd == 'tj' ? 'stj' : 'sp' ) : cmd
|
|
114 let cmd = a:mode == 't' ? ctrlp#tabcount().cmd : cmd
|
|
115 if !fdcnt[0] || utg
|
|
116 if cmd != ''
|
|
117 exe cmd
|
|
118 en
|
726
|
119 if exists('&cst')
|
|
120 let save_cst = &cst
|
|
121 set cst&
|
|
122 en
|
707
|
123 cal feedkeys(":".( utg ? fdcnt[2] : "" )."ta ".tg."\r", 'nt')
|
726
|
124 if exists('&cst')
|
|
125 let &cst = save_cst
|
|
126 en
|
707
|
127 el
|
|
128 let ext = ""
|
|
129 if fdcnt[1] < 2 && fdcnt[2]
|
|
130 let [sav_more, &more] = [&more, 0]
|
|
131 let ext = fdcnt[2]."\r".":let &more = ".sav_more."\r"
|
|
132 en
|
|
133 cal feedkeys(":".cmd." ".tg."\r".ext, 'nt')
|
|
134 en
|
|
135 cal feedkeys('zvzz', 'nt')
|
|
136 cal ctrlp#setlcdir()
|
|
137 endf
|
|
138
|
|
139 fu! ctrlp#tag#id()
|
|
140 retu s:id
|
|
141 endf
|
|
142
|
|
143 fu! ctrlp#tag#enter()
|
|
144 let tfs = get(g:, 'ctrlp_custom_tag_files', tagfiles())
|
|
145 let s:tagfiles = type(tfs) == 3 && tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'),
|
|
146 \ 'filereadable(v:val)') : []
|
|
147 endf
|
|
148 "}}}
|
|
149
|
|
150 " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|