Permalink
Browse files

add fuzzyfinder textmate style mod

gotta remove lusty-explorer since sourcing it after
fuzzyfinder_textmate.vim seg faults vim
  • Loading branch information...
1 parent aae10b0 commit 28dcbf31d7025c27b7b892424e82be40cc7a192e @scrooloose scrooloose committed Oct 19, 2008
Showing with 506 additions and 1,484 deletions.
  1. +150 −0 plugin/fuzzyfinder_textmate.vim
  2. +0 −1,484 plugin/lusty-explorer.vim
  3. +353 −0 ruby/fuzzy_file_finder.rb
  4. +3 −0 vimrc
@@ -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
Oops, something went wrong.

0 comments on commit 28dcbf3

Please sign in to comment.