diff .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
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/.vim/plugin/fuzzyfinder_textmate.vim
@@ -0,0 +1,150 @@
+if has("ruby")
+
+" ====================================================================================
+" COPIED FROM FUZZYFINDER.VIM {{{
+" since they can't be called from outside fuzzyfinder.vim
+" ====================================================================================
+function! s:GetCurrentTagFiles()
+  return sort(filter(map(tagfiles(), 'fnamemodify(v:val, '':p'')'), 'filereadable(v:val)'))
+endfunction
+
+function! s:HighlightPrompt(prompt, highlight)
+  syntax clear
+  execute printf('syntax match %s /^\V%s/', a:highlight, escape(a:prompt, '\'))
+endfunction
+
+function! s:HighlightError()
+  syntax clear
+  syntax match Error  /^.*$/
+endfunction
+" ------------------------------------------------------------------------------------
+" }}}
+" ====================================================================================
+
+command! -bang -narg=? -complete=file   FuzzyFinderTextMate   call FuzzyFinderTextMateLauncher(<q-args>, len(<q-bang>), bufnr('%'), s:GetCurrentTagFiles())
+
+function! InstantiateTextMateMode() "{{{
+ruby << RUBY
+  begin
+    require "#{ENV['HOME']}/.vim/ruby/fuzzy_file_finder"
+  rescue LoadError
+    begin
+      require 'rubygems'
+      begin
+        gem 'fuzzy_file_finder'
+      rescue Gem::LoadError
+        gem 'jamis-fuzzy_file_finder'
+      end
+    rescue LoadError
+    end
+
+    require 'fuzzy_file_finder'
+  end
+RUBY
+
+  " Configuration option: g:fuzzy_roots
+  " Specifies roots in which the FuzzyFinder will search.
+  if !exists('g:fuzzy_roots')
+    let g:fuzzy_roots = ['.']
+  endif
+
+  " Configuration option: g:fuzzy_ceiling
+  " Specifies the maximum number of files that FuzzyFinder allows to be searched
+  if !exists('g:fuzzy_ceiling')
+    let g:fuzzy_ceiling = 10000
+  endif
+
+  " Configuration option: g:fuzzy_ignore
+  " A semi-colon delimited list of file glob patterns to ignore
+  if !exists('g:fuzzy_ignore')
+    let g:fuzzy_ignore = ""
+  endif
+
+  " Configuration option: g:fuzzy_matching_limit
+  " The maximum number of matches to return at a time. Defaults to 200, via the
+  " g:FuzzyFinderMode.TextMate.matching_limit variable, but using a global variable
+  " makes it easier to set this value.
+
+ruby << RUBY
+  def finder
+    @finder ||= begin
+      roots = VIM.evaluate("g:fuzzy_roots").split("\n")
+      ceiling = VIM.evaluate("g:fuzzy_ceiling").to_i
+      ignore = VIM.evaluate("g:fuzzy_ignore").split(/;/)
+      FuzzyFileFinder.new(roots, ceiling, ignore)
+    end
+  end
+RUBY
+
+  let g:FuzzyFinderMode.TextMate = copy(g:FuzzyFinderMode.Base)
+
+  " ================================================================================
+  " This function is copied almost whole-sale from fuzzyfinder.vim. Ideally, I could
+  " used the on_complete callback to more cleanly add the new behavior, but the
+  " TextMate-style completion broke a few of fuzzyfinder.vim's assumptions, and the
+  " only way to patch that up was to override Base.complete...which required me to
+  " copy-and-paste much of the original implementation.
+  "
+  " Ugly. But effective.
+  " ================================================================================
+  function! g:FuzzyFinderMode.TextMate.complete(findstart, base)
+    if a:findstart
+      return 0
+    elseif  !self.exists_prompt(a:base) || len(self.remove_prompt(a:base)) < self.min_length
+      return []
+    endif
+    call s:HighlightPrompt(self.prompt, self.prompt_highlight)
+
+    let result = []
+
+    if exists('g:fuzzy_matching_limit')
+      let l:limit = g:fuzzy_matching_limit
+    else
+      let l:limit = self.matching_limit
+    endif
+
+    ruby << RUBY
+      text = VIM.evaluate('self.remove_prompt(a:base)')
+      limit = VIM.evaluate('l:limit').to_i
+
+      matches = finder.find(text, limit)
+      matches.sort_by { |a| [-a[:score], a[:path]] }.each_with_index do |match, index|
+        word = match[:path]
+        abbr = "%2d: %s" % [index+1, match[:abbr]]
+        menu = "[%5d]" % [match[:score] * 10000]
+        VIM.evaluate("add(result, { 'word' : #{word.inspect}, 'abbr' : #{abbr.inspect}, 'menu' : #{menu.inspect} })")
+      end
+RUBY
+
+    if empty(result) || len(result) >= self.matching_limit
+      call s:HighlightError()
+    endif
+
+    if !empty(result)
+      call feedkeys("\<C-p>\<Down>", 'n')
+    endif
+
+    return result
+  endfunction
+
+  function! FuzzyFinderTextMateLauncher(initial_text, partial_matching, prev_bufnr, tag_files)
+    call g:FuzzyFinderMode.TextMate.launch(a:initial_text, a:partial_matching, a:prev_bufnr, a:tag_files)
+  endfunction
+
+  let g:FuzzyFinderOptions.TextMate = copy(g:FuzzyFinderOptions.File)
+endfunction "}}}
+
+if !exists('loaded_fuzzyfinder') "{{{
+  function! FuzzyFinderTextMateLauncher(initial_text, partial_matching, prev_bufnr, tag_files)
+    call InstantiateTextMateMode()
+    function! FuzzyFinderTextMateLauncher(initial_text, partial_matching, prev_bufnr, tag_files)
+      call g:FuzzyFinderMode.TextMate.launch(a:initial_text, a:partial_matching, a:prev_bufnr, a:tag_files)
+    endfunction
+    call g:FuzzyFinderMode.TextMate.launch(a:initial_text, a:partial_matching, a:prev_bufnr, a:tag_files)
+  endfunction
+  finish
+end "}}}
+
+call InstantiateTextMateMode()
+
+endif