diff options
author | Bram Moolenaar <bram@vim.org> | 2011-08-17 15:23:23 +0200 |
---|---|---|
committer | Bram Moolenaar <bram@vim.org> | 2011-08-17 15:23:23 +0200 |
commit | fd9692257dd4385574940959d6300c33d88de4d5 (patch) | |
tree | dbb3a762739174bedabbb745efe52fa8618f593e | |
parent | a545c54c8b745c1b32142a287d8a6fccfc3681b1 (diff) | |
download | vim-fd9692257dd4385574940959d6300c33d88de4d5.tar.gz |
Problem: After using "expand('%:8')" the buffer name is changed.
Solution: Make a copy of the file name before shortening it.
-rw-r--r-- | src/eval.c | 24 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 14 insertions, 12 deletions
@@ -23205,6 +23205,7 @@ modify_fname(src, usedlen, fnamep, bufp, fnamelen) int c; int has_fullname = 0; #ifdef WIN3264 + char_u *fname_start = *fnamep; int has_shortname = 0; #endif @@ -23379,24 +23380,25 @@ repeat: } #ifdef WIN3264 - /* Check shortname after we have done 'heads' and before we do 'tails' + /* + * Handle ":8" after we have done 'heads' and before we do 'tails'. */ if (has_shortname) { - pbuf = NULL; - /* Copy the string if it is shortened by :h */ - if (*fnamelen < (int)STRLEN(*fnamep)) + /* Copy the string if it is shortened by :h and when it wasn't copied + * yet, because we are going to change it in place. Avoids changing + * the buffer name for "%:8". */ + if (*fnamelen < (int)STRLEN(*fnamep) || *fnamep == fname_start) { p = vim_strnsave(*fnamep, *fnamelen); - if (p == 0) + if (p == NULL) return -1; vim_free(*bufp); *bufp = *fnamep = p; } /* Split into two implementations - makes it easier. First is where - * there isn't a full name already, second is where there is. - */ + * there isn't a full name already, second is where there is. */ if (!has_fullname && !vim_isAbsName(*fnamep)) { if (shortpath_for_partial(fnamep, bufp, fnamelen) == FAIL) @@ -23404,18 +23406,16 @@ repeat: } else { - int l; + int l = *fnamelen; - /* Simple case, already have the full-name + /* Simple case, already have the full-name. * Nearly always shorter, so try first time. */ - l = *fnamelen; if (get_short_pathname(fnamep, bufp, &l) == FAIL) return -1; if (l == 0) { - /* Couldn't find the filename.. search the paths. - */ + /* Couldn't find the filename, search the paths. */ l = *fnamelen; if (shortpath_for_invalid_fname(fnamep, bufp, &l) == FAIL) return -1; diff --git a/src/version.c b/src/version.c index 13303769..35a5479d 100644 --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 281, +/**/ 280, /**/ 279, |