Skip to content

Commit 96b82de

Browse files
author
Gaspar Chilingarov
committed
Module updates and fix for Ctrl-P<->Tagbar integration.
1 parent 2aa144b commit 96b82de

File tree

10 files changed

+118
-22
lines changed

10 files changed

+118
-22
lines changed

autoload/vimide/elixir.vim

Lines changed: 109 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,42 @@ endfunction
1616
"let g:ConqueTerm_CloseOnEnd=1
1717
"let g:alchemist_iex_term_size = 15
1818

19+
20+
1921
function! vimide#elixir#tagbarFilter(tags) " {{{
20-
" remove OTP callbacks from ordinary function list
21-
call filter(a:tags, ' !(v:val.fields.kind == "f" && v:val.name =~ "\\v(handle_call|handle_info|handle_cast|init|terminate)") ')
2222

23-
function! Arity_extract(idx, tag)
24-
if a:tag.fields.kind == 'f' || a:tag.fields.kind == 'g'
25-
let args_string = substitute(a:tag.pattern, "^.*defp\\?[ \t]*".a:tag.name."[ \t]*", "", "")
23+
function! SkipOTPCallbackAsFunction(index, line)
24+
if a:line =~# '^!_TAG_'
25+
return 1
26+
endif
27+
28+
let parts = split(a:line, ';"')
29+
if len(parts) != 2 " Is a valid tag line
30+
return 1
31+
endif
32+
33+
let [name, fname, pattern] = split(parts[0], '\t')
34+
let fields = split(parts[1], '\t')
35+
36+
return ! (fields[0] == 'f' && name =~ "\\v(handle_call|handle_info|handle_cast|init|terminate)" )
37+
endfunction
38+
39+
function! ArityExtract(idx, line)
40+
if a:line =~# '^!_TAG_'
41+
return line
42+
endif
43+
44+
let parts = split(a:line, ';"')
45+
if len(parts) != 2 " Is a valid tag line
46+
return line
47+
endif
48+
49+
let [name, fname, pattern] = split(parts[0], '\t')
50+
let fields = split(parts[1], '\t')
51+
let kind = fields[0]
52+
53+
if kind == 'f' || kind == 'g'
54+
let args_string = substitute(pattern, "^.*defp\\?[ \t]*".name."[ \t]*", "", "")
2655
let args_string = substitute(args_string, "do[ \t]*\\\\[$]$", "", "") " multiline
2756
" TODO: remove
2857
" if a:tag.pattern =~ "defp reply"
@@ -34,7 +63,7 @@ function! vimide#elixir#tagbarFilter(tags) " {{{
3463
let args_len = len(args_string)
3564

3665
if args_len == 0
37-
let a:tag.name = a:tag.name."/0"
66+
let name = name."/0"
3867
else
3968
let old_args_len = -10000
4069
while args_len != old_args_len
@@ -45,17 +74,78 @@ function! vimide#elixir#tagbarFilter(tags) " {{{
4574
endwhile
4675

4776
let comma_count = len(substitute(args_string, "[^,]", "", "g"))
48-
let a:tag.name = a:tag.name . "/" . (comma_count + 1)
77+
let name = name . "/" . (comma_count + 1)
4978
endif
5079

51-
return a:tag
80+
let new_line = join([ join([name, fname, pattern], "\t"), parts[1] ], ';"')
81+
82+
return new_line
5283
else
53-
return a:tag
84+
return a:line
5485
endif
5586
endfunction
5687

88+
function! ParseKindNameLine(line)
89+
if a:line =~# '^!_TAG_'
90+
return []
91+
endif
92+
93+
let parts = split(a:line, ';"')
94+
if len(parts) != 2 " Is a valid tag line
95+
return []
96+
endif
97+
98+
let [name, fname, pattern] = split(parts[0], '\t')
99+
let fields = split(parts[1], '\t')
100+
let kind = fields[0]
101+
let line_no = fields[1]
102+
103+
if line_no !~ '^line:\d\+'
104+
return []
105+
endif
106+
107+
let line_no = split(line_no, ':')
108+
109+
return [ kind, name, line_no[1] ]
110+
endfunction
111+
112+
" remove OTP callbacks from ordinary function list
113+
call filter(a:tags, function("SkipOTPCallbackAsFunction"))
114+
57115
" replaces function names with function_name/arity notation
58-
call map(a:tags, function('Arity_extract'))
116+
call map(a:tags, function('ArityExtract'))
117+
118+
" ---------- create list of first lines when we seen function name ----
119+
let seen_fnames = {}
120+
for line in a:tags
121+
let parsedLine = ParseKindNameLine(line)
122+
if parsedLine != []
123+
let [ kind, name, line_no ] = parsedLine
124+
125+
if ! has_key(seen_fnames, kind.name)
126+
let seen_fnames[kind.name] = line_no
127+
endif
128+
endif
129+
endfor
130+
131+
" leaves only first definition of function with same arity
132+
function! FilterFun(seen_hash, idx, line)
133+
let parsedLine = ParseKindNameLine(a:line)
134+
if parsedLine != []
135+
let [ kind, name, line_no ] = parsedLine
136+
let key = kind . name
137+
return a:seen_hash[key] == line_no
138+
endif
139+
endfunction
140+
141+
call filter(a:tags, function('FilterFun', [seen_fnames]))
142+
143+
return a:tags
144+
endfunction
145+
146+
function! vimide#elixir#tagbarFilterOld(tags)
147+
" remove OTP callbacks from ordinary function list
148+
59149

60150
let seen_list = map(copy(a:tags), '[v:val.fields.kind, v:val.name, v:val.fields.line]')
61151

@@ -77,7 +167,7 @@ function! vimide#elixir#tagbarFilter(tags) " {{{
77167
call filter(a:tags, function('Filter_fun', [seen_fnames]))
78168

79169
return a:tags
80-
endfunction " }}}
170+
endfunction
81171

82172
function! vimide#elixir#installTagbarIntegration()
83173
" ####################################################################
@@ -103,8 +193,7 @@ function! vimide#elixir#installTagbarIntegration()
103193
\ 's:structs',
104194
\ 'p:protocols',
105195
\ 'r:records',
106-
\ 'T:types',
107-
\ 'z:foo'
196+
\ 'T:types'
108197
\ ]
109198
\ }
110199

@@ -162,3 +251,10 @@ function! s:setGlobal(name, default) " {{{
162251
endif
163252
endif
164253
endfunction " }}}
254+
255+
"let s:var1 == readfile("")
256+
"
257+
"let rawtaglist = split(s:var1, '\n\+')
258+
"
259+
260+

bundle/nerdcommenter

bundle/tagbar

bundle/vim-airline

bundle/vim-fugitive

bundle/vim-sleuth

extras/elixir-ctags

Submodule elixir-ctags updated 1 file

0 commit comments

Comments
 (0)