diff options
Diffstat (limited to 'src/nvim/diff.c')
| -rw-r--r-- | src/nvim/diff.c | 67 | 
1 files changed, 31 insertions, 36 deletions
| diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 7da6665cb7..17de4284ce 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -1033,10 +1033,7 @@ void ex_diffsplit(exarg_T *eap)          if (bufref_valid(&old_curbuf)) {            // Move the cursor position to that of the old window.            curwin->w_cursor.lnum = diff_get_corresponding_line( -              old_curbuf.br_buf, -              old_curwin->w_cursor.lnum, -              curbuf, -              curwin->w_cursor.lnum); +              old_curbuf.br_buf, old_curwin->w_cursor.lnum);          }        }        // Now that lines are folded scroll to show the cursor at the same @@ -2463,25 +2460,17 @@ int diff_move_to(int dir, long count)    return OK;  } -/// Finds the corresponding line in a diff. -/// -/// @param buf1 -/// @param lnum1 -/// @param buf2 -/// @param lnum3 -/// -/// @return The corresponding line. -linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2, -                                     linenr_T lnum3) +/// Return the line number in the current window that is closest to "lnum1" in +/// "buf1" in diff mode. +static linenr_T diff_get_corresponding_line_int(buf_T *buf1, linenr_T lnum1)  {    int idx1;    int idx2;    diff_T *dp;    int baseline = 0; -  linenr_T lnum2;    idx1 = diff_buf_idx(buf1); -  idx2 = diff_buf_idx(buf2); +  idx2 = diff_buf_idx(curbuf);    if ((idx1 == DB_COUNT)        || (idx2 == DB_COUNT) @@ -2501,15 +2490,9 @@ linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) {      if (dp->df_lnum[idx1] > lnum1) { -      lnum2 = lnum1 - baseline; - -      // don't end up past the end of the file -      if (lnum2 > buf2->b_ml.ml_line_count) { -        lnum2 = buf2->b_ml.ml_line_count; -      } - -      return lnum2; -    } else if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) { +      return lnum1 - baseline; +    } +    if ((dp->df_lnum[idx1] + dp->df_count[idx1]) > lnum1) {        // Inside the diffblock        baseline = lnum1 - dp->df_lnum[idx1]; @@ -2518,30 +2501,42 @@ linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1, buf_T *buf2,        }        return dp->df_lnum[idx2] + baseline; -    } else if ((dp->df_lnum[idx1] == lnum1) -               && (dp->df_count[idx1] == 0) -               && (dp->df_lnum[idx2] <= lnum3) -               && ((dp->df_lnum[idx2] + dp->df_count[idx2]) > lnum3)) { +    } +    if ((dp->df_lnum[idx1] == lnum1) +        && (dp->df_count[idx1] == 0) +        && (dp->df_lnum[idx2] <= curwin->w_cursor.lnum) +        && ((dp->df_lnum[idx2] + dp->df_count[idx2]) +            > curwin->w_cursor.lnum)) {        // Special case: if the cursor is just after a zero-count        // block (i.e. all filler) and the target cursor is already        // inside the corresponding block, leave the target cursor        // unmoved. This makes repeated CTRL-W W operations work        // as expected. -      return lnum3; +      return curwin->w_cursor.lnum;      }      baseline = (dp->df_lnum[idx1] + dp->df_count[idx1]) -               - (dp->df_lnum[idx2] + dp->df_count[idx2]); +                - (dp->df_lnum[idx2] + dp->df_count[idx2]);    }    // If we get here then the cursor is after the last diff -  lnum2 = lnum1 - baseline; +  return lnum1 - baseline; +} + +/// Finds the corresponding line in a diff. +/// +/// @param buf1 +/// @param lnum1 +/// +/// @return The corresponding line. +linenr_T diff_get_corresponding_line(buf_T *buf1, linenr_T lnum1) +{ +  linenr_T lnum = diff_get_corresponding_line_int(buf1, lnum1);    // don't end up past the end of the file -  if (lnum2 > buf2->b_ml.ml_line_count) { -    lnum2 = buf2->b_ml.ml_line_count; +  if (lnum > curbuf->b_ml.ml_line_count) { +    return curbuf->b_ml.ml_line_count;    } - -  return lnum2; +  return lnum;  }  /// For line "lnum" in the current window find the equivalent lnum in window | 
