comparison .vim/plugin/fuzzyfinder_textmate.vim @ 0:c30d68fbd368

Initial import from svn.
author Augie Fackler <durin42@gmail.com>
date Wed, 26 Nov 2008 10:56:09 -0600
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:c30d68fbd368
1 if has("ruby")
2
3 " ====================================================================================
4 " COPIED FROM FUZZYFINDER.VIM {{{
5 " since they can't be called from outside fuzzyfinder.vim
6 " ====================================================================================
7 function! s:GetCurrentTagFiles()
8 return sort(filter(map(tagfiles(), 'fnamemodify(v:val, '':p'')'), 'filereadable(v:val)'))
9 endfunction
10
11 function! s:HighlightPrompt(prompt, highlight)
12 syntax clear
13 execute printf('syntax match %s /^\V%s/', a:highlight, escape(a:prompt, '\'))
14 endfunction
15
16 function! s:HighlightError()
17 syntax clear
18 syntax match Error /^.*$/
19 endfunction
20 " ------------------------------------------------------------------------------------
21 " }}}
22 " ====================================================================================
23
24 command! -bang -narg=? -complete=file FuzzyFinderTextMate call FuzzyFinderTextMateLauncher(<q-args>, len(<q-bang>), bufnr('%'), s:GetCurrentTagFiles())
25
26 function! InstantiateTextMateMode() "{{{
27 ruby << RUBY
28 begin
29 require "#{ENV['HOME']}/.vim/ruby/fuzzy_file_finder"
30 rescue LoadError
31 begin
32 require 'rubygems'
33 begin
34 gem 'fuzzy_file_finder'
35 rescue Gem::LoadError
36 gem 'jamis-fuzzy_file_finder'
37 end
38 rescue LoadError
39 end
40
41 require 'fuzzy_file_finder'
42 end
43 RUBY
44
45 " Configuration option: g:fuzzy_roots
46 " Specifies roots in which the FuzzyFinder will search.
47 if !exists('g:fuzzy_roots')
48 let g:fuzzy_roots = ['.']
49 endif
50
51 " Configuration option: g:fuzzy_ceiling
52 " Specifies the maximum number of files that FuzzyFinder allows to be searched
53 if !exists('g:fuzzy_ceiling')
54 let g:fuzzy_ceiling = 10000
55 endif
56
57 " Configuration option: g:fuzzy_ignore
58 " A semi-colon delimited list of file glob patterns to ignore
59 if !exists('g:fuzzy_ignore')
60 let g:fuzzy_ignore = ""
61 endif
62
63 " Configuration option: g:fuzzy_matching_limit
64 " The maximum number of matches to return at a time. Defaults to 200, via the
65 " g:FuzzyFinderMode.TextMate.matching_limit variable, but using a global variable
66 " makes it easier to set this value.
67
68 ruby << RUBY
69 def finder
70 @finder ||= begin
71 roots = VIM.evaluate("g:fuzzy_roots").split("\n")
72 ceiling = VIM.evaluate("g:fuzzy_ceiling").to_i
73 ignore = VIM.evaluate("g:fuzzy_ignore").split(/;/)
74 FuzzyFileFinder.new(roots, ceiling, ignore)
75 end
76 end
77 RUBY
78
79 let g:FuzzyFinderMode.TextMate = copy(g:FuzzyFinderMode.Base)
80
81 " ================================================================================
82 " This function is copied almost whole-sale from fuzzyfinder.vim. Ideally, I could
83 " used the on_complete callback to more cleanly add the new behavior, but the
84 " TextMate-style completion broke a few of fuzzyfinder.vim's assumptions, and the
85 " only way to patch that up was to override Base.complete...which required me to
86 " copy-and-paste much of the original implementation.
87 "
88 " Ugly. But effective.
89 " ================================================================================
90 function! g:FuzzyFinderMode.TextMate.complete(findstart, base)
91 if a:findstart
92 return 0
93 elseif !self.exists_prompt(a:base) || len(self.remove_prompt(a:base)) < self.min_length
94 return []
95 endif
96 call s:HighlightPrompt(self.prompt, self.prompt_highlight)
97
98 let result = []
99
100 if exists('g:fuzzy_matching_limit')
101 let l:limit = g:fuzzy_matching_limit
102 else
103 let l:limit = self.matching_limit
104 endif
105
106 ruby << RUBY
107 text = VIM.evaluate('self.remove_prompt(a:base)')
108 limit = VIM.evaluate('l:limit').to_i
109
110 matches = finder.find(text, limit)
111 matches.sort_by { |a| [-a[:score], a[:path]] }.each_with_index do |match, index|
112 word = match[:path]
113 abbr = "%2d: %s" % [index+1, match[:abbr]]
114 menu = "[%5d]" % [match[:score] * 10000]
115 VIM.evaluate("add(result, { 'word' : #{word.inspect}, 'abbr' : #{abbr.inspect}, 'menu' : #{menu.inspect} })")
116 end
117 RUBY
118
119 if empty(result) || len(result) >= self.matching_limit
120 call s:HighlightError()
121 endif
122
123 if !empty(result)
124 call feedkeys("\<C-p>\<Down>", 'n')
125 endif
126
127 return result
128 endfunction
129
130 function! FuzzyFinderTextMateLauncher(initial_text, partial_matching, prev_bufnr, tag_files)
131 call g:FuzzyFinderMode.TextMate.launch(a:initial_text, a:partial_matching, a:prev_bufnr, a:tag_files)
132 endfunction
133
134 let g:FuzzyFinderOptions.TextMate = copy(g:FuzzyFinderOptions.File)
135 endfunction "}}}
136
137 if !exists('loaded_fuzzyfinder') "{{{
138 function! FuzzyFinderTextMateLauncher(initial_text, partial_matching, prev_bufnr, tag_files)
139 call InstantiateTextMateMode()
140 function! FuzzyFinderTextMateLauncher(initial_text, partial_matching, prev_bufnr, tag_files)
141 call g:FuzzyFinderMode.TextMate.launch(a:initial_text, a:partial_matching, a:prev_bufnr, a:tag_files)
142 endfunction
143 call g:FuzzyFinderMode.TextMate.launch(a:initial_text, a:partial_matching, a:prev_bufnr, a:tag_files)
144 endfunction
145 finish
146 end "}}}
147
148 call InstantiateTextMateMode()
149
150 endif