mirror of
https://github.com/tpope/vim-fugitive.git
synced 2025-11-18 16:45:39 -05:00
Handle range-diff commit header lines in s:cfile()
While `range-diff` output doesn't display with any syntax highlighting,
it's still in a buffer with a filetype of 'git' and thus fugitive
attaches the standard jump mappings. However, those mappings work
inconsistently for `range-diff` output due to some accidental matching
in `s:cfile()`. For lines like these:
1: aaaaaaa = 1: bbbbbbb My subject
2: aaaaaaa = -: ------- My other subject
Depending on the position of the cursor, we sometimes hit the `<cword>`
fallback and open the commit. This can happen when the cursor is over a
commit hash, or even on one of the `:`. However, for a line like this:
-: ------- > 2: aaaaaaa My subject
We end up hitting the block intended to catch +/- lines in diff output,
and fail to identify a commit.
Add a special set of handling for range-diff header lines. In cases
where only one commit is present in the line, open that commit
automatically regardless of cursor position. For cases where the line
represents a different commit on each side, fall back to a `<cword>`
approach to allow opening either commit based on cursor position.
This commit is contained in:
@@ -8135,6 +8135,9 @@ function! s:BranchCfile(result) abort
|
||||
endfunction
|
||||
|
||||
let s:diff_header_pattern = '^diff --git \%("\=[abciow12]/.*\|/dev/null\) \%("\=[abciow12]/.*\|/dev/null\)$'
|
||||
let s:rdiff_hash_or_missing = '\(\x\{7,40\}\|-\{7,40\}\)'
|
||||
let s:rdiff_side = '\%(-\|\d\+\):\s\+' . s:rdiff_hash_or_missing
|
||||
let s:rdiff_header_pattern = '^' . s:rdiff_side . '\s\+[=!<>]\s\+' . s:rdiff_side . '\s\+'
|
||||
function! s:cfile() abort
|
||||
let temp_state = s:TempState()
|
||||
let name = substitute(get(get(temp_state, 'args', []), 0, ''), '\%(^\|-\)\(\l\)', '\u\1', 'g')
|
||||
@@ -8232,6 +8235,19 @@ function! s:cfile() abort
|
||||
let dcmds = ['', 'Gdiffsplit! >' . myhash . '^:' . fnameescape(files[0])]
|
||||
endif
|
||||
|
||||
elseif getline('.') =~# s:rdiff_header_pattern
|
||||
let ref = ''
|
||||
let matches = matchlist(getline('.'), s:rdiff_header_pattern)
|
||||
if matches[1] =~# '^-\+$' && matches[2] =~# '^\x\{7,40\}$'
|
||||
let ref = matches[2]
|
||||
elseif matches[2] =~# '^-\+$' && matches[1] =~# '^\x\{7,40\}$'
|
||||
let ref = matches[1]
|
||||
elseif matches[1] =~# '^\x\{7,40\}$' && matches[1] == matches[2]
|
||||
let ref = matches[1]
|
||||
elseif expand('<cword>') =~# '^\x\{7,40\}$'
|
||||
let ref = expand('<cword>')
|
||||
endif
|
||||
|
||||
elseif getline('.') =~# '^[+-]'
|
||||
let [header_lnum, old_lnum, new_lnum] = s:HunkPosition(line('.'))
|
||||
if new_lnum > 0
|
||||
|
||||
Reference in New Issue
Block a user