vim-patch:9.1.1473: inconsistent range arg for :diffget/diffput (#34588)

Problem:  inconsistent range arg for :diffget/diffput
Solution: fix the range specification, place the cursor for :diffput and
          :diffget consistently on the last line (Yee Cheng Chin)

Previously, `:<range>diffget` only allowed using 1 or above in the range
value, making it impossible to use the command for a diff block at the
beginning of the file. Fix the range specification so the user can now
use 0 to specify the space before the first line. This allows
`:0,$+1diffget` to work to retrieve all the changes from the other file
instead of missing the first diff block. Also do this for `:diffput`.

Also, make `:diffput` work more similar to `:diffget`. Make it so that
if the cursor is on the last line and a new line is inserted in the
other file, doing `:diffput` will select that diff block below the line,
just like `:diffget` would.

Also clean up the logic a little bit for edge cases and for handling
line matched diff blocks better.

closes: vim/vim#17579

d75ab0cbf5

Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
This commit is contained in:
zeertzjq
2025-06-22 08:00:17 +08:00
committed by GitHub
parent 0980617c0d
commit ee2fc31b36
5 changed files with 80 additions and 17 deletions

View File

@@ -3728,8 +3728,9 @@ char *invalid_range(exarg_T *eap)
if (eap->argt & EX_RANGE) {
switch (eap->addr_type) {
case ADDR_LINES:
if (eap->line2 > (curbuf->b_ml.ml_line_count
+ (eap->cmdidx == CMD_diffget))) {
if (eap->line2 >
(curbuf->b_ml.ml_line_count
+ (eap->cmdidx == CMD_diffget || eap->cmdidx == CMD_diffput))) {
return _(e_invrange);
}
break;