fix(editor): respect [+cmd] when executing :drop #33339

Problem:
Normally, `:drop +41 foo.txt` will open foo.txt with the cursor on line
41. But if foo.txt is already open, it instead is a no-op, even if the
cursor is on a different line.

Steps to reproduce:

    nvim --clean foo.txt
    :drop +30 foo.txt

Solution:
Handle +cmd in ex_drop().

(cherry picked from commit 3647b821ea)
This commit is contained in:
jyn
2025-04-08 08:54:32 -04:00
committed by github-actions[bot]
parent c4a19bff4e
commit 837faf7065
3 changed files with 56 additions and 14 deletions

View File

@ -2064,6 +2064,29 @@ theend:
return retval;
}
/// set v:swapcommand for the SwapExists autocommands.
///
/// @param command [+cmd] to be executed (e.g. +10).
/// @param newlnum if > 0: put cursor on this line number (if possible)
//
/// @return 1 if swapcommand was actually set, 0 otherwise
bool set_swapcommand(char *command, linenr_T newlnum)
{
if ((command == NULL && newlnum <= 0) || *get_vim_var_str(VV_SWAPCOMMAND) != NUL) {
return false;
}
const size_t len = (command != NULL) ? strlen(command) + 3 : 30;
char *const p = xmalloc(len);
if (command != NULL) {
vim_snprintf(p, len, ":%s\r", command);
} else {
vim_snprintf(p, len, "%" PRId64 "G", (int64_t)newlnum);
}
set_vim_var_string(VV_SWAPCOMMAND, p, -1);
xfree(p);
return true;
}
/// start editing a new file
///
/// @param fnum file number; if zero use ffname/sfname
@ -2197,20 +2220,7 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum
oldwin = NULL;
}
if ((command != NULL || newlnum > 0)
&& *get_vim_var_str(VV_SWAPCOMMAND) == NUL) {
// Set v:swapcommand for the SwapExists autocommands.
const size_t len = (command != NULL) ? strlen(command) + 3 : 30;
char *const p = xmalloc(len);
if (command != NULL) {
vim_snprintf(p, len, ":%s\r", command);
} else {
vim_snprintf(p, len, "%" PRId64 "G", (int64_t)newlnum);
}
set_vim_var_string(VV_SWAPCOMMAND, p, -1);
did_set_swapcommand = true;
xfree(p);
}
did_set_swapcommand = set_swapcommand(command, newlnum);
// If we are starting to edit another file, open a (new) buffer.
// Otherwise we re-use the current buffer.

View File

@ -888,6 +888,17 @@ void ex_drop(exarg_T *eap)
if (curbuf->b_ml.ml_flags & ML_EMPTY) {
ex_rewind(eap);
}
// execute [+cmd]
if (eap->do_ecmd_cmd) {
bool did_set_swapcommand = set_swapcommand(eap->do_ecmd_cmd, 0);
do_cmdline(eap->do_ecmd_cmd, NULL, NULL, DOCMD_VERBOSE);
if (did_set_swapcommand) {
set_vim_var_string(VV_SWAPCOMMAND, NULL, -1);
}
}
// no need to execute [++opts] - they only apply for newly loaded buffers.
return;
}
}

View File

@ -75,4 +75,25 @@ describe(':drop', function()
:drop Xdrop_modified.txt |
]])
end)
it('jumps to line number when passed +line', function()
exec([[
edit Xdrop_line.txt
call append(0, "I just miss doing art. Don't you?")
call append(1, "It is not so hard as we have supposed.")
call append(2, "We are propelled by disaster. We are moving swiftly.")
]])
feed_command('drop +2 Xdrop_line.txt')
screen:expect([[
I just miss doing art. Don't you? |
^It is not so hard as we have suppos|
ed. |
We are propelled by disaster. We ar|
e moving swiftly. |
|
{0:~ }|*2
{1:Xdrop_line.txt [+] }|
:drop +2 Xdrop_line.txt |
]])
end)
end)