diff --git a/plugin/unimpaired.vim b/plugin/unimpaired.vim index 02e41a2..cd82769 100644 --- a/plugin/unimpaired.vim +++ b/plugin/unimpaired.vim @@ -44,8 +44,9 @@ function! s:MapNextFamily(map,cmd) abort let map = 'unimpaired'.toupper(a:map) let cmd = '".(v:count ? v:count : "")."'.a:cmd let end = '"'.(a:cmd ==# 'l' || a:cmd ==# 'c' ? 'zv' : '') - execute 'nnoremap '.map.'Previous :exe "'.cmd.'previous'.end - execute 'nnoremap '.map.'Next :exe "'.cmd.'next'.end + let prevnext = printf('["normal \%sPrevious", "normal \%sNext"]', map, map) + execute 'nnoremap '.map.'Previous :exe prevnext("'.a:cmd.'", "previous", '.prevnext.')' + execute 'nnoremap '.map.'Next :exe prevnext("'.a:cmd.'", "next", '.prevnext.')' execute 'nnoremap '.map.'First :exe "'.cmd.'first'.end execute 'nnoremap '.map.'Last :exe "'.cmd.'last'.end call s:map('n', '['. a:map , map.'Previous') @@ -84,6 +85,36 @@ function! s:entries(path) abort return files endfunction +" Handle previous/next movements, storing the last used one. +function! s:prevnext(cmd, dir, prevnext) abort + let g:unimpaired_prevnext = a:prevnext + let cmd = (v:count ? v:count : '').a:cmd.a:dir + if a:cmd ==# 'l' || a:cmd ==# 'c' + let cmd .= '|normal zv' + endif + return cmd +endfunction +function! s:last_prevnext_cmd(dir) abort + let prevnext = get(g:, 'unimpaired_prevnext', []) + if empty(prevnext) + if &diff + let m = 'c' + elseif !empty(getloclist(0)) + let m = 'l' + elseif !empty(getqflist()) + let m = 'q' + else + let m = 'n' + endif + return 'normal '.(a:dir ==# 'previous' ? '[' : ']').m + endif + return (a:dir ==# 'previous' ? prevnext[0] : prevnext[1]) +endfunction +execute 'nnoremap unimpairedRepeatPrevious :exe last_prevnext_cmd("previous")' +execute 'nnoremap unimpairedRepeatNext :exe last_prevnext_cmd("next")' +call s:map('n', '[.', 'unimpairedRepeatPrevious') +call s:map('n', '].', 'unimpairedRepeatNext') + function! s:FileByOffset(num) abort let file = expand('%:p') if empty(file)