aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris LaRose <cjlarose@gmail.com>2020-01-26 00:24:42 -0800
committerJustin M. Keyes <justinkz@gmail.com>2020-01-26 00:24:42 -0800
commitc6ff23d7a0d5ccf0d8995e3204c18df55d28fc7f (patch)
tree0614f7241a3fccd0c708d541bdc9e5ab4e15afca
parent451af7f08779ba39d3ebef4b2295ba702cc4f3d7 (diff)
downloadrneovim-c6ff23d7a0d5ccf0d8995e3204c18df55d28fc7f.tar.gz
rneovim-c6ff23d7a0d5ccf0d8995e3204c18df55d28fc7f.tar.bz2
rneovim-c6ff23d7a0d5ccf0d8995e3204c18df55d28fc7f.zip
terminal: absolute CWD in term:// URI #11289
This makes it possible to restore the working directory of :terminal buffers when reading those buffers from a session file. Fixes #11288 Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
-rw-r--r--runtime/lua/vim/shared.lua2
-rwxr-xr-xscripts/vim-patch.sh6
-rw-r--r--src/nvim/eval.c12
-rw-r--r--src/nvim/main.c4
-rw-r--r--test/functional/ex_cmds/mksession_spec.lua23
-rw-r--r--test/functional/terminal/edit_spec.lua6
6 files changed, 42 insertions, 11 deletions
diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua
index a71e9878bb..ea1117a906 100644
--- a/runtime/lua/vim/shared.lua
+++ b/runtime/lua/vim/shared.lua
@@ -321,7 +321,7 @@ function vim.trim(s)
return s:match('^%s*(.*%S)') or ''
end
---- Escapes magic chars in a Lua pattern string.
+--- Escapes magic chars in a Lua pattern.
---
--@see https://github.com/rxi/lume
--@param s String to escape
diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh
index ff78cb82f7..f9726e8a87 100755
--- a/scripts/vim-patch.sh
+++ b/scripts/vim-patch.sh
@@ -234,7 +234,8 @@ get_vimpatch() {
msg_ok "Saved patch to '${NVIM_SOURCE_DIR}/${patch_file}'."
}
-# shellcheck disable=SC2015 # "Note that A && B || C is not if-then-else."
+# shellcheck disable=SC2015
+# ^ "Note that A && B || C is not if-then-else."
stage_patch() {
get_vimpatch "$1"
local try_apply="${2:-}"
@@ -305,7 +306,8 @@ git_hub_pr() {
git hub pull new -m "$1"
}
-# shellcheck disable=SC2015 # "Note that A && B || C is not if-then-else."
+# shellcheck disable=SC2015
+# ^ "Note that A && B || C is not if-then-else."
submit_pr() {
require_executable git
local push_first
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 9379d94fa3..ce1d55afab 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -18383,13 +18383,17 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
int pid = chan->stream.pty.process.pid;
- char buf[1024];
- // format the title with the pid to conform with the term:// URI
- snprintf(buf, sizeof(buf), "term://%s//%d:%s", cwd, pid, cmd);
+ // "./…" => "/home/foo/…"
+ vim_FullName(cwd, (char *)NameBuff, sizeof(NameBuff), false);
+ // "/home/foo/…" => "~/…"
+ home_replace(NULL, NameBuff, IObuff, sizeof(IObuff), true);
+ // Terminal URI: "term://$CWD//$PID:$CMD"
+ snprintf((char *)NameBuff, sizeof(NameBuff), "term://%s//%d:%s",
+ (char *)IObuff, pid, cmd);
// at this point the buffer has no terminal instance associated yet, so unset
// the 'swapfile' option to ensure no swap file will be created
curbuf->b_p_swf = false;
- (void)setfname(curbuf, (char_u *)buf, NULL, true);
+ (void)setfname(curbuf, NameBuff, NULL, true);
// Save the job id and pid in b:terminal_job_{id,pid}
Error err = ERROR_INIT;
// deprecated: use 'channel' buffer option
diff --git a/src/nvim/main.c b/src/nvim/main.c
index be279b449a..a816221a9e 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -339,8 +339,8 @@ int main(int argc, char **argv)
"matchstr(expand(\"<amatch>\"), "
"'\\c\\m" PROTO "\\%(.\\{-}//\\%(\\d\\+:\\)\\?\\)\\?\\zs.*'), "
// capture the working directory
- "{'cwd': get(matchlist(expand(\"<amatch>\"), "
- "'\\c\\m" PROTO "\\(.\\{-}\\)//'), 1, '')})"
+ "{'cwd': expand(get(matchlist(expand(\"<amatch>\"), "
+ "'\\c\\m" PROTO "\\(.\\{-}\\)//'), 1, ''))})"
"|endif");
do_cmdline_cmd("augroup END");
#undef PROTO
diff --git a/test/functional/ex_cmds/mksession_spec.lua b/test/functional/ex_cmds/mksession_spec.lua
index 0f7860740e..855f8105aa 100644
--- a/test/functional/ex_cmds/mksession_spec.lua
+++ b/test/functional/ex_cmds/mksession_spec.lua
@@ -6,6 +6,8 @@ local command = helpers.command
local get_pathsep = helpers.get_pathsep
local eq = helpers.eq
local funcs = helpers.funcs
+local matches = helpers.matches
+local pesc = helpers.pesc
local rmdir = helpers.rmdir
local file_prefix = 'Xtest-functional-ex_cmds-mksession_spec'
@@ -48,7 +50,7 @@ describe(':mksession', function()
eq(cwd_dir .. get_pathsep() .. tab_dir, funcs.getcwd())
end)
- it('restores buffers when using tab-local working directories', function()
+ it('restores buffers with tab-local CWD', function()
local tmpfile_base = file_prefix .. '-tmpfile'
local cwd_dir = funcs.getcwd()
local session_path = cwd_dir .. get_pathsep() .. session_file
@@ -70,4 +72,23 @@ describe(':mksession', function()
command('tabnext 2')
eq(cwd_dir .. get_pathsep() .. tmpfile_base .. '2', funcs.expand('%:p'))
end)
+
+ it('restores CWD for :terminal buffers #11288', function()
+ local cwd_dir = funcs.fnamemodify('.', ':p:~'):gsub([[[\/]*$]], '')
+ local session_path = cwd_dir..get_pathsep()..session_file
+
+ command('cd '..tab_dir)
+ command('terminal echo $PWD')
+ command('cd '..cwd_dir)
+ command('mksession '..session_path)
+ command('qall!')
+
+ -- Create a new test instance of Nvim.
+ clear()
+ command('silent source '..session_path)
+
+ local expected_cwd = cwd_dir..get_pathsep()..tab_dir
+ matches('^term://'..pesc(expected_cwd)..'//%d+:', funcs.expand('%'))
+ command('qall!')
+ end)
end)
diff --git a/test/functional/terminal/edit_spec.lua b/test/functional/terminal/edit_spec.lua
index d213bae7b3..fabc5524ed 100644
--- a/test/functional/terminal/edit_spec.lua
+++ b/test/functional/terminal/edit_spec.lua
@@ -5,9 +5,12 @@ local curbufmeths = helpers.curbufmeths
local curwinmeths = helpers.curwinmeths
local nvim_dir = helpers.nvim_dir
local command = helpers.command
+local funcs = helpers.funcs
local meths = helpers.meths
local clear = helpers.clear
local eq = helpers.eq
+local matches = helpers.matches
+local pesc = helpers.pesc
describe(':edit term://*', function()
local get_screen = function(columns, lines)
@@ -28,7 +31,8 @@ describe(':edit term://*', function()
command('edit term://')
local termopen_runs = meths.get_var('termopen_runs')
eq(1, #termopen_runs)
- eq(termopen_runs[1], termopen_runs[1]:match('^term://.//%d+:$'))
+ local cwd = funcs.fnamemodify('.', ':p:~'):gsub([[[\/]*$]], '')
+ matches('^term://'..pesc(cwd)..'//%d+:$', termopen_runs[1])
end)
it("runs TermOpen early enough to set buffer-local 'scrollback'", function()