diff --git a/plugin/EasyMotion.vim b/plugin/EasyMotion.vim index b11d3ac..65c9072 100644 --- a/plugin/EasyMotion.vim +++ b/plugin/EasyMotion.vim @@ -9,8 +9,8 @@ " http://www.vim.org/scripts/script.php?script_id=3437 " " This script addresses some issues with the original PreciseJump -" script. It only works in normal mode (for now), and it works correctly -" with the following motions: f F t T w e b +" script. It works correctly with the following motions in both normal +" and visual mode: f F t T w e b " " Default key mapping: " - f {char} @@ -60,14 +60,21 @@ " Default key mapping {{{ if g:EasyMotion_do_mapping nnoremap f :call EasyMotionF(0) + vnoremap f :call EasyMotionF(0, visualmode()) nnoremap F :call EasyMotionF(1) + vnoremap F :call EasyMotionF(1, visualmode()) nnoremap t :call EasyMotionT(0) + vnoremap t :call EasyMotionT(0, visualmode()) nnoremap T :call EasyMotionT(1) + vnoremap T :call EasyMotionT(1, visualmode()) nnoremap w :call EasyMotionW() + vnoremap w :call EasyMotionW(visualmode()) nnoremap e :call EasyMotionE() + vnoremap e :call EasyMotionE(visualmode()) nnoremap b :call EasyMotionB() + vnoremap b :call EasyMotionB(visualmode()) endif " }}} " Initialize variables {{{ @@ -83,19 +90,19 @@ " Motion functions {{{ " F key motions {{{ " Go to {char} to the right or the left - function! EasyMotionF(direction) + function! EasyMotionF(direction, ...) call Prompt('Search for character') let char = getchar() let re = '\C' . escape(nr2char(char), '.$^~') - call EasyMotion(re, a:direction) + call EasyMotion(re, a:direction, a:0 > 0 ? a:1 : '') endfunction " }}} " T key motions {{{ " Go to {char} to the right (before) or the left (after) - function! EasyMotionT(direction) + function! EasyMotionT(direction, ...) call Prompt('Search for character') let char = getchar() @@ -106,25 +113,25 @@ let re = '\C.' . escape(nr2char(char), '.$^~') endif - call EasyMotion(re, a:direction) + call EasyMotion(re, a:direction, a:0 > 0 ? a:1 : '') endfunction " }}} " W key motions {{{ " Beginning of word forward - function! EasyMotionW() - call EasyMotion('\<.', 0) + function! EasyMotionW(...) + call EasyMotion('\<.', 0, a:0 > 0 ? a:1 : '') endfunction " }}} " E key motions {{{ " End of word forward - function! EasyMotionE() - call EasyMotion('.\>', 0) + function! EasyMotionE(...) + call EasyMotion('.\>', 0, a:0 > 0 ? a:1 : '') endfunction " }}} " B key motions {{{ " Beginning of word backward - function! EasyMotionB() - call EasyMotion('\<.', 1) + function! EasyMotionB(...) + call EasyMotion('\<.', 1, a:0 > 0 ? a:1 : '') endfunction " }}} " }}} @@ -268,9 +275,10 @@ endif endtry endfunction "}}} - function! s:EasyMotion(regexp, direction) " {{{ + function! s:EasyMotion(regexp, direction, ...) " {{{ let orig_pos = [line('.'), col('.')] let targets = [] + let visualmode = a:0 > 0 ? a:1 : '' " Find motion targets while 1 @@ -300,6 +308,9 @@ call Message('No matches') + " Restore cursor position + call setpos('.', [0, orig_pos[0], orig_pos[1]]) + return endif @@ -351,10 +362,34 @@ " Cancelled by user call Message('Operation cancelled') + " Restore cursor position/selection + if ! empty(visualmode) + silent exec 'normal! `<' . visualmode . '`>' + else + call setpos('.', [0, orig_pos[0], orig_pos[1]]) + endif + return else - " Jump to coords - call setpos('.', [0, coords[0], coords[1]]) + if ! empty(visualmode) + " Store original marks + let m_a = getpos("'a") + let m_b = getpos("'b") + + " Store start/end positions + call setpos("'a", [0, orig_pos[0], orig_pos[1]]) + call setpos("'b", [0, coords[0], coords[1]]) + + " Update selection + silent exec 'normal! `a' . visualmode . '`b' + + " Restore original marks + call setpos("'a", m_a) + call setpos("'b", m_b) + else + " Update cursor position + call setpos('.', [0, coords[0], coords[1]]) + endif call Message('Jumping to [' . coords[0] . ', ' . coords[1] . ']') endif