0
0
mirror of https://github.com/vim/vim.git synced 2025-08-26 20:03:41 -04:00

patch 8.2.3780: ":cd" works differently on MS-Windows

Problem:    ":cd" works differently on MS-Windows.
Solution:   Add the 'cdhome' option. (closes #9324)
This commit is contained in:
Bakudankun 2021-12-11 12:28:08 +00:00 committed by Bram Moolenaar
parent 205f29c3e9
commit 29f3a45915
9 changed files with 49 additions and 12 deletions

View File

@ -1298,11 +1298,12 @@ Changing directory fails when the current buffer is modified, the '.' flag is
present in 'cpoptions' and "!" is not used in the command. present in 'cpoptions' and "!" is not used in the command.
*:cd* *E747* *E472* *:cd* *E747* *E472*
:cd[!] On non-Unix systems: Print the current directory :cd[!] On non-Unix systems when 'cdhome' is off: Print the
name. On Unix systems: Change the current directory current directory name.
to the home directory. Use |:pwd| to print the Otherwise: Change the current directory to the home
current directory on all systems. directory. Clear any window-local directory.
On Unix systems: clear any window-local directory. Use |:pwd| to print the current directory on all
systems.
:cd[!] {path} Change the current directory to {path}. :cd[!] {path} Change the current directory to {path}.
If {path} is relative, it is searched for in the If {path} is relative, it is searched for in the

View File

@ -635,6 +635,7 @@ Short explanation of each option: *option-list*
'buflisted' 'bl' whether the buffer shows up in the buffer list 'buflisted' 'bl' whether the buffer shows up in the buffer list
'buftype' 'bt' special type of buffer 'buftype' 'bt' special type of buffer
'casemap' 'cmp' specifies how case of letters is changed '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" 'cdpath' 'cd' list of directories searched with ":cd"
'cedit' key used to open the command-line window 'cedit' key used to open the command-line window
'charconvert' 'ccv' expression for character encoding conversion 'charconvert' 'ccv' expression for character encoding conversion

View File

@ -260,6 +260,10 @@ call <SID>OptionG("sect", &sect)
call <SID>AddOption("path", gettext("list of directory names used for file searching")) call <SID>AddOption("path", gettext("list of directory names used for file searching"))
call append("$", "\t" .. s:global_or_local) call append("$", "\t" .. s:global_or_local)
call <SID>OptionG("pa", &pa) 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>AddOption("cdpath", gettext("list of directory names used for :cd"))
call <SID>OptionG("cd", &cd) call <SID>OptionG("cd", &cd)
if exists("+autochdir") if exists("+autochdir")

View File

@ -7402,9 +7402,13 @@ changedir_func(
else else
prev_dir = pdir; prev_dir = pdir;
// For UNIX ":cd" means: go to home directory.
// On other systems too if 'cdhome' is set.
#if defined(UNIX) || defined(VMS) #if defined(UNIX) || defined(VMS)
// for UNIX ":cd" means: go to home directory
if (*new_dir == NUL) if (*new_dir == NUL)
#else
if (*new_dir == NUL && p_cdh)
#endif
{ {
// use NameBuff for home directory name // use NameBuff for home directory name
# ifdef VMS # ifdef VMS
@ -7420,7 +7424,6 @@ changedir_func(
# endif # endif
new_dir = NameBuff; new_dir = NameBuff;
} }
#endif
dir_differs = new_dir == NULL || pdir == NULL dir_differs = new_dir == NULL || pdir == NULL
|| pathcmp((char *)pdir, (char *)new_dir, -1) != 0; || pathcmp((char *)pdir, (char *)new_dir, -1) != 0;
if (new_dir == NULL || (dir_differs && vim_chdir(new_dir))) if (new_dir == NULL || (dir_differs && vim_chdir(new_dir)))
@ -7459,8 +7462,8 @@ ex_cd(exarg_T *eap)
new_dir = eap->arg; new_dir = eap->arg;
#if !defined(UNIX) && !defined(VMS) #if !defined(UNIX) && !defined(VMS)
// for non-UNIX ":cd" means: print current directory // for non-UNIX ":cd" means: print current directory unless 'cdhome' is set
if (*new_dir == NUL) if (*new_dir == NUL && !p_cdh)
ex_pwd(NULL); ex_pwd(NULL);
else else
#endif #endif

View File

@ -1094,6 +1094,7 @@ EXTERN int p_write; // 'write'
EXTERN int p_wa; // 'writeany' EXTERN int p_wa; // 'writeany'
EXTERN int p_wb; // 'writebackup' EXTERN int p_wb; // 'writebackup'
EXTERN long p_wd; // 'writedelay' EXTERN long p_wd; // 'writedelay'
EXTERN int p_cdh; // 'cdhome'
/* /*
* "indir" values for buffer-local options. * "indir" values for buffer-local options.

View File

@ -549,6 +549,10 @@ static struct vimoption options[] =
(char_u *)&p_cmp, PV_NONE, (char_u *)&p_cmp, PV_NONE,
{(char_u *)"internal,keepascii", (char_u *)0L} {(char_u *)"internal,keepascii", (char_u *)0L}
SCTX_INIT}, 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, {"cdpath", "cd", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE|P_COMMA|P_NODUP,
#ifdef FEAT_SEARCHPATH #ifdef FEAT_SEARCHPATH
(char_u *)&p_cdpath, PV_NONE, (char_u *)&p_cdpath, PV_NONE,

View File

@ -77,6 +77,9 @@ if has('reltime')
let s:start_time = reltime() let s:start_time = reltime()
endif endif
" Always use forward slashes.
set shellslash
" Common with all tests on all systems. " Common with all tests on all systems.
source setup.vim source setup.vim
@ -128,9 +131,6 @@ if has('gui_running') && exists('did_install_default_menus')
source $VIMRUNTIME/menu.vim source $VIMRUNTIME/menu.vim
endif endif
" Always use forward slashes.
set shellslash
let s:srcdir = expand('%:p:h:h') let s:srcdir = expand('%:p:h:h')
if has('win32') if has('win32')

View File

@ -1199,4 +1199,25 @@ func Test_opt_scrolljump()
bw bw
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3780,
/**/ /**/
3779, 3779,
/**/ /**/