patch 8.2.3780: ":cd" works differently on MS-Windows
Problem: ":cd" works differently on MS-Windows.
Solution: Add the 'cdhome' option. (closes #9324)
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 4d739f9..640260a 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7402,9 +7402,13 @@
else
prev_dir = pdir;
+ // For UNIX ":cd" means: go to home directory.
+ // On other systems too if 'cdhome' is set.
#if defined(UNIX) || defined(VMS)
- // for UNIX ":cd" means: go to home directory
if (*new_dir == NUL)
+#else
+ if (*new_dir == NUL && p_cdh)
+#endif
{
// use NameBuff for home directory name
# ifdef VMS
@@ -7420,7 +7424,6 @@
# endif
new_dir = NameBuff;
}
-#endif
dir_differs = new_dir == NULL || pdir == NULL
|| pathcmp((char *)pdir, (char *)new_dir, -1) != 0;
if (new_dir == NULL || (dir_differs && vim_chdir(new_dir)))
@@ -7459,8 +7462,8 @@
new_dir = eap->arg;
#if !defined(UNIX) && !defined(VMS)
- // for non-UNIX ":cd" means: print current directory
- if (*new_dir == NUL)
+ // for non-UNIX ":cd" means: print current directory unless 'cdhome' is set
+ if (*new_dir == NUL && !p_cdh)
ex_pwd(NULL);
else
#endif
diff --git a/src/option.h b/src/option.h
index fc81245..49d869b 100644
--- a/src/option.h
+++ b/src/option.h
@@ -1094,6 +1094,7 @@
EXTERN int p_wa; // 'writeany'
EXTERN int p_wb; // 'writebackup'
EXTERN long p_wd; // 'writedelay'
+EXTERN int p_cdh; // 'cdhome'
/*
* "indir" values for buffer-local options.
diff --git a/src/optiondefs.h b/src/optiondefs.h
index 6a96a9f..c392442 100644
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -549,6 +549,10 @@
(char_u *)&p_cmp, PV_NONE,
{(char_u *)"internal,keepascii", (char_u *)0L}
SCTX_INIT},
+ {"cdhome", "cdh", P_BOOL|P_VI_DEF|P_VIM|P_SECURE,
+ (char_u *)&p_cdh, PV_NONE,
+ {(char_u *)FALSE, (char_u *)0L}
+ SCTX_INIT},
{"cdpath", "cd", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE|P_COMMA|P_NODUP,
#ifdef FEAT_SEARCHPATH
(char_u *)&p_cdpath, PV_NONE,
diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim
index 28e23c0..912bc20 100644
--- a/src/testdir/runtest.vim
+++ b/src/testdir/runtest.vim
@@ -77,6 +77,9 @@
let s:start_time = reltime()
endif
+" Always use forward slashes.
+set shellslash
+
" Common with all tests on all systems.
source setup.vim
@@ -128,9 +131,6 @@
source $VIMRUNTIME/menu.vim
endif
-" Always use forward slashes.
-set shellslash
-
let s:srcdir = expand('%:p:h:h')
if has('win32')
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index 6fc4564..2265894 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -1199,4 +1199,25 @@
bw
endfunc
+" Test for the 'cdhome' option
+func Test_opt_cdhome()
+ if has('unix') || has('vms')
+ throw 'Skipped: only works on non-Unix'
+ endif
+
+ set cdhome&
+ call assert_equal(0, &cdhome)
+ set cdhome
+
+ " This paragraph is copied from Test_cd_no_arg().
+ let path = getcwd()
+ cd
+ call assert_equal($HOME, getcwd())
+ call assert_notequal(path, getcwd())
+ exe 'cd ' .. fnameescape(path)
+ call assert_equal(path, getcwd())
+
+ set cdhome&
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 25669af..680cce2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3780,
+/**/
3779,
/**/
3778,