From 0b387893ef3c6d79670863fa5cf278044e564e84 Mon Sep 17 00:00:00 2001 From: Brian Lyles Date: Mon, 4 Nov 2024 17:35:06 -0600 Subject: [PATCH] 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 `` 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 `` approach to allow opening either commit based on cursor position. --- autoload/fugitive.vim | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim index 5e6910286..da397fa89 100644 --- a/autoload/fugitive.vim +++ b/autoload/fugitive.vim @@ -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('') =~# '^\x\{7,40\}$' + let ref = expand('') + endif + elseif getline('.') =~# '^[+-]' let [header_lnum, old_lnum, new_lnum] = s:HunkPosition(line('.')) if new_lnum > 0