blob: 9cde21494df7a52a00c6d0ef3248135b1717feb4 [file] [log] [blame]
Bram Moolenaarc6249bb2006-04-15 20:25:09 +00001" Vim completion script
Bram Moolenaard8fc5c02006-04-29 21:55:22 +00002" Language: Ruby
3" Maintainer: Mark Guzman <segfault@hasno.info>
4" Info: $Id$
5" URL: http://vim-ruby.rubyforge.org
6" Anon CVS: See above site
7" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
Bram Moolenaarc6249bb2006-04-15 20:25:09 +00008" ----------------------------------------------------------------------------
9"
10" Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
11" ----------------------------------------------------------------------------
12
Bram Moolenaareb3593b2006-04-22 22:33:57 +000013" {{{ requirement checks
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000014if !has('ruby')
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000015 echohl ErrorMsg
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000016 echo "Error: Required vim compiled with +ruby"
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000017 echohl None
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000018 finish
19endif
20
21if version < 700
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000022 echohl ErrorMsg
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000023 echo "Error: Required vim >= 7.0"
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000024 echohl None
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000025 finish
26endif
Bram Moolenaareb3593b2006-04-22 22:33:57 +000027" }}} requirement checks
Bram Moolenaarc6249bb2006-04-15 20:25:09 +000028
Bram Moolenaareb3593b2006-04-22 22:33:57 +000029if !exists("g:rubycomplete_rails")
30 let g:rubycomplete_rails = 0
31endif
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000032
Bram Moolenaareb3593b2006-04-22 22:33:57 +000033if !exists("g:rubycomplete_classes_in_global")
34 let g:rubycomplete_classes_in_global = 0
35endif
36
37" {{{ vim-side support functions
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000038function! GetBufferRubyModule(name)
39 let [snum,enum] = GetBufferRubyEntity(a:name, "module")
40 return snum . '..' . enum
41endfunction
42
43function! GetBufferRubyClass(name)
44 let [snum,enum] = GetBufferRubyEntity(a:name, "class")
45 return snum . '..' . enum
46endfunction
47
48function! GetBufferRubySingletonMethods(name)
49endfunction
50
51function! GetBufferRubyEntity( name, type )
52 let stopline = 1
53 let crex = '^\s*' . a:type . '\s*' . a:name . '\s*\(<\s*.*\s*\)\?\n*\(\(\s\|#\).*\n*\)*\n*\s*end$'
54 let [lnum,lcol] = searchpos( crex, 'nbw')
55 if lnum == 0 && lcol == 0
56 return [0,0]
57 endif
58
59 let [enum,ecol] = searchpos( crex, 'nebw')
60 if lnum > enum
61 let realdef = getline( lnum )
62 let crexb = '^' . realdef . '\n*\(\(\s\|#\).*\n*\)*\n*\s*end$'
63 let [enum,ecol] = searchpos( crexb, 'necw' )
64 endif
65 " we found a the class def
66 return [lnum,enum]
67endfunction
68
69function! IsInClassDef()
70 let [snum,enum] = GetBufferRubyEntity( '.*', "class" )
71 let ret = 'nil'
72 let pos = line('.')
73
Bram Moolenaard8fc5c02006-04-29 21:55:22 +000074 if snum < pos && pos < enum
Bram Moolenaarfc1421e2006-04-20 22:17:20 +000075 let ret = snum . '..' . enum
76 endif
77
78 return ret
79endfunction
80
81function! GetRubyVarType(v)
Bram Moolenaard8fc5c02006-04-29 21:55:22 +000082 let stopline = 1
83 let vtp = ''
84 let pos = getpos('.')
85 let [lnum,lcol] = searchpos('^\s*#\s*@var\s*'.a:v.'\>\s\+[^ \t]\+\s*$','nb',stopline)
86 if lnum != 0 && lcol != 0
87 call setpos('.',pos)
88 let str = getline(lnum)
89 let vtp = substitute(str,'^\s*#\s*@var\s*'.a:v.'\>\s\+\([^ \t]\+\)\s*$','\1','')
90 return vtp
91 endif
92 call setpos('.',pos)
Bram Moolenaar551dbcc2006-04-25 22:13:59 +000093 if g:rubycomplete_rails == 1 && g:rubycomplete_rails_loaded == 1
94 let ctors = '\(now\|new\|open\|get_instance\|find\|create\)'
95 else
96 let ctors = '\(now\|new\|open\|get_instance\)'
97 endif
98
Bram Moolenaard8fc5c02006-04-29 21:55:22 +000099 let [lnum,lcol] = searchpos(''.a:v.'\>\s*[+\-*/]*=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%r{\|[A-Za-z0-9@:\-()]\+...\?\)','nb',stopline)
100 if lnum != 0 && lcol != 0
101 let str = matchstr(getline(lnum),'=\s*\([^ \t]\+.' . ctors . '\>\|[\[{"''/]\|%r{\|[A-Za-z0-9@:\-()]\+...\?\)',lcol)
102 let str = substitute(str,'^=\s*','','')
103 call setpos('.',pos)
104 if str == '"' || str == ''''
105 return 'String'
106 elseif str == '['
107 return 'Array'
108 elseif str == '{'
109 return 'Hash'
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000110 elseif str == '/' || str == '%r{'
111 return 'Regexp'
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000112 elseif strlen(str) >= 4 && stridx(str,'..') != -1
113 return 'Range'
114 elseif strlen(str) > 4
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000115 let l = stridx(str,'.')
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000116 return str[0:l-1]
117 end
118 return ''
119 endif
120 call setpos('.',pos)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000121 return ''
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000122endfunction
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000123
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000124"}}} vim-side support functions
125
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000126function! rubycomplete#Complete(findstart, base)
127 "findstart = 1 when we need to get the text length
128 if a:findstart
129 let line = getline('.')
130 let idx = col('.')
131 while idx > 0
132 let idx -= 1
133 let c = line[idx-1]
134 if c =~ '\w'
135 continue
136 elseif ! c =~ '\.'
137 idx = -1
138 break
139 else
140 break
141 endif
142 endwhile
143
144 return idx
145 "findstart = 0 when we need to return the list of completions
146 else
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000147 let g:rubycomplete_completions = []
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000148 execute "ruby get_completions('" . a:base . "')"
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000149 return g:rubycomplete_completions
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000150 endif
151endfunction
152
153
154function! s:DefRuby()
155ruby << RUBYEOF
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000156# {{{ ruby completion
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000157RailsWords = [
158 "has_many", "has_one",
159 "belongs_to",
160 ]
161
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000162ReservedWords = [
163 "BEGIN", "END",
164 "alias", "and",
165 "begin", "break",
166 "case", "class",
167 "def", "defined", "do",
168 "else", "elsif", "end", "ensure",
169 "false", "for",
170 "if", "in",
171 "module",
172 "next", "nil", "not",
173 "or",
174 "redo", "rescue", "retry", "return",
175 "self", "super",
176 "then", "true",
177 "undef", "unless", "until",
178 "when", "while",
179 "yield",
180 ]
181
182Operators = [ "%", "&", "*", "**", "+", "-", "/",
183 "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>",
184 "[]", "[]=", "^", ]
185
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000186
187def load_requires
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000188 buf = VIM::Buffer.current
189 enum = buf.line_number
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000190 nums = Range.new( 1, enum )
191 nums.each do |x|
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000192 ln = buf[x]
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000193 begin
194 eval( "require %s" % $1 ) if /.*require\s*(.*)$/.match( ln )
195 rescue Exception
196 #ignore?
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000197 end
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000198 end
199end
200
201def load_buffer_class(name)
202 classdef = get_buffer_entity(name, 'GetBufferRubyClass("%s")')
203 return if classdef == nil
204
205 pare = /^\s*class\s*(.*)\s*<\s*(.*)\s*\n/.match( classdef )
206 load_buffer_class( $2 ) if pare != nil
207
208 mixre = /.*\n\s*include\s*(.*)\s*\n/.match( classdef )
209 load_buffer_module( $2 ) if mixre != nil
210
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000211 eval classdef
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000212end
213
214def load_buffer_module(name)
215 classdef = get_buffer_entity(name, 'GetBufferRubyModule("%s")')
216 return if classdef == nil
217
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000218 eval classdef
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000219end
220
221def get_buffer_entity(name, vimfun)
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000222 return nil if /(\"|\')+/.match( name )
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000223 buf = VIM::Buffer.current
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000224 nums = eval( VIM::evaluate( vimfun % name ) )
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000225 return nil if nums == nil
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000226 return nil if nums.min == nums.max && nums.min == 0
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000227
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000228 cur_line = VIM::Buffer.current.line_number
229 classdef = ""
230 nums.each do |x|
231 if x != cur_line
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000232 ln = buf[x]
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000233 classdef += "%s\n" % ln
234 end
235 end
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000236
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000237 return classdef
238end
239
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000240def get_var_type( receiver )
241 if /(\"|\')+/.match( receiver )
242 "String"
243 else
244 VIM::evaluate("GetRubyVarType('%s')" % receiver)
245 end
246end
247
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000248def get_buffer_classes()
249 # this will be a little expensive.
250 allow_aggressive_load = VIM::evaluate('g:rubycomplete_classes_in_global')
251 return [] if allow_aggressive_load != '1'
252
253 buf = VIM::Buffer.current
254 eob = buf.length
255 ret = []
256 rg = 1..eob
257
258 rg.each do |x|
259 if /^\s*class\s*([A-Za-z0-9_-]*)(\s*<\s*([A-Za-z0-9_:-]*))?\s*/.match( buf[x] )
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000260 ret.push $1
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000261 end
262 end
263
264 return ret
265end
266
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000267def load_rails()
268 allow_rails = VIM::evaluate('g:rubycomplete_rails')
269 return if allow_rails != '1'
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000270
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000271 buf_path = VIM::evaluate('expand("%:p")')
272 file_name = VIM::evaluate('expand("%:t")')
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000273 path = buf_path.gsub( file_name, '' )
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000274 path.gsub!( /\\/, "/" )
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000275 pup = [ "./", "../", "../../", "../../../", "../../../../" ]
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000276 pok = nil
277
278 pup.each do |sup|
279 tpok = "%s%sconfig" % [ path, sup ]
280 if File.exists?( tpok )
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000281 pok = tpok
282 break
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000283 end
284 end
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000285
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000286 return if pok == nil
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000287
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000288 bootfile = pok + "/boot.rb"
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000289 envfile = pok + "/environment.rb"
290 if File.exists?( bootfile ) && File.exists?( envfile )
291 begin
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000292 require bootfile
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000293 require envfile
294 require 'console_app'
295 require 'console_with_helpers'
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000296 VIM::command('let g:rubycomplete_rails_loaded = 1')
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000297 rescue
298 print "Error loading rails environment"
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000299 end
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000300 end
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000301end
302
303def get_rails_helpers
304 allow_rails = VIM::evaluate('g:rubycomplete_rails')
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000305 rails_loaded = VIM::evaluate('g:rubycomplete_rails_loaded')
306 return [] if allow_rails != '1' || rails_loaded != '1'
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000307 return RailsWords
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000308end
309
310def get_completions(base)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000311 load_requires
312 load_rails
313
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000314 input = VIM::Buffer.current.line
315 cpos = VIM::Window.current.cursor[1] - 1
316 input = input[0..cpos] if cpos != 0
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000317 input += base
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000318
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000319 rip = input.rindex(/\s/,cpos)
320 if rip
321 input = input[rip..input.length]
322 end
323
324 asn = /^.*(\+|\-|\*|=|\(|\[)=?(\s*[A-Za-z0-9_:@.-]*)(\s*(\{|\+|\-|\*|\%|\/)?\s*).*/
325 if asn.match(input)
326 input = $2
327 end
328
329 input.strip!
330 message = nil
331 receiver = nil
332 candidates = []
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000333
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000334 case input
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000335 when /^(\/[^\/]*\/)\.([^.]*)$/ # Regexp
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000336 receiver = $1
337 message = Regexp.quote($2)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000338 candidates = Regexp.instance_methods(true)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000339
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000340 when /^([^\]]*\])\.([^.]*)$/ # Array
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000341 receiver = $1
342 message = Regexp.quote($2)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000343 candidates = Array.instance_methods(true)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000344
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000345 when /^([^\}]*\})\.([^.]*)$/ # Proc or Hash
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000346 receiver = $1
347 message = Regexp.quote($2)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000348 candidates = Proc.instance_methods(true) | Hash.instance_methods(true)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000349
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000350 when /^(:[^:.]*)$/ # Symbol
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000351 if Symbol.respond_to?(:all_symbols)
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000352 receiver = $1
353 candidates = Symbol.all_symbols.collect{|s| s.id2name}
354 candidates.delete_if { |c| c.match( /'/ ) }
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000355 end
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000356
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000357 when /^::([A-Z][^:\.\(]*)$/ # Absolute Constant or class methods
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000358 receiver = $1
359 candidates = Object.constants
360 candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000361
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000362 when /^(((::)?[A-Z][^:.\(]*)+)::?([^:.]*)$/ # Constant or class methods
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000363 receiver = $1
364 message = Regexp.quote($4)
365 begin
366 candidates = eval("#{receiver}.constants | #{receiver}.methods")
367 rescue Exception
368 candidates = []
369 end
370 candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000371
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000372 when /^(:[^:.]+)\.([^.]*)$/ # Symbol
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000373 receiver = $1
374 message = Regexp.quote($2)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000375 candidates = Symbol.instance_methods(true)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000376
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000377 when /^([0-9_]+(\.[0-9_]+)?(e[0-9]+)?)\.([^.]*)$/ # Numeric
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000378 receiver = $1
379 message = Regexp.quote($4)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000380 begin
381 candidates = eval(receiver).methods
382 rescue Exception
383 candidates
384 end
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000385
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000386 when /^(\$[^.]*)$/ #global
387 candidates = global_variables.grep(Regexp.new(Regexp.quote($1)))
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000388
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000389 when /^((\.?[^.]+)+)\.([^.]*)$/ # variable
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000390 receiver = $1
391 message = Regexp.quote($3)
392 load_buffer_class( receiver )
393
394 cv = eval("self.class.constants")
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000395 vartype = get_var_type( receiver )
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000396 if vartype != ''
397 load_buffer_class( vartype )
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000398
399 begin
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000400 candidates = eval("#{vartype}.instance_methods")
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000401 rescue Exception
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000402 candidates = []
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000403 end
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000404 elsif (cv).include?(receiver)
405 # foo.func and foo is local var.
406 candidates = eval("#{receiver}.methods")
407 elsif /^[A-Z]/ =~ receiver and /\./ !~ receiver
408 # Foo::Bar.func
409 begin
410 candidates = eval("#{receiver}.methods")
411 rescue Exception
412 candidates = []
413 end
414 else
415 # func1.func2
416 candidates = []
417 ObjectSpace.each_object(Module){|m|
418 next if m.name != "IRB::Context" and
419 /^(IRB|SLex|RubyLex|RubyToken)/ =~ m.name
420 candidates.concat m.instance_methods(false)
421 }
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000422 end
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000423
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000424 when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
425 message = $1
426 candidates = Range.instance_methods(true)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000427
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000428 when /^\[(\s*[A-Za-z0-9:^@.%\/+*\(\)\[\]\{\}.\'\"],?)*\].([^.]*)/
429 message = $2
430 candidates = Array.instance_methods(true)
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000431
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000432 when /^\.([^.]*)$/ # unknown(maybe String)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000433 message = Regexp.quote($1)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000434 candidates = String.instance_methods(true)
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000435
436 else
437 inclass = eval( VIM::evaluate("IsInClassDef()") )
438
439 if inclass != nil
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000440 classdef = "%s\n" % VIM::Buffer.current[ inclass.min ]
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000441 found = /^\s*class\s*([A-Za-z0-9_-]*)(\s*<\s*([A-Za-z0-9_:-]*))?\s*\n$/.match( classdef )
442
443 if found != nil
444 receiver = $1
445 message = input
446 load_buffer_class( receiver )
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000447 begin
448 candidates = eval( "#{receiver}.instance_methods" )
449 candidates += get_rails_helpers
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000450 rescue Exception
451 found = nil
452 end
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000453 end
454 end
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000455
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000456 if inclass == nil || found == nil
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000457 candidates = eval("self.class.constants")
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000458 candidates += get_buffer_classes
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000459 message = receiver = input
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000460 end
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000461 end
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000462
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000463 candidates.delete_if { |x| x == nil }
464 candidates.uniq!
465 candidates.sort!
466 candidates = candidates.grep(/^#{Regexp.quote(message)}/) if message != nil
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000467
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000468 outp = ""
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000469 valid = (candidates-Object.instance_methods)
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000470
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000471 rg = 0..valid.length
472 rg.step(150) do |x|
473 stpos = 0+x
474 enpos = 150+x
475 valid[stpos..enpos].each { |c| outp += "{'word':'%s','item':'%s'}," % [ c, c ] }
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000476 outp.sub!(/,$/, '')
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000477
478 VIM::command("call extend(g:rubycomplete_completions, [%s])" % outp)
479 outp = ""
480 end
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000481end
482
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000483# }}} ruby completion
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000484RUBYEOF
485endfunction
486
Bram Moolenaareb3593b2006-04-22 22:33:57 +0000487let g:rubycomplete_rails_loaded = 0
Bram Moolenaarfc1421e2006-04-20 22:17:20 +0000488
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000489call s:DefRuby()
Bram Moolenaard8fc5c02006-04-29 21:55:22 +0000490" vim:tw=78:sw=4:ts=8:et:ft=vim:norl: