Compare commits

...

4 Commits
0.4.0 ... 0.4.2

Author SHA1 Message Date
Junegunn Choi
423e26b0c9 Better handling of NFD chars 2013-11-17 12:32:38 +09:00
Junegunn Choi
84921df0e3 Fix extended-search on non-darwin env 2013-11-17 11:47:52 +09:00
Junegunn Choi
6a5e1de6f3 Fix missing NFD conversion in extended-search mode 2013-11-17 11:20:06 +09:00
Junegunn Choi
90adda73b0 Update Vim plugin
Changes:
- Rename g:fzf_command to g:fzf_source
- Support multi-select mode
- Add fzf#run(vim_command, fzf_args) function

Todo:
- Faster startup with --disable-gems option when available
2013-11-17 02:41:10 +09:00
5 changed files with 71 additions and 31 deletions

View File

@@ -139,13 +139,25 @@ If you install fzf as a Vim plugin, `:FZF` command will be added.
```vim
:FZF
:FZF --no-sort
:FZF --no-sort -m
```
You can override the command which produces input to fzf.
You can override the source command which produces input to fzf.
```vim
let g:fzf_command = 'find . -type f'
let g:fzf_source = 'find . -type f'
```
And you can predefine default options to fzf command.
```vim
let g:fzf_options = '--no-color --extended'
```
For more advanced uses, you can call `fzf#run` function as follows.
```vim
:call fzf#run('tabedit', '-m +c')
```
Most of the time, you will prefer native Vim plugins with better integration

37
fzf
View File

@@ -137,21 +137,21 @@ class FZF
NFC_END = NFC_BEGIN + CHOSUNGS * JUNGSUNGS * JONGSUNGS
def self.nfd str
ret = ''
str.split(//).each do |c|
str.split(//).map do |c|
cp = c.ord
if cp >= NFC_BEGIN && cp < NFC_END
chr = ''
idx = cp - NFC_BEGIN
cho = CHOSUNG + idx / JJCOUNT
jung = JUNGSUNG + (idx % JJCOUNT) / JONGSUNGS
jong = JONGSUNG + idx % JONGSUNGS
ret << cho << jung
ret << jong if jong != JONGSUNG
chr << cho << jung
chr << jong if jong != JONGSUNG
chr
else
ret << c
c
end
end
ret
end
def self.to_nfc arr
@@ -214,8 +214,12 @@ class FZF
end
class Matcher
def convert_query q
UConv.nfd(q).split(//)
def query_chars q
UConv.nfd(q)
end
def sanitize q
UConv.nfd(q).join
end
end
else
@@ -224,9 +228,13 @@ class FZF
end
class Matcher
def convert_query q
def query_chars q
q.split(//)
end
def sanitize q
q
end
end
end
@@ -747,9 +755,10 @@ class FZF
def fuzzy_regex q
@regexp[q] ||= begin
q = q.downcase if @rxflag != 0
Regexp.new(convert_query(q).inject('') { |sum, e|
Regexp.new(query_chars(q).inject('') { |sum, e|
e = Regexp.escape e
sum << "#{e}[^#{e}]*?"
sum << (e.length > 1 ? "(?:#{e}).*?" : # FIXME: not equivalent
"#{e}[^#{e}]*?")
}, @rxflag)
end
end
@@ -804,13 +813,13 @@ class FZF
nil
when /^'/
w.length > 1 ?
Regexp.new(Regexp.escape(w[1..-1]), rxflag) : nil
Regexp.new(sanitize(Regexp.escape(w[1..-1])), rxflag) : nil
when /^\^/
w.length > 1 ?
Regexp.new('^' << Regexp.escape(w[1..-1]), rxflag) : nil
Regexp.new('^' << sanitize(Regexp.escape(w[1..-1])), rxflag) : nil
when /\$$/
w.length > 1 ?
Regexp.new(Regexp.escape(w[0..-2]) << '$', rxflag) : nil
Regexp.new(sanitize(Regexp.escape(w[0..-2])) << '$', rxflag) : nil
else
fuzzy_regex w
end, invert ]

View File

@@ -1,7 +1,7 @@
# coding: utf-8
Gem::Specification.new do |spec|
spec.name = 'fzf'
spec.version = '0.4.0'
spec.version = '0.4.2'
spec.authors = ['Junegunn Choi']
spec.email = ['junegunn.c@gmail.com']
spec.description = %q{Fuzzy finder for your shell}

View File

@@ -23,23 +23,25 @@
let s:exec = expand('<sfile>:h:h').'/fzf'
function! s:fzf(args)
function! fzf#run(command, args)
try
let tf = tempname()
let prefix = exists('g:fzf_command') ? g:fzf_command.'|' : ''
let fzf = executable(s:exec) ? s:exec : 'fzf'
execute "silent !".prefix.fzf." ".a:args." > ".tf
let tf = tempname()
let prefix = exists('g:fzf_source') ? g:fzf_source.'|' : ''
let fzf = executable(s:exec) ? s:exec : 'fzf'
let options = empty(a:args) ? get(g:, 'fzf_options', '') : a:args
execute "silent !".prefix.fzf.' '.options." > ".tf
if !v:shell_error
let file = join(readfile(tf), '')
if !empty(file)
execute 'silent e '.file
endif
for line in readfile(tf)
if !empty(line)
execute a:command.' '.line
endif
endfor
endif
finally
silent! call delete(tf)
redraw!
silent! call delete(tf)
endtry
endfunction
command! -nargs=* FZF call s:fzf(<q-args>)
command! -nargs=* FZF call fzf#run('silent e', <q-args>)

View File

@@ -293,8 +293,25 @@ class TestFZF < MiniTest::Unit::TestCase
def test_nfd
nfc = '한글'
nfd = FZF::UConv.nfd(nfc)
assert_equal 6, nfd.length
assert_equal NFD, nfd
assert_equal 2, nfd.length
assert_equal 6, nfd.join.length
assert_equal NFD, nfd.join
end
def test_nfd_fuzzy_matcher
matcher = FZF::FuzzyMatcher.new 0
assert_equal [], matcher.match([NFD + NFD], '할', '', '')
match = matcher.match([NFD + NFD], '글글', '', '')
assert_equal [[NFD + NFD, [[3, 12]]]], match
assert_equal ['한글한글', [[1, 4]]], FZF::UConv.nfc(*match.first)
end
def test_nfd_extended_fuzzy_matcher
matcher = FZF::ExtendedFuzzyMatcher.new 0
assert_equal [], matcher.match([NFD], "'글글", '', '')
match = matcher.match([NFD], "'한글", '', '')
assert_equal [[NFD, [[0, 6]]]], match
assert_equal ['한글', [[0, 2]]], FZF::UConv.nfc(*match.first)
end
end