# HG changeset patch # User vimboss # Date 1216924177 0 # Node ID 7015ddf8105575fcf48eac35b14c61a24fc38d7f # Parent fc8bf5d4051a1c13085db00c902092215ac9852b updated for version 7.2b-018 diff --git a/src/ex_getln.c b/src/ex_getln.c --- 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; diff --git a/src/misc2.c b/src/misc2.c --- 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 */ diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro --- 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)); diff --git a/src/screen.c b/src/screen.c --- 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); diff --git a/src/version.c b/src/version.c --- 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,