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,