To:
[email protected]
Subject: Patch 7.2b.018
Fcc: outbox
From: Bram Moolenaar <
[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 7.2b.018
Problem: When doing command line completion on a file name for a csh-like
shell argument a '!' character isn't escaped properly.
Solution: Add another backslash.
Files: src/ex_getln.c, src/misc2.c, src/proto/misc2.pro, src/screen.c
*** ../vim-7.2b.017/src/ex_getln.c Tue Jun 24 23:49:23 2008
--- src/ex_getln.c Thu Jul 24 10:36:42 2008
***************
*** 3707,3716 ****
char_u *fname;
int shell;
{
#ifdef BACKSLASH_IN_FILENAME
char_u buf[20];
int j = 0;
- char_u *p;
/* Don't escape '[' and '{' if they are in 'isfname'. */
for (p = PATH_ESC_CHARS; *p != NUL; ++p)
--- 3707,3716 ----
char_u *fname;
int shell;
{
+ char_u *p;
#ifdef BACKSLASH_IN_FILENAME
char_u buf[20];
int j = 0;
/* Don't escape '[' and '{' if they are in 'isfname'. */
for (p = PATH_ESC_CHARS; *p != NUL; ++p)
***************
*** 3719,3725 ****
buf[j] = NUL;
return vim_strsave_escaped(fname, buf);
#else
! return vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
#endif
}
--- 3719,3736 ----
buf[j] = NUL;
return vim_strsave_escaped(fname, buf);
#else
! p = vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
! if (shell && csh_like_shell() && p != NULL)
! {
! char_u *s;
!
! /* For csh and similar shells need to put two backslashes before '!'.
! * One is taken by Vim, one by the shell. */
! s = vim_strsave_escaped(p, (char_u *)"!");
! vim_free(p);
! p = s;
! }
! return p;
#endif
}
***************
*** 5960,5966 ****
--- 5971,5979 ----
linenr_T lnum;
int histtype;
garray_T winsizes;
+ #ifdef FEAT_AUTOCMD
char_u typestr[2];
+ #endif
int save_restart_edit = restart_edit;
int save_State = State;
int save_exmode = exmode_active;
*** ../vim-7.2b.017/src/misc2.c Wed Jul 16 22:42:51 2008
--- src/misc2.c Wed Jul 23 21:12:56 2008
***************
*** 1257,1262 ****
--- 1257,1273 ----
return escaped_string;
}
+ #if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
+ /*
+ * Return TRUE when 'shell' has "csh" in the tail.
+ */
+ int
+ csh_like_shell()
+ {
+ return (strstr((char *)gettail(p_sh), "csh") != NULL);
+ }
+ #endif
+
#if defined(FEAT_EVAL) || defined(PROTO)
/*
* Escape "string" for use as a shell argument with system().
***************
*** 1283,1289 ****
* the like we must not put a backslash before it, it will be taken
* literally. If do_special is set the '!' will be escaped twice.
* Csh also needs to have "\n" escaped twice when do_special is set. */
! csh_like = (strstr((char *)gettail(p_sh), "csh") != NULL);
/* First count the number of extra bytes required. */
length = (unsigned)STRLEN(string) + 3; /* two quotes and a trailing NUL */
--- 1294,1300 ----
* the like we must not put a backslash before it, it will be taken
* literally. If do_special is set the '!' will be escaped twice.
* Csh also needs to have "\n" escaped twice when do_special is set. */
! csh_like = csh_like_shell();
/* First count the number of extra bytes required. */
length = (unsigned)STRLEN(string) + 3; /* two quotes and a trailing NUL */
*** ../vim-7.2b.017/src/proto/misc2.pro Fri Jul 4 11:44:02 2008
--- src/proto/misc2.pro Wed Jul 23 21:12:59 2008
***************
*** 29,34 ****
--- 29,35 ----
char_u *vim_strnsave __ARGS((char_u *string, int len));
char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars));
char_u *vim_strsave_escaped_ext __ARGS((char_u *string, char_u *esc_chars, int cc, int bsl));
+ int csh_like_shell __ARGS((void));
char_u *vim_strsave_shellescape __ARGS((char_u *string, int do_special));
char_u *vim_strsave_up __ARGS((char_u *string));
char_u *vim_strnsave_up __ARGS((char_u *string, int len));
*** ../vim-7.2b.017/src/screen.c Fri Jul 18 17:11:39 2008
--- src/screen.c Thu Jul 24 16:45:07 2008
***************
*** 5447,5454 ****
while (*s != NUL)
{
! if (skip_status_match_char(xp, s))
! ++s;
len += ptr2cells(s);
mb_ptr_adv(s);
}
--- 5447,5453 ----
while (*s != NUL)
{
! s += skip_status_match_char(xp, s);
len += ptr2cells(s);
mb_ptr_adv(s);
}
***************
*** 5457,5463 ****
}
/*
! * Return TRUE for characters that are not displayed in a status match.
* These are backslashes used for escaping. Do show backslashes in help tags.
*/
static int
--- 5456,5462 ----
}
/*
! * Return the number of characters that should be skipped in a status match.
* These are backslashes used for escaping. Do show backslashes in help tags.
*/
static int
***************
*** 5465,5477 ****
expand_T *xp;
char_u *s;
{
! return ((rem_backslash(s) && xp->xp_context != EXPAND_HELP)
#ifdef FEAT_MENU
|| ((xp->xp_context == EXPAND_MENUS
|| xp->xp_context == EXPAND_MENUNAMES)
&& (s[0] == '\t' || (s[0] == '\\' && s[1] != NUL)))
#endif
! );
}
/*
--- 5464,5484 ----
expand_T *xp;
char_u *s;
{
! if ((rem_backslash(s) && xp->xp_context != EXPAND_HELP)
#ifdef FEAT_MENU
|| ((xp->xp_context == EXPAND_MENUS
|| xp->xp_context == EXPAND_MENUNAMES)
&& (s[0] == '\t' || (s[0] == '\\' && s[1] != NUL)))
#endif
! )
! {
! #ifndef BACKSLASH_IN_FILENAME
! if (xp->xp_shell && csh_like_shell() && s[1] == '\\' && s[2] == '!')
! return 2;
! #endif
! return 1;
! }
! return 0;
}
/*
***************
*** 5609,5616 ****
#endif
for ( ; *s != NUL; ++s)
{
! if (skip_status_match_char(xp, s))
! ++s;
clen += ptr2cells(s);
#ifdef FEAT_MBYTE
if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1)
--- 5616,5622 ----
#endif
for ( ; *s != NUL; ++s)
{
! s += skip_status_match_char(xp, s);
clen += ptr2cells(s);
#ifdef FEAT_MBYTE
if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1)
***************
*** 6264,6270 ****
#ifdef FEAT_MBYTE
/* When drawing over the right halve of a double-wide char clear out the
* left halve. Only needed in a terminal. */
! if (has_mbyte
# ifdef FEAT_GUI
&& !gui.in_use
# endif
--- 6270,6276 ----
#ifdef FEAT_MBYTE
/* When drawing over the right halve of a double-wide char clear out the
* left halve. Only needed in a terminal. */
! if (has_mbyte && col > 0 && col < screen_Columns
# ifdef FEAT_GUI
&& !gui.in_use
# endif
***************
*** 7138,7144 ****
* out the left halve. When drawing over the left halve of a
* double wide-char clear out the right halve. Only needed in a
* terminal. */
! if (mb_fix_col(start_col, row) != start_col)
screen_puts_len((char_u *)" ", 1, row, start_col - 1, 0);
if (end_col < screen_Columns && mb_fix_col(end_col, row) != end_col)
screen_puts_len((char_u *)" ", 1, row, end_col, 0);
--- 7144,7150 ----
* out the left halve. When drawing over the left halve of a
* double wide-char clear out the right halve. Only needed in a
* terminal. */
! if (start_col > 0 && mb_fix_col(start_col, row) != start_col)
screen_puts_len((char_u *)" ", 1, row, start_col - 1, 0);
if (end_col < screen_Columns && mb_fix_col(end_col, row) != end_col)
screen_puts_len((char_u *)" ", 1, row, end_col, 0);
*** ../vim-7.2b.017/src/version.c Thu Jul 24 19:33:36 2008
--- src/version.c Thu Jul 24 20:23:37 2008
***************
*** 678,679 ****
--- 678,681 ----
{ /* Add new patch number below this line */
+ /**/
+ 18,
/**/
--
Nothing is impossible for the man who doesn't have to do it.
/// Bram Moolenaar --
[email protected] --
http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute --
http://www.A-A-P.org ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///