Problem: ":cd" works differently on MS-Windows.
Solution: Add the 'cdhome' option. (closes #9324)
present in 'cpoptions' and "!" is not used in the command.
*:cd* *E747* *E472*
-:cd[!] On non-Unix systems: Print the current directory
- name. On Unix systems: Change the current directory
- to the home directory. Use |:pwd| to print the
- current directory on all systems.
- On Unix systems: clear any window-local directory.
+:cd[!] On non-Unix systems when 'cdhome' is off: Print the
+ current directory name.
+ Otherwise: Change the current directory to the home
+ directory. Clear any window-local directory.
+ Use |:pwd| to print the current directory on all
+ systems.
:cd[!] {path} Change the current directory to {path}.
If {path} is relative, it is searched for in the
'buflisted' 'bl' whether the buffer shows up in the buffer list
'buftype' 'bt' special type of buffer
'casemap' 'cmp' specifies how case of letters is changed
+'cdhome' 'cdh' change directory to the home directory by ":cd"
'cdpath' 'cd' list of directories searched with ":cd"
'cedit' key used to open the command-line window
'charconvert' 'ccv' expression for character encoding conversion
call <SID>AddOption("path", gettext("list of directory names used for file searching"))
call append("$", "\t" .. s:global_or_local)
call <SID>OptionG("pa", &pa)
+if exists("+cdhome")
+ call <SID>AddOption("cdhome", gettext("change directory to the home directory by :cd"))
+ call <SID>BinOptionG("cdh", &cdh)
+endif
call <SID>AddOption("cdpath", gettext("list of directory names used for :cd"))
call <SID>OptionG("cd", &cd)
if exists("+autochdir")
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
# 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)))
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
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.
(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,
let s:start_time = reltime()
endif
+" Always use forward slashes.
+set shellslash
+
" Common with all tests on all systems.
source setup.vim
source $VIMRUNTIME/menu.vim
endif
-" Always use forward slashes.
-set shellslash
-
let s:srcdir = expand('%:p:h:h')
if has('win32')
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 3780,
/**/
3779,
/**/