Additional config and more intuitive target marge

This commit is contained in:
haya14busa 2015-06-28 22:28:15 +09:00
parent ef0cb2b0a0
commit b6861684ce

View File

@ -261,11 +261,11 @@ function! EasyMotion#LineAnywhere(visualmode, direction) " {{{
return s:EasyMotion_is_cancelled
endfunction " }}}
" -- User Motion -------------------------
function! EasyMotion#User(pattern, visualmode, direction, inclusive) " {{{
function! EasyMotion#User(pattern, visualmode, direction, inclusive, ...) " {{{
let s:current.is_operator = mode(1) ==# 'no' ? 1: 0
let is_inclusive = mode(1) ==# 'no' ? a:inclusive : 0
let re = a:pattern
call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', is_inclusive)
call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', is_inclusive, get(a:, 1, {}))
return s:EasyMotion_is_cancelled
endfunction " }}}
" -- Repeat Motion -----------------------
@ -324,7 +324,7 @@ function! EasyMotion#NextPrevious(visualmode, direction) " {{{
return s:EasyMotion_is_cancelled
endif
let re = s:previous.regexp
let search_direction = (a:direction >= 1 ? 'b' : '')
let search_direction = (a:direction == 1 ? 'b' : '')
if g:EasyMotion_move_highlight
call EasyMotion#highlight#attach_autocmd()
@ -1124,7 +1124,11 @@ function! s:DotPromptUser(groups) "{{{
return s:PromptUser(target)
endif
endfunction "}}}
function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
let s:default_config = {'c': 0}
function! s:EasyMotion(regexp, direction, visualmode, is_inclusive, ...) " {{{
let config = get(a:, 1, copy(s:default_config))
" Store s:current original_position & cursor_position {{{
" current cursor pos.
let s:current.cursor_position = [line('.'), col('.')]
@ -1169,8 +1173,8 @@ function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
call s:turn_off_hl_error()
" }}}
" Setup searchpos args {{{
let search_direction = (a:direction >= 1 ? 'b' : '')
let search_stopline = a:direction >= 1 ? win_first_line : win_last_line
let search_direction = (a:direction == 1 ? 'b' : '')
let search_stopline = a:direction == 1 ? win_first_line : win_last_line
if s:flag.within_line == 1
let search_stopline = s:current.original_position[0]
@ -1215,13 +1219,12 @@ function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
endif
" Construct match dict {{{
" Note: searchpos() has side effect which jump cursor position.
" You can disable this side effect by add 'n' flags,
" but in this case, it's better to allows jump side effect
" to gathering matched targets coordinates.
let pos = searchpos(regexp, search_direction . (config.c ? 'c' : ''), search_stopline)
while 1
" Note: searchpos() has side effect which jump cursor position.
" You can disable this side effect by add 'n' flags,
" but in this case, it's better to allows jump side effect
" to gathering matched targets coordinates.
let pos = searchpos(regexp, search_direction, search_stopline)
" Reached end of search range
if pos == [0, 0]
break
@ -1239,6 +1242,7 @@ function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
endif "}}}
call add(targets, pos)
let pos = searchpos(regexp, search_direction, search_stopline)
endwhile
"}}}
@ -1250,7 +1254,7 @@ function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
"}}}
" Reconstruct match dict
if a:direction == 2
" Forward
" Backward
" Jump back cursor_position
keepjumps call cursor(s:current.cursor_position[0],
@ -1258,13 +1262,13 @@ function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
let targets2 = []
if s:flag.within_line == 0
let search_stopline = win_last_line
let search_stopline = win_first_line
else
let search_stopline = s:current.cursor_position[0]
endif
while 1
" TODO: refactoring
let pos = searchpos(regexp, '', search_stopline)
let pos = searchpos(regexp, 'b', search_stopline)
" Reached end of search range
if pos == [0, 0]
break
@ -1281,19 +1285,19 @@ function! s:EasyMotion(regexp, direction, visualmode, is_inclusive) " {{{
call add(targets2, pos)
endwhile
" Merge match target dict"{{{
let t1 = 0 " backward
let t2 = 0 " forward
let t1 = 0 " forward
let t2 = 0 " backward
let targets3 = []
while t1 < len(targets) || t2 < len(targets2)
" Forward -> Backward -> F -> B -> ...
if t2 < len(targets2)
call add(targets3, targets2[t2])
let t2 += 1
endif
if t1 < len(targets)
call add(targets3, targets[t1])
let t1 += 1
endif
if t2 < len(targets2)
call add(targets3, targets2[t2])
let t2 += 1
endif
endwhile
let targets = targets3
"}}}