Retool section jump maps

This commit is contained in:
Tim Pope 2019-08-02 23:40:13 -04:00
parent 9ac6a258d6
commit dffa56c4ea
2 changed files with 93 additions and 23 deletions

View File

@ -2236,7 +2236,18 @@ function! s:StageJump(offset, section, ...) abort
let line = search('^' . a:section, 'nw') let line = search('^' . a:section, 'nw')
if line if line
exe line exe line
return s:NextItem(a:offset ? a:offset : 1) if a:offset
for i in range(a:offset)
call search(s:file_pattern . '\|^$')
if empty(line('.'))
return ''
endif
endfor
call s:StageReveal()
else
call s:StageReveal()
+
endif
endif endif
return '' return ''
endfunction endfunction
@ -2627,15 +2638,21 @@ function! s:StageReveal(...) abort
while end < line('$') && getline(end + 1) !~# '^commit ' while end < line('$') && getline(end + 1) !~# '^commit '
let end += 1 let end += 1
endwhile endwhile
elseif getline(begin) =~# s:section_pattern
let end = begin
while len(getline(end + 1))
let end += 1
endwhile
endif endif
if exists('end') if exists('end')
while line('w$') < line('$') && end > line('w$') && line('.') > line('w0') + &scrolloff while line('.') > line('w0') + &scrolloff && end > line('w$')
execute "normal! \<C-E>" execute "normal! \<C-E>"
endwhile endwhile
endif endif
endfunction endfunction
let s:item_pattern = '^[A-Z?] .\|^diff --\|^\%(\l\{3,\} \)\=[0-9a-f]\{4,\} \|^@' let s:file_pattern = '^[A-Z?] .\|^diff --'
let s:item_pattern = s:file_pattern . '\|^\%(\l\{3,\} \)\=[0-9a-f]\{4,\} \|^@@'
function! s:NextItem(count) abort function! s:NextItem(count) abort
for i in range(a:count) for i in range(a:count)
@ -2657,27 +2674,72 @@ function! s:PreviousItem(count) abort
return '.' return '.'
endfunction endfunction
let s:section_pattern = '^[A-Z][a-z][^:]*$'
let s:section_commit_pattern = s:section_pattern . '\|^commit '
function! s:NextSection(count) abort function! s:NextSection(count) abort
let orig = line('.')
if getline('.') !~# '^commit '
-
endif
for i in range(a:count) for i in range(a:count)
if !search('^[A-Z][a-z][^:]*$','W') if !search(s:section_commit_pattern, 'W')
return '.' break
endif endif
+
endfor endfor
call s:StageReveal() if getline('.') =~# s:section_commit_pattern
return '.' call s:StageReveal()
return getline('.') =~# s:section_pattern ? '+' : ':'
else
return orig
endif
endfunction endfunction
function! s:PreviousSection(count) abort function! s:PreviousSection(count) abort
- let orig = line('.')
if getline('.') !~# '^commit '
-
endif
for i in range(a:count) for i in range(a:count)
if !search('^[A-Z][a-z][^:]*$\|\%^','bW') || line('.') == 1 if !search(s:section_commit_pattern . '\|\%^', 'bW')
return '.' break
endif endif
+
endfor endfor
call s:StageReveal() if getline('.') =~# s:section_commit_pattern || line('.') == 1
return '.' call s:StageReveal()
return getline('.') =~# s:section_pattern ? '+' : ':'
else
return orig
endif
endfunction
function! s:NextSectionEnd(count) abort
+
if empty(getline('.'))
+
endif
for i in range(a:count)
if !search(s:section_commit_pattern, 'W')
return '$'
endif
endfor
return search('^.', 'Wb')
endfunction
function! s:PreviousSectionEnd(count) abort
let old = line('.')
for i in range(a:count)
if search(s:section_commit_pattern, 'Wb') <= 1
exe old
if i
break
else
return ''
endif
endif
let old = line('.')
endfor
return search('^.', 'Wb')
endfunction endfunction
function! s:StageInline(mode, ...) abort function! s:StageInline(mode, ...) abort
@ -2756,7 +2818,7 @@ endfunction
function! s:NextExpandedHunk(count) abort function! s:NextExpandedHunk(count) abort
for i in range(a:count) for i in range(a:count)
call s:StageInline('show', line('.'), 1) call s:StageInline('show', line('.'), 1)
call search('^[A-Z?] .\|^diff --\|^@','W') call search(s:file_pattern . '\|^@','W')
endfor endfor
return '.' return '.'
endfunction endfunction
@ -4959,6 +5021,8 @@ function! fugitive#MapJumps(...) abort
call s:MapEx('J', 'exe <SID>NextItem(v:count1)') call s:MapEx('J', 'exe <SID>NextItem(v:count1)')
call s:MapEx('[[', 'exe <SID>PreviousSection(v:count1)') call s:MapEx('[[', 'exe <SID>PreviousSection(v:count1)')
call s:MapEx(']]', 'exe <SID>NextSection(v:count1)') call s:MapEx(']]', 'exe <SID>NextSection(v:count1)')
call s:MapEx('[]', 'exe <SID>PreviousSectionEnd(v:count1)')
call s:MapEx('][', 'exe <SID>NextSectionEnd(v:count1)')
endif endif
exe "nnoremap <buffer> <silent>" s:nowait "- :<C-U>exe 'Gedit ' . <SID>fnameescape(<SID>NavigateUp(v:count1))<Bar> if getline(1) =~# '^tree \x\{40,\}$' && empty(getline(2))<Bar>call search('^'.escape(expand('#:t'),'.*[]~\').'/\=$','wc')<Bar>endif<CR>" exe "nnoremap <buffer> <silent>" s:nowait "- :<C-U>exe 'Gedit ' . <SID>fnameescape(<SID>NavigateUp(v:count1))<Bar> if getline(1) =~# '^tree \x\{40,\}$' && empty(getline(2))<Bar>call search('^'.escape(expand('#:t'),'.*[]~\').'/\=$','wc')<Bar>endif<CR>"
nnoremap <buffer> <silent> P :<C-U>exe 'Gedit ' . <SID>fnameescape(<SID>ContainingCommit().'^'.v:count1.<SID>Relative(':'))<CR> nnoremap <buffer> <silent> P :<C-U>exe 'Gedit ' . <SID>fnameescape(<SID>ContainingCommit().'^'.v:count1.<SID>Relative(':'))<CR>

