summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1291
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1291')
-rw-r--r--data/vim/patches/8.1.1291561
1 files changed, 0 insertions, 561 deletions
diff --git a/data/vim/patches/8.1.1291 b/data/vim/patches/8.1.1291
deleted file mode 100644
index 2cb567dfc..000000000
--- a/data/vim/patches/8.1.1291
+++ /dev/null
@@ -1,561 +0,0 @@
-To: vim_dev@googlegroups.com
-Subject: Patch 8.1.1291
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 8.1.1291
-Problem: Not easy to change directory and restore.
-Solution: Add the chdir() function. (Yegappan Lakshmanan, closes #4358)
-Files: runtime/doc/eval.txt, runtime/doc/todo.txt,
- runtime/doc/usr_41.txt, src/evalfunc.c, src/ex_docmd.c,
- src/if_py_both.h, src/proto/ex_docmd.pro, src/structs.h,
- src/testdir/test_cd.vim
-
-
-*** ../vim-8.1.1290/runtime/doc/eval.txt 2019-05-05 18:11:46.312590682 +0200
---- runtime/doc/eval.txt 2019-05-07 22:00:01.205510545 +0200
-***************
-*** 2273,2278 ****
---- 2273,2279 ----
- String status of channel {handle}
- changenr() Number current change number
- char2nr({expr} [, {utf8}]) Number ASCII/UTF8 value of first char in {expr}
-+ chdir({dir}) String change current working directory
- cindent({lnum}) Number C indent for line {lnum}
- clearmatches([{win}]) none clear all matches
- col({expr}) Number column nr of cursor or mark
-***************
-*** 3469,3474 ****
---- 3470,3496 ----
- let list = map(split(str, '\zs'), {_, val -> char2nr(val)})
- < Result: [65, 66, 67]
-
-+ chdir({dir}) *chdir()*
-+ Change the current working directory to {dir}. The scope of
-+ the directory change depends on the directory of the current
-+ window:
-+ - If the current window has a window-local directory
-+ (|:lcd|), then changes the window local directory.
-+ - Otherwise, if the current tabpage has a local
-+ directory (|:tcd|) then changes the tabpage local
-+ directory.
-+ - Otherwise, changes the global directory.
-+ If successful, returns the previous working directory. Pass
-+ this to another chdir() to restore the directory.
-+ On failure, returns an empty string.
-+
-+ Example: >
-+ let save_dir = chdir(newdir)
-+ if save_dir
-+ " ... do some work
-+ call chdir(save_dir)
-+ endif
-+ <
- cindent({lnum}) *cindent()*
- Get the amount of indent for line {lnum} according the C
- indenting rules, as with 'cindent'.
-*** ../vim-8.1.1290/runtime/doc/usr_41.txt 2019-05-05 18:11:46.328590595 +0200
---- runtime/doc/usr_41.txt 2019-05-07 21:56:20.282699661 +0200
-***************
-*** 769,774 ****
---- 769,775 ----
- haslocaldir() check if current window used |:lcd| or |:tcd|
- tempname() get the name of a temporary file
- mkdir() create a new directory
-+ chdir() change current working directory
- delete() delete a file
- rename() rename a file
- system() get the result of a shell command as a string
-*** ../vim-8.1.1290/src/evalfunc.c 2019-05-07 16:28:08.177289442 +0200
---- src/evalfunc.c 2019-05-07 21:56:20.286699640 +0200
-***************
-*** 107,112 ****
---- 107,113 ----
- #endif
- static void f_changenr(typval_T *argvars, typval_T *rettv);
- static void f_char2nr(typval_T *argvars, typval_T *rettv);
-+ static void f_chdir(typval_T *argvars, typval_T *rettv);
- static void f_cindent(typval_T *argvars, typval_T *rettv);
- static void f_clearmatches(typval_T *argvars, typval_T *rettv);
- static void f_col(typval_T *argvars, typval_T *rettv);
-***************
-*** 597,602 ****
---- 598,604 ----
- #endif
- {"changenr", 0, 0, f_changenr},
- {"char2nr", 1, 2, f_char2nr},
-+ {"chdir", 1, 1, f_chdir},
- {"cindent", 1, 1, f_cindent},
- {"clearmatches", 0, 1, f_clearmatches},
- {"col", 1, 1, f_col},
-***************
-*** 2491,2496 ****
---- 2493,2537 ----
- }
-
- /*
-+ * "chdir(dir)" function
-+ */
-+ static void
-+ f_chdir(typval_T *argvars, typval_T *rettv)
-+ {
-+ char_u *cwd;
-+ cdscope_T scope = CDSCOPE_GLOBAL;
-+
-+ rettv->v_type = VAR_STRING;
-+ rettv->vval.v_string = NULL;
-+
-+ if (argvars[0].v_type != VAR_STRING)
-+ return;
-+
-+ // Return the current directory
-+ cwd = alloc(MAXPATHL);
-+ if (cwd != NULL)
-+ {
-+ if (mch_dirname(cwd, MAXPATHL) != FAIL)
-+ {
-+ #ifdef BACKSLASH_IN_FILENAME
-+ slash_adjust(cwd);
-+ #endif
-+ rettv->vval.v_string = vim_strsave(cwd);
-+ }
-+ vim_free(cwd);
-+ }
-+
-+ if (curwin->w_localdir != NULL)
-+ scope = CDSCOPE_WINDOW;
-+ else if (curtab->tp_localdir != NULL)
-+ scope = CDSCOPE_TABPAGE;
-+
-+ if (!changedir_func(argvars[0].vval.v_string, TRUE, scope))
-+ // Directory change failed
-+ VIM_CLEAR(rettv->vval.v_string);
-+ }
-+
-+ /*
- * "cindent(lnum)" function
- */
- static void
-*** ../vim-8.1.1290/src/ex_docmd.c 2019-05-04 15:05:24.927269310 +0200
---- src/ex_docmd.c 2019-05-07 21:56:20.286699640 +0200
-***************
-*** 7513,7529 ****
-
- /*
- * Deal with the side effects of changing the current directory.
-! * When "tablocal" is TRUE then this was after an ":tcd" command.
-! * When "winlocal" is TRUE then this was after an ":lcd" command.
- */
- void
-! post_chdir(int tablocal, int winlocal)
- {
-! if (!winlocal)
- // Clear tab local directory for both :cd and :tcd
- VIM_CLEAR(curtab->tp_localdir);
- VIM_CLEAR(curwin->w_localdir);
-! if (winlocal || tablocal)
- {
- /* If still in global directory, need to remember current
- * directory as global directory. */
---- 7513,7529 ----
-
- /*
- * Deal with the side effects of changing the current directory.
-! * When 'scope' is CDSCOPE_TABPAGE then this was after an ":tcd" command.
-! * When 'scope' is CDSCOPE_WINDOW then this was after an ":lcd" command.
- */
- void
-! post_chdir(cdscope_T scope)
- {
-! if (scope != CDSCOPE_WINDOW)
- // Clear tab local directory for both :cd and :tcd
- VIM_CLEAR(curtab->tp_localdir);
- VIM_CLEAR(curwin->w_localdir);
-! if (scope != CDSCOPE_GLOBAL)
- {
- /* If still in global directory, need to remember current
- * directory as global directory. */
-***************
-*** 7532,7538 ****
- /* Remember this local directory for the window. */
- if (mch_dirname(NameBuff, MAXPATHL) == OK)
- {
-! if (tablocal)
- curtab->tp_localdir = vim_strsave(NameBuff);
- else
- curwin->w_localdir = vim_strsave(NameBuff);
---- 7532,7538 ----
- /* Remember this local directory for the window. */
- if (mch_dirname(NameBuff, MAXPATHL) == OK)
- {
-! if (scope == CDSCOPE_TABPAGE)
- curtab->tp_localdir = vim_strsave(NameBuff);
- else
- curwin->w_localdir = vim_strsave(NameBuff);
-***************
-*** 7548,7649 ****
- shorten_fnames(TRUE);
- }
-
--
- /*
-! * ":cd", ":tcd", ":lcd", ":chdir" ":tchdir" and ":lchdir".
- */
-! void
-! ex_cd(exarg_T *eap)
- {
-- char_u *new_dir;
- char_u *tofree;
- int dir_differs;
-
-! new_dir = eap->arg;
-! #if !defined(UNIX) && !defined(VMS)
-! /* for non-UNIX ":cd" means: print current directory */
-! if (*new_dir == NUL)
-! ex_pwd(NULL);
-! else
-! #endif
- {
-! if (allbuf_locked())
-! return;
-! if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged()
-! && !eap->forceit)
-! {
-! emsg(_("E747: Cannot change directory, buffer is modified (add ! to override)"));
-! return;
-! }
-
-! /* ":cd -": Change to previous directory */
-! if (STRCMP(new_dir, "-") == 0)
- {
-! if (prev_dir == NULL)
-! {
-! emsg(_("E186: No previous directory"));
-! return;
-! }
-! new_dir = prev_dir;
- }
-
-! /* Save current directory for next ":cd -" */
-! tofree = prev_dir;
-! if (mch_dirname(NameBuff, MAXPATHL) == OK)
-! prev_dir = vim_strsave(NameBuff);
-! else
-! prev_dir = NULL;
-
- #if defined(UNIX) || defined(VMS)
-! /* for UNIX ":cd" means: go to home directory */
-! if (*new_dir == NUL)
-! {
-! /* use NameBuff for home directory name */
- # ifdef VMS
-! char_u *p;
-
-! p = mch_getenv((char_u *)"SYS$LOGIN");
-! if (p == NULL || *p == NUL) /* empty is the same as not set */
-! NameBuff[0] = NUL;
-! else
-! vim_strncpy(NameBuff, p, MAXPATHL - 1);
- # else
-! expand_env((char_u *)"$HOME", NameBuff, MAXPATHL);
- # endif
-! new_dir = NameBuff;
-! }
- #endif
-! dir_differs = new_dir == NULL || prev_dir == NULL
-! || pathcmp((char *)prev_dir, (char *)new_dir, -1) != 0;
-! if (new_dir == NULL || (dir_differs && vim_chdir(new_dir)))
-! emsg(_(e_failed));
-! else
- {
-! char_u *acmd_fname;
-! int is_winlocal_chdir = eap->cmdidx == CMD_lcd
-! || eap->cmdidx == CMD_lchdir;
-! int is_tablocal_chdir = eap->cmdidx == CMD_tcd
-! || eap->cmdidx == CMD_tchdir;
-
-! post_chdir(is_tablocal_chdir, is_winlocal_chdir);
-
-! /* Echo the new current directory if the command was typed. */
- if (KeyTyped || p_verbose >= 5)
- ex_pwd(eap);
--
-- if (dir_differs)
-- {
-- if (is_winlocal_chdir)
-- acmd_fname = (char_u *)"window";
-- else if (is_tablocal_chdir)
-- acmd_fname = (char_u *)"tabpage";
-- else
-- acmd_fname = (char_u *)"global";
-- apply_autocmds(EVENT_DIRCHANGED, acmd_fname,
-- new_dir, FALSE, curbuf);
-- }
- }
-- vim_free(tofree);
- }
- }
-
---- 7548,7673 ----
- shorten_fnames(TRUE);
- }
-
- /*
-! * Change directory function used by :cd/:tcd/:lcd Ex commands and the
-! * chdir() function. If 'winlocaldir' is TRUE, then changes the window-local
-! * directory. If 'tablocaldir' is TRUE, then changes the tab-local directory.
-! * Otherwise changes the global directory.
-! * Returns TRUE if the directory is successfully changed.
- */
-! int
-! changedir_func(
-! char_u *new_dir,
-! int forceit,
-! cdscope_T scope)
- {
- char_u *tofree;
- int dir_differs;
-+ int retval = FALSE;
-
-! if (allbuf_locked())
-! return FALSE;
-!
-! if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged() && !forceit)
- {
-! emsg(_("E747: Cannot change directory, buffer is modified (add ! to override)"));
-! return FALSE;
-! }
-
-! // ":cd -": Change to previous directory
-! if (STRCMP(new_dir, "-") == 0)
-! {
-! if (prev_dir == NULL)
- {
-! emsg(_("E186: No previous directory"));
-! return FALSE;
- }
-+ new_dir = prev_dir;
-+ }
-
-! // Save current directory for next ":cd -"
-! tofree = prev_dir;
-! if (mch_dirname(NameBuff, MAXPATHL) == OK)
-! prev_dir = vim_strsave(NameBuff);
-! else
-! prev_dir = NULL;
-
- #if defined(UNIX) || defined(VMS)
-! // for UNIX ":cd" means: go to home directory
-! if (*new_dir == NUL)
-! {
-! // use NameBuff for home directory name
- # ifdef VMS
-! char_u *p;
-
-! p = mch_getenv((char_u *)"SYS$LOGIN");
-! if (p == NULL || *p == NUL) // empty is the same as not set
-! NameBuff[0] = NUL;
-! else
-! vim_strncpy(NameBuff, p, MAXPATHL - 1);
- # else
-! expand_env((char_u *)"$HOME", NameBuff, MAXPATHL);
- # endif
-! new_dir = NameBuff;
-! }
- #endif
-! dir_differs = new_dir == NULL || prev_dir == NULL
-! || pathcmp((char *)prev_dir, (char *)new_dir, -1) != 0;
-! if (new_dir == NULL || (dir_differs && vim_chdir(new_dir)))
-! emsg(_(e_failed));
-! else
-! {
-! char_u *acmd_fname;
-!
-! post_chdir(scope);
-!
-! if (dir_differs)
- {
-! if (scope == CDSCOPE_WINDOW)
-! acmd_fname = (char_u *)"window";
-! else if (scope == CDSCOPE_TABPAGE)
-! acmd_fname = (char_u *)"tabpage";
-! else
-! acmd_fname = (char_u *)"global";
-! apply_autocmds(EVENT_DIRCHANGED, acmd_fname, new_dir, FALSE,
-! curbuf);
-! }
-! retval = TRUE;
-! }
-! vim_free(tofree);
-
-! return retval;
-! }
-
-! /*
-! * ":cd", ":tcd", ":lcd", ":chdir" ":tchdir" and ":lchdir".
-! */
-! void
-! ex_cd(exarg_T *eap)
-! {
-! char_u *new_dir;
-!
-! new_dir = eap->arg;
-! #if !defined(UNIX) && !defined(VMS)
-! // for non-UNIX ":cd" means: print current directory
-! if (*new_dir == NUL)
-! ex_pwd(NULL);
-! else
-! #endif
-! {
-! cdscope_T scope = CDSCOPE_GLOBAL;
-!
-! if (eap->cmdidx == CMD_lcd || eap->cmdidx == CMD_lchdir)
-! scope = CDSCOPE_WINDOW;
-! else if (eap->cmdidx == CMD_tcd || eap->cmdidx == CMD_tchdir)
-! scope = CDSCOPE_TABPAGE;
-!
-! if (changedir_func(new_dir, eap->forceit, scope))
-! {
-! // Echo the new current directory if the command was typed.
- if (KeyTyped || p_verbose >= 5)
- ex_pwd(eap);
- }
- }
- }
-
-*** ../vim-8.1.1290/src/if_py_both.h 2019-04-27 20:36:52.530303581 +0200
---- src/if_py_both.h 2019-05-07 21:56:20.286699640 +0200
-***************
-*** 1032,1038 ****
- Py_DECREF(newwd);
- Py_XDECREF(todecref);
-
-! post_chdir(FALSE, FALSE);
-
- if (VimTryEnd())
- {
---- 1032,1038 ----
- Py_DECREF(newwd);
- Py_XDECREF(todecref);
-
-! post_chdir(CDSCOPE_GLOBAL);
-
- if (VimTryEnd())
- {
-*** ../vim-8.1.1290/src/proto/ex_docmd.pro 2019-04-27 20:36:52.534303564 +0200
---- src/proto/ex_docmd.pro 2019-05-07 21:56:20.286699640 +0200
-***************
-*** 37,43 ****
- void tabpage_new(void);
- void do_exedit(exarg_T *eap, win_T *old_curwin);
- void free_cd_dir(void);
-! void post_chdir(int tablocal, int winlocal);
- void ex_cd(exarg_T *eap);
- void do_sleep(long msec);
- void ex_may_print(exarg_T *eap);
---- 37,44 ----
- void tabpage_new(void);
- void do_exedit(exarg_T *eap, win_T *old_curwin);
- void free_cd_dir(void);
-! void post_chdir(cdscope_T cdscope);
-! int changedir_func(char_u *new_dir, int forceit, cdscope_T cdscope);
- void ex_cd(exarg_T *eap);
- void do_sleep(long msec);
- void ex_may_print(exarg_T *eap);
-*** ../vim-8.1.1290/src/structs.h 2019-05-05 15:47:37.825923529 +0200
---- src/structs.h 2019-05-07 22:01:54.424899979 +0200
-***************
-*** 3555,3557 ****
---- 3555,3564 ----
- varnumber_T vv_count;
- varnumber_T vv_count1;
- } vimvars_save_T;
-+
-+ // Scope for changing directory
-+ typedef enum {
-+ CDSCOPE_GLOBAL, // :cd
-+ CDSCOPE_TABPAGE, // :tcd
-+ CDSCOPE_WINDOW // :lcd
-+ } cdscope_T;
-*** ../vim-8.1.1290/src/testdir/test_cd.vim 2018-07-03 18:36:23.037340552 +0200
---- src/testdir/test_cd.vim 2019-05-07 21:56:20.286699640 +0200
-***************
-*** 1,4 ****
-! " Test for :cd
-
- func Test_cd_large_path()
- " This used to crash with a heap write overflow.
---- 1,4 ----
-! " Test for :cd and chdir()
-
- func Test_cd_large_path()
- " This used to crash with a heap write overflow.
-***************
-*** 65,67 ****
---- 65,108 ----
- set cpo&
- bw!
- endfunc
-+
-+ " Test for chdir()
-+ func Test_chdir_func()
-+ let topdir = getcwd()
-+ call mkdir('Xdir/y/z', 'p')
-+
-+ " Create a few tabpages and windows with different directories
-+ new
-+ cd Xdir
-+ tabnew
-+ tcd y
-+ below new
-+ below new
-+ lcd z
-+
-+ tabfirst
-+ call chdir('..')
-+ call assert_equal('y', fnamemodify(getcwd(1, 2), ':t'))
-+ call assert_equal('z', fnamemodify(getcwd(3, 2), ':t'))
-+ tabnext | wincmd t
-+ call chdir('..')
-+ call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
-+ call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
-+ call assert_equal('z', fnamemodify(getcwd(3, 2), ':t'))
-+ call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
-+ 3wincmd w
-+ call chdir('..')
-+ call assert_equal('Xdir', fnamemodify(getcwd(1, 2), ':t'))
-+ call assert_equal('Xdir', fnamemodify(getcwd(2, 2), ':t'))
-+ call assert_equal('y', fnamemodify(getcwd(3, 2), ':t'))
-+ call assert_equal('testdir', fnamemodify(getcwd(1, 1), ':t'))
-+
-+ " Error case
-+ call assert_fails("call chdir('dir-abcd')", 'E472:')
-+ silent! let d = chdir("dir_abcd")
-+ call assert_equal("", d)
-+
-+ only | tabonly
-+ exe 'cd ' . topdir
-+ call delete('Xdir', 'rf')
-+ endfunc
-*** ../vim-8.1.1290/src/version.c 2019-05-07 21:48:15.629291397 +0200
---- src/version.c 2019-05-07 22:06:10.403517496 +0200
-***************
-*** 769,770 ****
---- 769,772 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 1291,
- /**/
-
---
-Violators can be fined, arrested or jailed for making ugly faces at a dog.
- [real standing law in Oklahoma, United States of America]
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ an exciting new programming language -- http://www.Zimbu.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///