changeset 1685:7015ddf81055 v7.2b.018

updated for version 7.2b-018
author vimboss
date Thu, 24 Jul 2008 18:29:37 +0000
parents fc8bf5d4051a
children c7c53db66b55
files src/ex_getln.c src/misc2.c src/proto/misc2.pro src/screen.c src/version.c
diffstat 5 files changed, 45 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -3707,10 +3707,10 @@ vim_strsave_fnameescape(fname, shell)
     char_u *fname;
     int    shell;
 {
+    char_u	*p;
 #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)
@@ -3719,7 +3719,18 @@ vim_strsave_fnameescape(fname, shell)
     buf[j] = NUL;
     return vim_strsave_escaped(fname, buf);
 #else
-    return vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
+    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,7 +5971,9 @@ ex_window()
     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;
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1257,6 +1257,17 @@ vim_strsave_escaped_ext(string, esc_char
     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,7 +1294,7 @@ vim_strsave_shellescape(string, do_speci
      * 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);
+    csh_like = csh_like_shell();
 
     /* First count the number of extra bytes required. */
     length = (unsigned)STRLEN(string) + 3;  /* two quotes and a trailing NUL */
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -29,6 +29,7 @@ char_u *vim_strsave __ARGS((char_u *stri
 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));
--- a/src/screen.c
+++ b/src/screen.c
@@ -5447,8 +5447,7 @@ status_match_len(xp, s)
 
     while (*s != NUL)
     {
-	if (skip_status_match_char(xp, s))
-	    ++s;
+	s += skip_status_match_char(xp, s);
 	len += ptr2cells(s);
 	mb_ptr_adv(s);
     }
@@ -5457,7 +5456,7 @@ status_match_len(xp, s)
 }
 
 /*
- * Return TRUE for characters that are not displayed in a status match.
+ * 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,13 +5464,21 @@ skip_status_match_char(xp, s)
     expand_T	*xp;
     char_u	*s;
 {
-    return ((rem_backslash(s) && xp->xp_context != EXPAND_HELP)
+    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,8 +5616,7 @@ win_redr_status_matches(xp, num_matches,
 #endif
 	    for ( ; *s != NUL; ++s)
 	{
-	    if (skip_status_match_char(xp, s))
-		++s;
+	    s += skip_status_match_char(xp, s);
 	    clen += ptr2cells(s);
 #ifdef FEAT_MBYTE
 	    if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1)
@@ -6264,7 +6270,7 @@ screen_puts_len(text, len, row, col, att
 #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
+    if (has_mbyte && col > 0 && col < screen_Columns
 # ifdef FEAT_GUI
 	    && !gui.in_use
 # endif
@@ -7138,7 +7144,7 @@ screen_fill(start_row, end_row, start_co
 	     * 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)
+	    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);
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    18,
+/**/
     17,
 /**/
     16,