patch 9.1.1556: string handling in cmdexpand.c can be improved

Commit: 
https://github.com/vim/vim/commit/393d398247440f7045acf703cd179ad0da148318
Author: John Marriott <basil...@internode.on.net>
Date:   Wed Jul 16 20:09:13 2025 +0200

    patch 9.1.1556: string handling in cmdexpand.c can be improved
    
    Problem:  string handling in cmdexpand.c can be improved
    Solution: Improve string manipulation in cmdexpand.c (John Marriott).
    
    This PR does the following:
    
    In cmdline_fuzzy_completion_supported():
    - replace the series of if tests with a switch
    
    In expand_shellcmd_onedir():
    - move the code to concatenate path and pattern to expand_shellcmd().
      This allows us to slightly simplify the argument list to pass the fully
      pathed pattern and the length of the path in the pattern (0 if no path)
    - factor out calls to STRMOVE()
    
    In expand_shellcmd():
    - factor out calls to STRMOVE() in the first for loop.
    - reorganise the second for loop by:
      a) only calling vim_strchr() if s is not at the end of the string
      b) making sure that when the path and pattern are concatenated they fit
         inside buf
      c) concatenating path and pattern and pass to expand_shellcmd_onedir()
    
    In globpath():
    - slightly improve logic that determines if the complete path will fit
      inside the buffer
    
    In f_getcompletion():
    - replace the series of if tests with a switch
    - factor out calls to STRLEN()
    
    In copy_substring_from_pos():
    - factor out the call to STRLEN()
    
    closes: #17742
    
    Signed-off-by: John Marriott <basil...@internode.on.net>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index ffefada74..449636f73 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -47,30 +47,38 @@ static char_u *cmdline_orig = NULL;
     static int
 cmdline_fuzzy_completion_supported(expand_T *xp)
 {
-    return (vim_strchr(p_wop, WOP_FUZZY) != NULL
-           && xp->xp_context != EXPAND_BOOL_SETTINGS
-           && xp->xp_context != EXPAND_COLORS
-           && xp->xp_context != EXPAND_COMPILER
-           && xp->xp_context != EXPAND_DIRECTORIES
-           && xp->xp_context != EXPAND_DIRS_IN_CDPATH
-           && xp->xp_context != EXPAND_FILES
-           && xp->xp_context != EXPAND_FILES_IN_PATH
-           && xp->xp_context != EXPAND_FILETYPE
-           && xp->xp_context != EXPAND_FILETYPECMD
-           && xp->xp_context != EXPAND_FINDFUNC
-           && xp->xp_context != EXPAND_HELP
-           && xp->xp_context != EXPAND_KEYMAP
-           && xp->xp_context != EXPAND_OLD_SETTING
-           && xp->xp_context != EXPAND_STRING_SETTING
-           && xp->xp_context != EXPAND_SETTING_SUBTRACT
-           && xp->xp_context != EXPAND_OWNSYNTAX
-           && xp->xp_context != EXPAND_PACKADD
-           && xp->xp_context != EXPAND_RUNTIME
-           && xp->xp_context != EXPAND_SHELLCMD
-           && xp->xp_context != EXPAND_SHELLCMDLINE
-           && xp->xp_context != EXPAND_TAGS
-           && xp->xp_context != EXPAND_TAGS_LISTFILES
-           && xp->xp_context != EXPAND_USER_LIST);
+    switch (xp->xp_context)
+    {
+    case EXPAND_BOOL_SETTINGS:
+    case EXPAND_COLORS:
+    case EXPAND_COMPILER:
+    case EXPAND_DIRECTORIES:
+    case EXPAND_DIRS_IN_CDPATH:
+    case EXPAND_FILES:
+    case EXPAND_FILES_IN_PATH:
+    case EXPAND_FILETYPE:
+    case EXPAND_FILETYPECMD:
+    case EXPAND_FINDFUNC:
+    case EXPAND_HELP:
+    case EXPAND_KEYMAP:
+    case EXPAND_OLD_SETTING:
+    case EXPAND_STRING_SETTING:
+    case EXPAND_SETTING_SUBTRACT:
+    case EXPAND_OWNSYNTAX:
+    case EXPAND_PACKADD:
+    case EXPAND_RUNTIME:
+    case EXPAND_SHELLCMD:
+    case EXPAND_SHELLCMDLINE:
+    case EXPAND_TAGS:
+    case EXPAND_TAGS_LISTFILES:
+    case EXPAND_USER_LIST:
+       return FALSE;
+
+    default:
+       break;
+    }
+
+    return vim_strchr(p_wop, WOP_FUZZY) != NULL;
 }
 
 /*
@@ -3710,28 +3718,16 @@ ExpandGenericExt(
  */
     static void
 expand_shellcmd_onedir(
-       char_u          *buf,
-       char_u          *s,
-       size_t          l,
        char_u          *pat,
+       size_t          pathlen,        // length of the path portion of pat.
        char_u          ***matches,
        int             *numMatches,
        int             flags,
        hashtab_T       *ht,
        garray_T        *gap)
 {
-    int                ret;
-    hash_T     hash;
-    hashitem_T *hi;
-
-    vim_strncpy(buf, s, l);
-    add_pathsep(buf);
-    l = STRLEN(buf);
-    vim_strncpy(buf + l, pat, MAXPATHL - 1 - l);
-
     // Expand matches in one directory of $PATH.
-    ret = expand_wildcards(1, &buf, numMatches, matches, flags);
-    if (ret != OK)
+    if (expand_wildcards(1, &pat, numMatches, matches, flags) != OK)
        return;
 
     if (ga_grow(gap, *numMatches) == FAIL)
@@ -3742,17 +3738,22 @@ expand_shellcmd_onedir(
 
     for (int i = 0; i < *numMatches; ++i)
     {
-       char_u *name = (*matches)[i];
+       char_u  *name = (*matches)[i];
+       size_t  namelen = STRLEN(name);
 
-       if (STRLEN(name) > l)
+       if (namelen > pathlen)
        {
+           hash_T      hash;
+           hashitem_T  *hi;
+
            // Check if this name was already found.
-           hash = hash_hash(name + l);
-           hi = hash_lookup(ht, name + l, hash);
+           hash = hash_hash(name + pathlen);
+           hi = hash_lookup(ht, name + pathlen, hash);
            if (HASHITEM_EMPTY(hi))
            {
                // Remove the path that was prepended.
-               STRMOVE(name, name + l);
+               mch_memmove(name, name + pathlen,
+                   (size_t)(namelen - pathlen) + 1);   // +1 for NUL
                ((char_u **)gap->ga_data)[gap->ga_len++] = name;
                hash_add_item(ht, hi, name, hash);
                name = NULL;
@@ -3775,12 +3776,11 @@ expand_shellcmd(
     int                flagsarg)       // EW_ flags
 {
     char_u     *pat;
-    int                i;
+    size_t     patlen;
     char_u     *path = NULL;
     int                mustfree = FALSE;
     garray_T    ga;
     char_u     *buf;
-    size_t     l;
     char_u     *s, *e;
     int                flags = flagsarg;
     int                did_curdir = FALSE;
@@ -3791,16 +3791,31 @@ expand_shellcmd(
        return FAIL;
 
     // for ":set path=" and ":set tags=" halve backslashes for escaped space
-    pat = vim_strsave(filepat);
+    patlen = STRLEN(filepat);
+    pat = vim_strnsave(filepat, patlen);
     if (pat == NULL)
     {
        vim_free(buf);
        return FAIL;
     }
 
-    for (i = 0; pat[i]; ++i)
-       if (pat[i] == '\' && pat[i + 1] == ' ')
-           STRMOVE(pat + i, pat + i + 1);
+    // Replace "\ " with " ".
+    e = pat + patlen;
+    for (s = pat; *s != NUL; ++s)
+    {
+       char_u  *p;
+
+       if (*s != '\')
+           continue;
+
+       p = s + 1;
+       if (*p == ' ')
+       {
+           mch_memmove(s, p, (size_t)(e - p) + 1);     // +1 for NUL
+           --e;
+       }
+    }
+    patlen = (size_t)(e - pat);
 
     flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
 
@@ -3823,37 +3838,62 @@ expand_shellcmd(
     hash_init(&found_ht);
     for (s = path; ; s = e)
     {
-#if defined(MSWIN)
-       e = vim_strchr(s, ';');
-#else
-       e = vim_strchr(s, ':');
-#endif
-       if (e == NULL)
-           e = s + STRLEN(s);
+       size_t  pathlen;        // length of the path portion of buf
+                               // (including trailing slash).
+       size_t  seplen;
 
        if (*s == NUL)
        {
            if (did_curdir)
                break;
+
            // Find directories in the current directory, path is empty.
            did_curdir = TRUE;
            flags |= EW_DIR;
+
+           e = s;
+           pathlen = 0;
+           seplen = 0;
        }
-       else if (STRNCMP(s, ".", (int)(e - s)) == 0)
+       else
        {
-           did_curdir = TRUE;
-           flags |= EW_DIR;
+#if defined(MSWIN)
+           e = vim_strchr(s, ';');
+#else
+           e = vim_strchr(s, ':');
+#endif
+           if (e == NULL)
+               e = s + STRLEN(s);
+
+           pathlen = (size_t)(e - s);
+           if (STRNCMP(s, ".", pathlen) == 0)
+           {
+               did_curdir = TRUE;
+               flags |= EW_DIR;
+           }
+           else
+               // Do not match directories inside a $PATH item.
+               flags &= ~EW_DIR;
+
+           seplen = !after_pathsep(s, e) ? STRLEN_LITERAL(PATHSEPSTR) : 0;
        }
-       else
-           // Do not match directories inside a $PATH item.
-           flags &= ~EW_DIR;
 
-       l = e - s;
-       if (l > MAXPATHL - 5)
-           break;
+       if (pathlen + seplen + patlen + 1 <= MAXPATHL)
+       {
+           if (pathlen > 0)
+           {
+               vim_strncpy(buf, s, pathlen);
+               if (seplen > 0)
+               {
+                   STRCPY(buf + pathlen, PATHSEPSTR);
+                   pathlen += seplen;
+               }
+           }
+           STRCPY(buf + pathlen, pat);
 
-       expand_shellcmd_onedir(buf, s, l, pat, matches, numMatches, flags,
-                                                       &found_ht, &ga);
+           expand_shellcmd_onedir(buf, pathlen, matches, numMatches, flags,
+                                   &found_ht, &ga);
+       }
 
        if (*e != NUL)
            ++e;
@@ -4086,7 +4126,9 @@ globpath(
 {
     expand_T   xpc;
     char_u     *buf;
-    size_t     buflen;
+    size_t     pathlen;            // length of the path portion of buf
+                                   // (including trailing slash)
+    size_t     seplen;
     size_t     filelen;
 
     buf = alloc(MAXPATHL);
@@ -4098,29 +4140,35 @@ globpath(
 
     filelen = STRLEN(file);
 
+#if defined(MSWIN)
+    // Using the platform's path separator (\) makes vim incorrectly
+    // treat it as an escape character, use '/' instead.
+    #define TMP_PATHSEPSTR "/"
+#else
+    #define TMP_PATHSEPSTR PATHSEPSTR
+#endif
+
     // Loop over all entries in {path}.
     while (*path != NUL)
     {
        // Copy one item of the path to buf[] and concatenate the file name.
-       buflen = (size_t)copy_option_part(&path, buf, MAXPATHL, ",");
-       if (buflen + filelen + 2 < MAXPATHL)
+       pathlen = (size_t)copy_option_part(&path, buf, MAXPATHL, ",");
+       seplen = (*buf != NUL && !after_pathsep(buf, buf + pathlen))
+           ? STRLEN_LITERAL(TMP_PATHSEPSTR)
+           : 0;
+
+       if (pathlen + seplen + filelen + 1 <= MAXPATHL)
        {
            int     num_p;
            char_u  **p;
 
-           if (*buf != NUL && !after_pathsep(buf, buf + buflen))
+           if (seplen > 0)
            {
-#if defined(MSWIN)
-               // Using the platform's path separator (\) makes vim incorrectly
-               // treat it as an escape character, use '/' instead.
-               STRCPY(buf + buflen, "/");
-               ++buflen;
-#else
-               STRCPY(buf + buflen, PATHSEPSTR);
-               buflen += STRLEN_LITERAL(PATHSEPSTR);
-#endif
+               STRCPY(buf + pathlen, TMP_PATHSEPSTR);
+               pathlen += seplen;
            }
-           STRCPY(buf + buflen, file);
+           STRCPY(buf + pathlen, file);
+
            if (ExpandFromContext(&xpc, buf, &p, &num_p,
                             WILD_SILENT|expand_options) != FAIL && num_p > 0)
            {
@@ -4142,6 +4190,7 @@ globpath(
 
     vim_free(buf);
 }
+#undef TMP_PATHSEPSTR
 
 /*
  * Translate some keys pressed when 'wildmenu' is used.
@@ -4485,19 +4534,20 @@ f_getcompletion(typval_T *argvars, typval_T *rettv)
     }
     else
     {
-       xpc.xp_pattern = pat;
+       char_u  *pattern_start;
+
+       xpc.xp_pattern = pattern_start = pat;
        xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
        xpc.xp_line = pat;
 
        xpc.xp_context = cmdcomplete_str_to_type(type);
-       if (xpc.xp_context == EXPAND_NOTHING)
+       switch (xpc.xp_context)
        {
+       case EXPAND_NOTHING:
            semsg(_(e_invalid_argument_str), type);
            return;
-       }
 
-       if (xpc.xp_context == EXPAND_USER_DEFINED)
-       {
+       case EXPAND_USER_DEFINED:
            // Must be "custom,funcname" pattern
            if (STRNCMP(type, "custom,", 7) != 0)
            {
@@ -4506,10 +4556,9 @@ f_getcompletion(typval_T *argvars, typval_T *rettv)
            }
 
            xpc.xp_arg = type + 7;
-       }
+           break;
 
-       if (xpc.xp_context == EXPAND_USER_LIST)
-       {
+       case EXPAND_USER_LIST:
            // Must be "customlist,funcname" pattern
            if (STRNCMP(type, "customlist,", 11) != 0)
            {
@@ -4518,48 +4567,55 @@ f_getcompletion(typval_T *argvars, typval_T *rettv)
            }
 
            xpc.xp_arg = type + 11;
-       }
+           break;
 
 # if defined(FEAT_MENU)
-       if (xpc.xp_context == EXPAND_MENUS)
-       {
+       case EXPAND_MENUS:
            set_context_in_menu_cmd(&xpc, (char_u *)"menu", xpc.xp_pattern, 
FALSE);
-           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-       }
+           xpc.xp_pattern_len -= (int)(xpc.xp_pattern - pattern_start);
+           break;
 # endif
+
 # ifdef FEAT_CSCOPE
-       if (xpc.xp_context == EXPAND_CSCOPE)
-       {
+       case EXPAND_CSCOPE:
            set_context_in_cscope_cmd(&xpc, xpc.xp_pattern, CMD_cscope);
-           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-       }
+           xpc.xp_pattern_len -= (int)(xpc.xp_pattern - pattern_start);
+           break;
 # endif
+
 # ifdef FEAT_SIGNS
-       if (xpc.xp_context == EXPAND_SIGN)
-       {
+       case EXPAND_SIGN:
            set_context_in_sign_cmd(&xpc, xpc.xp_pattern);
-           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-       }
+           xpc.xp_pattern_len -= (int)(xpc.xp_pattern - pattern_start);
+           break;
 # endif
-       if (xpc.xp_context == EXPAND_RUNTIME)
-       {
+
+       case EXPAND_RUNTIME:
            set_context_in_runtime_cmd(&xpc, xpc.xp_pattern);
-           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-       }
-       if (xpc.xp_context == EXPAND_SHELLCMDLINE)
+           xpc.xp_pattern_len -= (int)(xpc.xp_pattern - pattern_start);
+           break;
+
+       case EXPAND_SHELLCMDLINE:
        {
            int context = EXPAND_SHELLCMDLINE;
            set_context_for_wildcard_arg(NULL, xpc.xp_pattern, FALSE, &xpc,
-                                                                    &context);
-           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+                                        &context);
+           xpc.xp_pattern_len -= (int)(xpc.xp_pattern - pattern_start);
+           break;
        }
-       if (xpc.xp_context == EXPAND_FILETYPECMD)
+
+       case EXPAND_FILETYPECMD:
            filetype_expand_what = EXP_FILETYPECMD_ALL;
+           break;
+
+       default:
+           break;
+       }
     }
 
     if (cmdline_fuzzy_completion_supported(&xpc))
        // when fuzzy matching, don't modify the search string
-       pat = vim_strsave(xpc.xp_pattern);
+       pat = vim_strnsave(xpc.xp_pattern, xpc.xp_pattern_len);
     else
        pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
 
@@ -4665,7 +4721,7 @@ copy_substring_from_pos(pos_T *start, pos_T *end, char_u 
**match,
     int            is_single_line = start->lnum == end->lnum;
 
     segment_len = is_single_line ? (end->col - start->col)
-                               : (int)STRLEN(start_ptr);
+                       : (int)(ml_get_len(start->lnum) - start->col);
     if (ga_grow(&ga, segment_len + 2) != OK)
        return FAIL;
 
diff --git a/src/po/vim.pot b/src/po/vim.pot
index 8c0848ceb..55da0b712 100644
--- a/src/po/vim.pot
+++ b/src/po/vim.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION
"
 "Report-Msgid-Bugs-To: 
"
-"POT-Creation-Date: 2025-07-16 19:53+0200
"
+"POT-Creation-Date: 2025-07-16 20:09+0200
"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>
"
 "Language-Team: LANGUAGE <l...@li.org>
"
@@ -340,11 +340,11 @@ msgstr ""
 msgid "Switched to clipboard method '%s'."
 msgstr ""
 
-#: ../cmdexpand.c:1352
+#: ../cmdexpand.c:1360
 msgid "tagname"
 msgstr ""
 
-#: ../cmdexpand.c:1355
+#: ../cmdexpand.c:1363
 msgid " kind file
"
 msgstr ""
 
@@ -4257,327 +4257,327 @@ msgstr ""
 msgid "%s (%s, compiled %s)"
 msgstr ""
 
-#: ../version.c:4044
+#: ../version.c:4046
 msgid ""
 "
"
 "MS-Windows ARM64 GUI/console version"
 msgstr ""
 
-#: ../version.c:4046
+#: ../version.c:4048
 msgid ""
 "
"
 "MS-Windows 64-bit GUI/console version"
 msgstr ""
 
-#: ../version.c:4049
+#: ../version.c:4051
 msgid ""
 "
"
 "MS-Windows 32-bit GUI/console version"
 msgstr ""
 
-#: ../version.c:4054
+#: ../version.c:4056
 msgid ""
 "
"
 "MS-Windows ARM64 GUI version"
 msgstr ""
 
-#: ../version.c:4056
+#: ../version.c:4058
 msgid ""
 "
"
 "MS-Windows 64-bit GUI version"
 msgstr ""
 
-#: ../version.c:4059
+#: ../version.c:4061
 msgid ""
 "
"
 "MS-Windows 32-bit GUI version"
 msgstr ""
 
-#: ../version.c:4063
+#: ../version.c:4065
 msgid " with OLE support"
 msgstr ""
 
-#: ../version.c:4068
+#: ../version.c:4070
 msgid ""
 "
"
 "MS-Windows ARM64 console version"
 msgstr ""
 
-#: ../version.c:4070
+#: ../version.c:4072
 msgid ""
 "
"
 "MS-Windows 64-bit console version"
 msgstr ""
 
-#: ../version.c:4073
+#: ../version.c:4075
 msgid ""
 "
"
 "MS-Windows 32-bit console version"
 msgstr ""
 
-#: ../version.c:4079
+#: ../version.c:4081
 msgid ""
 "
"
 "macOS version"
 msgstr ""
 
-#: ../version.c:4081
+#: ../version.c:4083
 msgid ""
 "
"
 "macOS version w/o darwin feat."
 msgstr ""
 
-#: ../version.c:4091
+#: ../version.c:4093
 msgid ""
 "
"
 "OpenVMS version"
 msgstr ""
 
-#: ../version.c:4106
+#: ../version.c:4108
 msgid ""
 "
"
 "Included patches: "
 msgstr ""
 
-#: ../version.c:4131
+#: ../version.c:4133
 msgid ""
 "
"
 "Extra patches: "
 msgstr ""
 
-#: ../version.c:4143 ../version.c:4454
+#: ../version.c:4145 ../version.c:4456
 msgid "Modified by "
 msgstr ""
 
-#: ../version.c:4150
+#: ../version.c:4152
 msgid ""
 "
"
 "Compiled "
 msgstr ""
 
-#: ../version.c:4153
+#: ../version.c:4155
 msgid "by "
 msgstr ""
 
-#: ../version.c:4165
+#: ../version.c:4167
 msgid ""
 "
"
 "Huge version "
 msgstr ""
 
-#: ../version.c:4167
+#: ../version.c:4169
 msgid ""
 "
"
 "Normal version "
 msgstr ""
 
-#: ../version.c:4169
+#: ../version.c:4171
 msgid ""
 "
"
 "Tiny version "
 msgstr ""
 
-#: ../version.c:4172
+#: ../version.c:4174
 msgid "without GUI."
 msgstr ""
 
-#: ../version.c:4175
+#: ../version.c:4177
 msgid "with GTK3 GUI."
 msgstr ""
 
-#: ../version.c:4177
+#: ../version.c:4179
 msgid "with GTK2-GNOME GUI."
 msgstr ""
 
-#: ../version.c:4179
+#: ../version.c:4181
 msgid "with GTK2 GUI."
 msgstr ""
 
-#: ../version.c:4182
+#: ../version.c:4184
 msgid "with X11-Motif GUI."
 msgstr ""
 
-#: ../version.c:4184
+#: ../version.c:4186
 msgid "with Haiku GUI."
 msgstr ""
 
-#: ../version.c:4186
+#: ../version.c:4188
 msgid "with Photon GUI."
 msgstr ""
 
-#: ../version.c:4188
+#: ../version.c:4190
 msgid "with GUI."
 msgstr ""
 
-#: ../version.c:4190
+#: ../version.c:4192
 msgid "  Features included (+) or not (-):
"
 msgstr ""
 
-#: ../version.c:4197
+#: ../version.c:4199
 msgid "   system vimrc file: \""
 msgstr ""
 
-#: ../version.c:4202
+#: ../version.c:4204
 msgid "     user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4207
+#: ../version.c:4209
 msgid " 2nd user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4212 ../version.c:4219 ../version.c:4223
+#: ../version.c:4214 ../version.c:4221 ../version.c:4225
 msgid " 3rd user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4215
+#: ../version.c:4217
 msgid " 4th user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4228
+#: ../version.c:4230
 msgid "      user exrc file: \""
 msgstr ""
 
-#: ../version.c:4233
+#: ../version.c:4235
 msgid "  2nd user exrc file: \""
 msgstr ""
 
-#: ../version.c:4239
+#: ../version.c:4241
 msgid "  system gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4243
+#: ../version.c:4245
 msgid "    user gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4247
+#: ../version.c:4249
 msgid "2nd user gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4252
+#: ../version.c:4254
 msgid "3rd user gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4257
+#: ../version.c:4259
 msgid "       defaults file: \""
 msgstr ""
 
-#: ../version.c:4262
+#: ../version.c:4264
 msgid "    system menu file: \""
 msgstr ""
 
-#: ../version.c:4270
+#: ../version.c:4272
 msgid "  fall-back for $VIM: \""
 msgstr ""
 
-#: ../version.c:4276
+#: ../version.c:4278
 msgid " f-b for $VIMRUNTIME: \""
 msgstr ""
 
-#: ../version.c:4280
+#: ../version.c:4282
 msgid "Compilation: "
 msgstr ""
 
-#: ../version.c:4286
+#: ../version.c:4288
 msgid "Compiler: "
 msgstr ""
 
-#: ../version.c:4291
+#: ../version.c:4293
 msgid "Linking: "
 msgstr ""
 
-#: ../version.c:4296
+#: ../version.c:4298
 msgid "  DEBUG BUILD"
 msgstr ""
 
-#: ../version.c:4332
+#: ../version.c:4334
 msgid "VIM - Vi IMproved"
 msgstr ""
 
-#: ../version.c:4334
+#: ../version.c:4336
 msgid "version "
 msgstr ""
 
-#: ../version.c:4335
+#: ../version.c:4337
 msgid "by Bram Moolenaar et al."
 msgstr ""
 
-#: ../version.c:4339
+#: ../version.c:4341
 msgid "Vim is open source and freely distributable"
 msgstr ""
 
-#: ../version.c:4341
+#: ../version.c:4343
 msgid "Help poor children in Uganda!"
 msgstr ""
 
-#: ../version.c:4342
+#: ../version.c:4344
 msgid "type  :help iccf<Enter>       for information "
 msgstr ""
 
-#: ../version.c:4344
+#: ../version.c:4346
 msgid "type  :q<Enter>               to exit         "
 msgstr ""
 
-#: ../version.c:4345
+#: ../version.c:4347
 msgid "type  :help<Enter>  or  <F1>  for on-line help"
 msgstr ""
 
-#: ../version.c:4346
+#: ../version.c:4348
 msgid "type  :help version9<Enter>   for version info"
 msgstr ""
 
-#: ../version.c:4349
+#: ../version.c:4351
 msgid "Running in Vi compatible mode"
 msgstr ""
 
-#: ../version.c:4350
+#: ../version.c:4352
 msgid "type  :set nocp<Enter>        for Vim defaults"
 msgstr ""
 
-#: ../version.c:4351
+#: ../version.c:4353
 msgid "type  :help cp-default<Enter> for info on this"
 msgstr ""
 
-#: ../version.c:4366
+#: ../version.c:4368
 msgid "menu  Help->Orphans           for information    "
 msgstr ""
 
-#: ../version.c:4368
+#: ../version.c:4370
 msgid "Running modeless, typed text is inserted"
 msgstr ""
 
-#: ../version.c:4369
+#: ../version.c:4371
 msgid "menu  Edit->Global Settings->Toggle Insert Mode  "
 msgstr ""
 
-#: ../version.c:4370
+#: ../version.c:4372
 msgid "                              for two modes      "
 msgstr ""
 
-#: ../version.c:4374
+#: ../version.c:4376
 msgid "menu  Edit->Global Settings->Toggle Vi Compatible"
 msgstr ""
 
-#: ../version.c:4375
+#: ../version.c:4377
 msgid "                              for Vim defaults   "
 msgstr ""
 
-#: ../version.c:4416
+#: ../version.c:4418
 msgid "Sponsor Vim development!"
 msgstr ""
 
-#: ../version.c:4417
+#: ../version.c:4419
 msgid "Become a registered Vim user!"
 msgstr ""
 
-#: ../version.c:4420
+#: ../version.c:4422
 msgid "type  :help sponsor<Enter>    for information "
 msgstr ""
 
-#: ../version.c:4421
+#: ../version.c:4423
 msgid "type  :help register<Enter>   for information "
 msgstr ""
 
-#: ../version.c:4423
+#: ../version.c:4425
 msgid "menu  Help->Sponsor/Register  for information    "
 msgstr ""
 
diff --git a/src/version.c b/src/version.c
index 31263512a..4120e910f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1556,
 /**/
     1555,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1uc6el-009cAe-7f%40256bit.org.

Raspunde prin e-mail lui