mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
mksession: restore same :term buf in split windows
Problem: When session-restore creates a terminal buffer with command like `:edit term://.//16450:/bin/bash`, the buffer gets a different name (depends on PID). Thus the later call to `bufexists('term://.//16450:/bin/bash)` will return false. Solution: Force the buffer name with :file. This as least ensures the same buffer will show in multiple windows correctly, as expected when saving the session. But it still has problems: 1. the PID in the buffer name is bogus 2. redundant :terminal buffers still hang around fix #5250
This commit is contained in:
parent
88f133c30d
commit
cf67f19ac2
@ -9346,6 +9346,10 @@ makeopens(
|
||||
/*
|
||||
* Restore the view of the window (options, file, cursor, etc.).
|
||||
*/
|
||||
if (put_line(fd, "let s:buffer_names = []") == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
for (wp = tab_firstwin; wp != NULL; wp = wp->w_next) {
|
||||
if (!ses_do_win(wp))
|
||||
continue;
|
||||
@ -9357,6 +9361,16 @@ makeopens(
|
||||
next_arg_idx = wp->w_arg_idx;
|
||||
}
|
||||
|
||||
if (put_line(fd, "for [s:name, s:tbuf] in s:buffer_names") == FAIL
|
||||
|| put_line(fd, " if buflisted(s:tbuf)") == FAIL
|
||||
|| put_line(fd, " execute 'buffer' fnameescape(s:tbuf)") == FAIL
|
||||
|| put_line(fd, " execute 'file' fnameescape(s:name)") == FAIL
|
||||
|| put_line(fd, " endif") == FAIL
|
||||
|| put_line(fd, "endfor") == FAIL
|
||||
|| put_line(fd, "unlet! s:buffer_names s:tbuf s:name") == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
/* The argument index in the first tab page is zero, need to set it in
|
||||
* each window. For further tab pages it's the window where we do
|
||||
* "tabedit". */
|
||||
@ -9662,6 +9676,19 @@ put_view(
|
||||
|| put_eol(fd) == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
if (fputs("call add(s:buffer_names, [bufname('%'),'", fd) < 0
|
||||
|| ses_fname(fd, wp->w_buffer, flagp, false) == FAIL
|
||||
|| fputs("'])", fd) < 0
|
||||
|| put_eol(fd) == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
if (fputs("file ", fd) < 0
|
||||
|| ses_fname(fd, wp->w_buffer, flagp, false) == FAIL
|
||||
|| put_eol(fd) == FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
} else {
|
||||
// No file in this buffer, just make it empty.
|
||||
if (put_line(fd, "enew") == FAIL) {
|
||||
|
@ -91,4 +91,23 @@ describe(':mksession', function()
|
||||
matches('^term://'..pesc(expected_cwd)..'//%d+:', funcs.expand('%'))
|
||||
command('qall!')
|
||||
end)
|
||||
|
||||
it('restores multiple windows with same terminal instances', function()
|
||||
-- Create a view with two buffers referencing the same terminal instance
|
||||
command('terminal')
|
||||
command('split')
|
||||
command('mksession ' .. session_file)
|
||||
|
||||
clear()
|
||||
|
||||
command('source ' .. session_file)
|
||||
-- Getting the name of the buffer shown to compare with the other window
|
||||
local eval = helpers.eval
|
||||
|
||||
command('exe 1 . "wincmd w"')
|
||||
local expected_pid = eval('b:terminal_job_pid')
|
||||
|
||||
command('exe 2 . "wincmd w"')
|
||||
eq(expected_pid, eval('b:terminal_job_pid'))
|
||||
end)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user