View File

@ -343,28 +343,34 @@ i Jump to the next file or hunk, expanding inline diffs
automatically. automatically.
*fugitive_[[* *fugitive_[[*
[[ Jump to the previous section. [[ Jump [count] sections backward.
*fugitive_]]* *fugitive_]]*
]] Jump to the next section. ]] Jump [count] sections forward.
*fugitive_[]*
[] Jump [count] section ends backward.
*fugitive_][*
][ Jump [count] section ends forward.
*fugitive_gu* *fugitive_gu*
gu Jump to "Unstaged" section. gu Jump to file [count] in the "Unstaged" section.
*fugitive_gU* *fugitive_gU*
gU Jump to "Untracked" section. gU Jump to file [count] in the "Untracked" section.
*fugitive_gs* *fugitive_gs*
gs Jump to "Staged" section. gs Jump to file [count] in the "Staged" section.
*fugitive_gp* *fugitive_gp*
gp Jump to "Unpushed" section. gp Jump to file [count] in the "Unpushed" section.
*fugitive_gP* *fugitive_gP*
gP Jump to "Unpulled" section. gP Jump to file [count] in the "Unpulled" section.
*fugitive_gr* *fugitive_gr*
gr Jump to "Rebasing" section. gr Jump to file [count] in the "Rebasing" section.
*fugitive_gi* *fugitive_gi*
gi Open .git/info/exclude in a split. Use a count to gi Open .git/info/exclude in a split. Use a count to