mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
aucmd_prepbuf: also restore prevwin
#9741
bisected to f5d5da3917
Other test steps:
nvim -u NORC
:terminal tree / " Produces lots of output
:edit somefile.txt
:vsplit
:vsplit
<c-w>l
<c-w>l
<c-w>h
<c-w>p
This commit is contained in:
parent
32998731bf
commit
7c38994ff2
@ -987,18 +987,16 @@ typedef struct {
|
||||
.relative = 0, .external = false, \
|
||||
.focusable = true })
|
||||
|
||||
/*
|
||||
* Structure which contains all information that belongs to a window
|
||||
*
|
||||
* All row numbers are relative to the start of the window, except w_winrow.
|
||||
*/
|
||||
/// Structure which contains all information that belongs to a window.
|
||||
///
|
||||
/// All row numbers are relative to the start of the window, except w_winrow.
|
||||
struct window_S {
|
||||
handle_T handle; ///< unique identifier for the window
|
||||
|
||||
buf_T *w_buffer; ///< buffer we are a window into (used
|
||||
///< often, keep it the first item!)
|
||||
|
||||
synblock_T *w_s; /* for :ownsyntax */
|
||||
synblock_T *w_s; ///< for :ownsyntax
|
||||
|
||||
int w_hl_id_normal; ///< 'winhighlight' normal id
|
||||
int w_hl_attr_normal; ///< 'winhighlight' normal final attrs
|
||||
@ -1008,18 +1006,18 @@ struct window_S {
|
||||
|
||||
int w_hl_needs_update; ///< attrs need to be recalculated
|
||||
|
||||
win_T *w_prev; /* link to previous window */
|
||||
win_T *w_next; /* link to next window */
|
||||
bool w_closing; /* window is being closed, don't let
|
||||
autocommands close it too. */
|
||||
win_T *w_prev; ///< link to previous window
|
||||
win_T *w_next; ///< link to next window
|
||||
bool w_closing; ///< window is being closed, don't let
|
||||
/// autocommands close it too.
|
||||
|
||||
frame_T *w_frame; /* frame containing this window */
|
||||
frame_T *w_frame; ///< frame containing this window
|
||||
|
||||
pos_T w_cursor; /* cursor position in buffer */
|
||||
pos_T w_cursor; ///< cursor position in buffer
|
||||
|
||||
colnr_T w_curswant; /* The column we'd like to be at. This is
|
||||
used to try to stay in the same column
|
||||
for up/down cursor motions. */
|
||||
colnr_T w_curswant; ///< Column we want to be at. This is
|
||||
/// used to try to stay in the same column
|
||||
/// for up/down cursor motions.
|
||||
|
||||
int w_set_curswant; // If set, then update w_curswant the next
|
||||
// time through cursupdate() to the
|
||||
|
@ -6527,6 +6527,7 @@ aucmd_prepbuf (
|
||||
win = curwin;
|
||||
|
||||
aco->save_curwin = curwin;
|
||||
aco->save_prevwin = prevwin;
|
||||
aco->save_curbuf = curbuf;
|
||||
if (win != NULL) {
|
||||
/* There is a window for "buf" in the current tab page, make it the
|
||||
@ -6624,6 +6625,8 @@ win_found:
|
||||
// Hmm, original window disappeared. Just use the first one.
|
||||
curwin = firstwin;
|
||||
}
|
||||
prevwin = win_valid(aco->save_prevwin) ? aco->save_prevwin
|
||||
: firstwin; // window disappeared?
|
||||
vars_clear(&aucmd_win->w_vars->dv_hashtab); // free all w: variables
|
||||
hash_init(&aucmd_win->w_vars->dv_hashtab); // re-use the hashtab
|
||||
curbuf = curwin->w_buffer;
|
||||
@ -6656,6 +6659,8 @@ win_found:
|
||||
}
|
||||
|
||||
curwin = aco->save_curwin;
|
||||
prevwin = win_valid(aco->save_prevwin) ? aco->save_prevwin
|
||||
: firstwin; // window disappeared?
|
||||
curbuf = curwin->w_buffer;
|
||||
// In case the autocommand moves the cursor to a position that does not
|
||||
// exist in curbuf
|
||||
|
@ -23,6 +23,7 @@ typedef struct {
|
||||
buf_T *save_curbuf; ///< saved curbuf
|
||||
int use_aucmd_win; ///< using aucmd_win
|
||||
win_T *save_curwin; ///< saved curwin
|
||||
win_T *save_prevwin; ///< saved prevwin
|
||||
win_T *new_curwin; ///< new curwin
|
||||
bufref_T new_curbuf; ///< new curbuf
|
||||
char_u *globaldir; ///< saved value of globaldir
|
||||
|
@ -24,8 +24,8 @@ describe('api/buf', function()
|
||||
end
|
||||
|
||||
|
||||
describe('line_count, insert and del_line', function()
|
||||
it('works', function()
|
||||
describe('nvim_buf_set_lines, nvim_buf_line_count', function()
|
||||
it('deprecated forms', function()
|
||||
eq(1, curbuf_depr('line_count'))
|
||||
curbuf_depr('insert', -1, {'line'})
|
||||
eq(2, curbuf_depr('line_count'))
|
||||
@ -70,7 +70,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set,del}_line', function()
|
||||
describe('deprecated: {get,set,del}_line', function()
|
||||
it('works', function()
|
||||
eq('', curbuf_depr('get_line', 0))
|
||||
curbuf_depr('set_line', 0, 'line1')
|
||||
@ -102,7 +102,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set}_line_slice', function()
|
||||
describe('deprecated: {get,set}_line_slice', function()
|
||||
it('get_line_slice: out-of-bounds returns empty array', function()
|
||||
curbuf_depr('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'})
|
||||
eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity
|
||||
@ -149,7 +149,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set}_lines', function()
|
||||
describe('nvim_buf_get_lines, nvim_buf_set_lines', function()
|
||||
local get_lines, set_lines = curbufmeths.get_lines, curbufmeths.set_lines
|
||||
local line_count = curbufmeths.line_count
|
||||
|
||||
@ -272,7 +272,7 @@ describe('api/buf', function()
|
||||
eq({}, get_lines(-3, -4, true))
|
||||
end)
|
||||
|
||||
it('set_line_slice: out-of-bounds can extend past end', function()
|
||||
it('set_lines: out-of-bounds can extend past end', function()
|
||||
set_lines(0, -1, true, {'a', 'b', 'c'})
|
||||
eq({'a', 'b', 'c'}, get_lines(0, -1, true)) --sanity
|
||||
|
||||
@ -286,7 +286,7 @@ describe('api/buf', function()
|
||||
eq({'e', 'a', 'b', 'c', 'd'}, get_lines(0, -1, true))
|
||||
end)
|
||||
|
||||
it("set_line on alternate buffer does not access invalid line (E315)", function()
|
||||
it("set_lines on alternate buffer does not access invalid line (E315)", function()
|
||||
feed_command('set hidden')
|
||||
insert('Initial file')
|
||||
command('enew')
|
||||
@ -334,9 +334,27 @@ describe('api/buf', function()
|
||||
{2:-- INSERT --} |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('set_lines on hidden buffer preserves "previous window" #9741', function()
|
||||
insert([[
|
||||
visible buffer line 1
|
||||
line 2
|
||||
]])
|
||||
local hiddenbuf = meths.create_buf(false,true)
|
||||
command('vsplit')
|
||||
command('vsplit')
|
||||
feed('<c-w>l<c-w>l<c-w>l')
|
||||
eq(3, funcs.winnr())
|
||||
feed('<c-w>h')
|
||||
eq(2, funcs.winnr())
|
||||
meths.buf_set_lines(hiddenbuf, 0, -1, true,
|
||||
{'hidden buffer line 1', 'line 2'})
|
||||
feed('<c-w>p')
|
||||
eq(3, funcs.winnr())
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('get_offset', function()
|
||||
describe('nvim_buf_get_offset', function()
|
||||
local get_offset = curbufmeths.get_offset
|
||||
it('works', function()
|
||||
curbufmeths.set_lines(0,-1,true,{'Some\r','exa\000mple', '', 'buf\rfer', 'text'})
|
||||
@ -373,7 +391,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set,del}_var', function()
|
||||
describe('nvim_buf_get_var, nvim_buf_set_var, nvim_buf_del_var', function()
|
||||
it('works', function()
|
||||
curbuf('set_var', 'lua', {1, 2, {['3'] = 1}})
|
||||
eq({1, 2, {['3'] = 1}}, curbuf('get_var', 'lua'))
|
||||
@ -393,7 +411,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('get_changedtick', function()
|
||||
describe('nvim_buf_get_changedtick', function()
|
||||
it('works', function()
|
||||
eq(2, curbufmeths.get_changedtick())
|
||||
curbufmeths.set_lines(0, 1, false, {'abc\0', '\0def', 'ghi'})
|
||||
@ -417,7 +435,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set}_option', function()
|
||||
describe('nvim_buf_get_option, nvim_buf_set_option', function()
|
||||
it('works', function()
|
||||
eq(8, curbuf('get_option', 'shiftwidth'))
|
||||
curbuf('set_option', 'shiftwidth', 4)
|
||||
@ -430,7 +448,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('{get,set}_name', function()
|
||||
describe('nvim_buf_get_name, nvim_buf_set_name', function()
|
||||
it('works', function()
|
||||
nvim('command', 'new')
|
||||
eq('', curbuf('get_name'))
|
||||
@ -438,14 +456,12 @@ describe('api/buf', function()
|
||||
curbuf('set_name', new_name)
|
||||
eq(new_name, curbuf('get_name'))
|
||||
nvim('command', 'w!')
|
||||
local f = io.open(new_name)
|
||||
ok(f ~= nil)
|
||||
f:close()
|
||||
eq(1, funcs.filereadable(new_name))
|
||||
os.remove(new_name)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('is_loaded', function()
|
||||
describe('nvim_buf_is_loaded', function()
|
||||
it('works', function()
|
||||
-- record our buffer number for when we unload it
|
||||
local bufnr = curbuf('get_number')
|
||||
@ -470,7 +486,7 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('is_valid', function()
|
||||
describe('nvim_buf_is_valid', function()
|
||||
it('works', function()
|
||||
nvim('command', 'new')
|
||||
local b = nvim('get_current_buf')
|
||||
@ -480,12 +496,12 @@ describe('api/buf', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('get_mark', function()
|
||||
describe('nvim_buf_get_mark', function()
|
||||
it('works', function()
|
||||
curbuf('set_lines', -1, -1, true, {'a', 'bit of', 'text'})
|
||||
curwin('set_cursor', {3, 4})
|
||||
nvim('command', 'mark V')
|
||||
eq({3, 0}, curbuf('get_mark', 'V'))
|
||||
nvim('command', 'mark v')
|
||||
eq({3, 0}, curbuf('get_mark', 'v'))
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user